~kris/9p

9hist

e4edfca1070c9219208af7b253532a9e10c8351a — David du Colombier 36 years ago fc3f92f
Plan 9 from Bell Labs 1990-07-26
8 files changed, 41 insertions(+), 95 deletions(-)

M gnot/devdk.c
M gnot/devmnt.c
M gnot/errno.h
M gnot/proc.c
M gnot/sturp.c
M port/devbit.c
M port/proc.c
M port/sturp.c
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)