M gnot/devdk.c => gnot/devdk.c +3 -6
@@ 456,7 456,6 @@ dkmuxconfig(Dk *dp, Block *bp)
*/
dp->restart = 1;
n = getfields((char *)bp->rptr, fields, 4, ' ');
- strcpy(dp->name, "dk");
switch(n){
case 4:
strncpy(dp->name, fields[3], sizeof(dp->name));
@@ 495,7 494,7 @@ dkmuxconfig(Dk *dp, Block *bp)
/*
* start a process to deal with it
*/
- sprint(buf, "csckproc%d", dp->ncsc);
+ sprint(buf, "**csckproc%d**", dp->ncsc);
kproc(buf, dkcsckproc, dp);
poperror();
@@ 504,7 503,7 @@ dkmuxconfig(Dk *dp, Block *bp)
*/
if(dktimeron == 0){
dktimeron = 1;
- kproc("dktimer", dktimer, 0);
+ kproc("**dktimer**", dktimer, 0);
}
}
@@ 593,10 592,8 @@ dkattach(char *spec)
Dk *dp;
/*
- * find a multiplexor with the same name (default dk)
+ * find a multiplexor with the same name
*/
- if(*spec == 0)
- spec = "dk";
for(dp = dk; dp < &dk[Ndk]; dp++){
qlock(dp);
if(dp->wq && strcmp(spec, dp->name)==0) {
M gnot/devmnt.c => gnot/devmnt.c +1 -0
@@ 291,6 291,7 @@ mntattach(char *spec)
mh = mhalloc();
if(waserror()){
mhfree(mh);
+ mqfree(q);
close(c);
nexterror();
}
M gnot/errno.h => gnot/errno.h +0 -1
@@ 50,7 50,6 @@ enum{
Enobitmap, /* out of bitmap descriptors */
Enobitstore, /* out of bitmap storage */
Ebadbitmap, /* unallocated bitmap */
- Ebadfont, /* unallocated font */
Eshortmsg, /* short message */
Ebadmsg, /* format error or mismatch in message */
Ebadcnt, /* read count greater than requested */
M gnot/proc.c => gnot/proc.c +3 -8
@@ 575,7 575,6 @@ kproc(char *name, void (*func)(void *), void *arg)
int lastvar; /* used to compute stack address */
User *up;
KMap *k;
- static Pgrp *kpgrp;
/*
* Kernel stack
@@ 613,16 612,12 @@ kproc(char *name, void (*func)(void *), void *arg)
p->mach = m;
m->proc = p;
spllo();
+ strncpy(p->text, name, sizeof p->text);
(*func)(arg);
pexit(0, 1);
}
- if(kpgrp == 0){
- kpgrp = newpgrp();
- strcpy(kpgrp->user, "bootes");
- }
- p->pgrp = kpgrp;
- incref(kpgrp);
- sprint(p->text, "%s.%.6s", name, u->p->pgrp->user);
+ p->pgrp = u->p->pgrp;
+ incref(p->pgrp);
p->nchild = 0;
p->parent = 0;
memset(p->time, 0, sizeof(p->time));
M gnot/sturp.c => gnot/sturp.c +30 -78
@@ 11,7 11,7 @@ enum {
Nmask= 0x7,
};
-#define DPRINT /*if(q->flag&QDEBUG)kprint*/
+#define DPRINT if(q->flag&QDEBUG)kprint
typedef struct Urp Urp;
@@ 68,12 68,6 @@ struct Urp {
#define NEXT(x) (((x)+1)&Nmask)
/*
- * Alarm for urptiming
- */
-Alarm *urptiming;
-Lock urptlock;
-
-/*
* Protocol control bytes
*/
#define SEQ 0010 /* sequence number, ends trailers */
@@ 122,7 116,6 @@ static void sendrej(Urp*);
static void initoutput(Urp*, int);
static void initinput(Urp*, int);
static void urpkproc(void *arg);
-static void urptimer(Alarm*);
static void urpvomit(char*, Urp*);
Qinfo urpinfo = { urpciput, urpoput, urpopen, urpclose, "urp" };
@@ 167,18 160,10 @@ urpopen(Queue *q, Stream *s)
/*
* start the ack/(re)xmit process
*/
- sprint(name, "urp%d", up - urp);
- kproc(name, urpkproc, up);
-
- /*
- * start the urptimer if it isn't already
- */
- if(urptiming==0){
- if(canlock(&urptlock)){
- if(urptiming == 0)
- urptiming = alarm(500, urptimer, 0);
- unlock(&urptlock);
- }
+ if(up->kstarted == 0){
+ up->kstarted = 1;
+ sprint(name, "**urp%d**", up - urp);
+ kproc(name, urpkproc, up);
}
}
@@ 186,14 171,6 @@ urpopen(Queue *q, Stream *s)
* Shut down the connection and kill off the kernel process
*/
static int
-isdead(void *a)
-{
- Urp *up;
-
- up = (Urp *)a;
- return up->kstarted==0;
-}
-static int
isflushed(void *a)
{
Urp *up;
@@ 222,7 199,7 @@ urpclose(Queue *q)
tsleep(&up->r, isflushed, up, 2*60*1000);
/*
- * tell kernel process to die
+ * kill off the kernel process
*/
up->state |= HUNGUP;
wakeup(&up->rq->r);
@@ 246,13 223,10 @@ urpclose(Queue *q)
}
qunlock(&up->xmit);
- /*
- * wait for kernel process to die
- */
- while(up->kstarted)
- sleep(&up->r, isdead, up);
-
- up->state = 0;
+ if(up->kstarted == 0){
+ DPRINT("urpclose %ux\n", up);
+ up->state = 0;
+ }
}
/*
@@ 615,17 589,6 @@ output(Urp *up)
int n;
int i;
- /*
- * start the urptimer if it isn't already
- */
- if(urptiming==0){
- if(canlock(&urptlock)){
- if(urptiming == 0)
- urptiming = alarm(500, urptimer, 0);
- unlock(&urptlock);
- }
- }
-
if(!canqlock(&up->xmit))
return;
@@ 644,7 607,9 @@ output(Urp *up)
sendctl(up, INIT1);
up->timer = now + MSrexmit;
}
- goto out;
+ qunlock(&up->xmit);
+ poperror();
+ return;
}
/*
@@ 688,7 653,9 @@ output(Urp *up)
up->timer = NOW + MSrexmit;
up->state &= ~REJECTING;
sendctl(up, ENQ);
- goto out;
+ qunlock(&up->xmit);
+ poperror();
+ return;
}
/*
@@ 709,7 676,6 @@ output(Urp *up)
up->next = NEXT(up->next);
poperror();
}
-out:
qunlock(&up->xmit);
poperror();
}
@@ 975,54 941,40 @@ todo(void *arg)
static void
urpkproc(void *arg)
{
- Urp *up;
+ Urp *up; Queue *q;
up = (Urp *)arg;
- up->kstarted = 1;
+ q = up->wq;
if(waserror()){
print("urpkproc error %ux\n", up);
+ up->state = 0;
up->kstarted = 0;
wakeup(&up->r);
return;
}
for(;;){
- if(up->state & HUNGUP)
+ if(up->state & (HUNGUP|CLOSING)){
+ if(isflushed(up))
+ wakeup(&up->r);
+ if(up->state & HUNGUP)
+ break;
+ }
+ if(up->state == 0){
+ DPRINT("urpkproc: %ux->state == 0\n", up);
break;
+ }
if(!QFULL(up->rq->next))
sendack(up);
output(up);
- sleep(&up->rq->r, todo, up);
+ tsleep(&up->rq->r, todo, up, MSrexmit/2);
}
+ up->state = 0;
up->kstarted = 0;
- wakeup(&up->r);
- poperror();
DPRINT("urpkproc %ux\n", up);
}
/*
- * timer to wakeup urpkproc's for retransmissions
- */
-static void
-urptimer(Alarm *a)
-{
- Urp *up;
- Urp *last;
- Queue *q;
-
- urptiming = 0;
- for(up = urp, last = &urp[conf.nurp]; up < last; up++){
- if(up->state==0)
- continue;
- if(up->unacked!=up->next && NOW>up->timer){
- q = up->rq;
- if(q)
- wakeup(&q->r);
- }
- }
-}
-
-/*
* urp got very confused, complain
*/
static void
M port/devbit.c => port/devbit.c +2 -2
@@ 61,7 61,7 @@ struct{
Cursor arrow =
{
- {1, 1},
+ {0, 0},
{0xFF, 0xE0, 0xFF, 0xE0, 0xFF, 0xC0, 0xFF, 0x00,
0xFF, 0x00, 0xFF, 0x80, 0xFF, 0xC0, 0xFF, 0xE0,
0xE7, 0xF0, 0xE3, 0xF8, 0xC1, 0xFC, 0x00, 0xFE,
@@ 657,7 657,7 @@ bitwrite(Chan *c, void *va, long n)
v = GSHORT(p+1);
f = &bit.font[v];
if(v<0 || v>=conf.nfont || f->bits==0)
- error(0, Ebadfont);
+ error(0, Ebadbitmap);
f->bits = 0;
m -= 3;
p += 3;
M port/proc.c => port/proc.c +1 -0
@@ 299,6 299,7 @@ void
twakeme(Alarm *a)
{
wakeup((Rendez*)(a->arg));
+ cancel(a);
}
int
M port/sturp.c => port/sturp.c +1 -0
@@ 1013,6 1013,7 @@ urptimer(Alarm *a)
Urp *last;
Queue *q;
+ cancel(a);
urptiming = 0;
for(up = urp, last = &urp[conf.nurp]; up < last; up++){
if(up->state==0)