~kris/9p

9hist

dd4068095b04c9b14ff6ce697a8296d6089b2085 — David du Colombier 32 years ago af346b0
Plan 9 from Bell Labs 1994-08-12
11 files changed, 110 insertions(+), 69 deletions(-)

M carrera/main.c
M pc/devvga.c
M pc/main.c
M pc/trap.c
M port/alloc.c
M port/chan.c
M port/pgrp.c
M port/portdat.h
M port/portfns.h
M port/proc.c
M port/sysproc.c
M carrera/main.c => carrera/main.c +1 -0
@@ 359,6 359,7 @@ userinit(void)
	p->egrp->ref = 1;
	p->fgrp = smalloc(sizeof(Fgrp));
	p->fgrp->ref = 1;
	p->rgrp = newrgrp();
	p->procmode = 0640;

	strcpy(p->text, "*init*");

M pc/devvga.c => pc/devvga.c +2 -2
@@ 625,7 625,7 @@ setscreen(int maxx, int maxy, int ldepth)
	h = defont0.height;
	w = defont0.info[' '].width;
	window.min = Pt(48, 48);
	window.max = add(window.min, Pt(10+w*64, 36*h));
	window.max = add(window.min, Pt(10+w*80, 50*h));
	if(window.max.y >= gscreen.r.max.y)
		window.max.y = gscreen.r.max.y-1;
	if(window.max.x >= gscreen.r.max.x)


@@ 635,7 635,7 @@ setscreen(int maxx, int maxy, int ldepth)

	/* work areas change when dimensions change */
	workinit(&chwork, w, h);
	workinit(&scrollwork, 64*w, 1);
	workinit(&scrollwork, 80*w, 1);
	workinit(&scrollwork, Dx(window), 1);
	cursorinit();


M pc/main.c => pc/main.c +1 -0
@@ 150,6 150,7 @@ userinit(void)
	p->egrp->ref = 1;
	p->fgrp = smalloc(sizeof(Fgrp));
	p->fgrp->ref = 1;
	p->rgrp = newrgrp();
	p->procmode = 0640;

	strcpy(p->text, "*init*");

M pc/trap.c => pc/trap.c +1 -1
@@ 359,7 359,7 @@ dumpstack(void)
		return;

	i = 0;
	lim = 3;
	lim = 6;
	for(l=(ulong)&l; l<(ulong)(up->kstack+BY2PG) && lim; l+=4){
		v = *(ulong*)l;
		if(KTZERO < v && v < (ulong)&etext){

M port/alloc.c => port/alloc.c +6 -0
@@ 322,6 322,12 @@ good:
}

void*
malloc(ulong size)
{
	return mallocz(size, 1);
}

void*
smalloc(ulong size)
{
	char *s;

M port/chan.c => port/chan.c +1 -1
@@ 130,7 130,7 @@ chanfree(Chan *c)
void
close(Chan *c)
{
	if(c->flag&CFREE)
	if(c == 0 || (c->flag&CFREE))
		panic("close");

	if(decref(c))

M port/pgrp.c => port/pgrp.c +17 -0
@@ 50,6 50,23 @@ newpgrp(void)
	return p;
}

Rgrp*
newrgrp(void)
{
	Rgrp *r;

	r = smalloc(sizeof(Rgrp));
	r->ref = 1;
	return r;
}

void
closergrp(Rgrp *r)
{
	if(decref(r) == 0)
		free(r);
}

void
closepgrp(Pgrp *p)
{

M port/portdat.h => port/portdat.h +9 -2
@@ 29,6 29,7 @@ typedef struct QLock	QLock;
typedef struct Queue	Queue;
typedef struct Ref	Ref;
typedef struct Rendez	Rendez;
typedef struct Rgrp	Rgrp;
typedef struct RWlock	RWlock;
typedef struct Sargs	Sargs;
typedef struct Schedq	Schedq;


@@ 389,12 390,16 @@ enum
struct Pgrp
{
	Ref;				/* also used as a lock when mounting */
	Pgrp	*next;			/* free list */
	ulong	pgrpid;
	QLock	debug;			/* single access via devproc.c */
	RWlock	ns;			/* Namespace n read/one write lock */
	QLock	nsh;
	Mhead	*mnthash[MNTHASH];
};

struct Rgrp
{
	Ref;
	Proc	*rendhash[RENDHASH];	/* Rendezvous tag hash */
};



@@ 456,7 461,8 @@ enum
	RFNOWAIT	= (1<<6),
	RFCNAMEG	= (1<<10),
	RFCENVG		= (1<<11),
	RFCFDG		= (1<<12)
	RFCFDG		= (1<<12),
	RFREND		= (1<<13),
};

/*


@@ 528,6 534,7 @@ struct Proc
	Pgrp	*pgrp;		/* Process group for namespace */
	Egrp 	*egrp;		/* Environment group */
	Fgrp	*fgrp;		/* File descriptor group */
	Rgrp	*rgrp;		/* Rendez group */

	ulong	parentpid;
	ulong	time[6];	/* User, Sys, Real; child U, S, R */

M port/portfns.h => port/portfns.h +3 -1
@@ 33,6 33,7 @@ void		closeegrp(Egrp*);
void		closefgrp(Fgrp*);
void		closemount(Mount*);
void		closepgrp(Pgrp*);
void		closergrp(Rgrp*);
long		clrfpintr(void);
void		confinit(void);
void		confinit1(int);


@@ 122,8 123,8 @@ void		lockinit(void);
Page*		lookpage(Image*, ulong);
int		m3mouseputc(void*, int);
void		machinit(void);
#define		malloc(s)	mallocz(s, 1)
void*		mallocz(ulong, int);
void*		malloc(ulong);
void		mfreeseg(Segment*, ulong, int);
void		mmurelease(Proc*);
void		mmuswitch(Proc*);


@@ 145,6 146,7 @@ Chan*		newchan(void);
Mount*		newmount(Mhead*, Chan*, int, char*);
Page*		newpage(int, Segment **, ulong);
Pgrp*		newpgrp(void);
Rgrp*		newrgrp(void);
Proc*		newproc(void);
char*		nextelem(char*, char*);
void		nexterror(void);

M port/proc.c => port/proc.c +7 -11
@@ 257,6 257,7 @@ newproc(void)
	p->pgrp = 0;
	p->egrp = 0;
	p->fgrp = 0;
	p->rgrp = 0;
	p->pdbg = 0;
	p->fpstate = FPinit;
	p->kp = 0;


@@ 356,7 357,7 @@ tfn(void *arg)
void
tsleep(Rendez *r, int (*fn)(void*), void *arg, int ms)
{
	ulong when, i;
	ulong when;
	Proc *f, **l;

	when = MS2TK(ms)+MACHP(0)->ticks;


@@ 364,7 365,6 @@ tsleep(Rendez *r, int (*fn)(void*), void *arg, int ms)
	lock(&talarm);
	/* take out of list if checkalarm didn't */
	if(up->trend) {
i = 0;
		l = &talarm.list;
		for(f = *l; f; f = f->tlink) {
			if(f == up) {


@@ 372,12 372,6 @@ i = 0;
				break;
			}
			l = &f->tlink;
if(i++ > 20) {
	print("tlarm loop: %lux\n", talarm.list);
	for(i = 20, f = talarm.list; f && i--; f = f->tlink)
		print("%lux ", f);
		for(;;);
}
		}
	}
	/* insert in increasing time order */


@@ 468,10 462,10 @@ postnote(Proc *p, int dolock, char *n, int flag)
		return ret;

	/* Try and pull out of a rendezvous */
	lock(p->pgrp);
	lock(p->rgrp);
	if(p->state == Rendezvous) {
		p->rendval = ~0;
		l = &REND(p->pgrp, p->rendtag);
		l = &REND(p->rgrp, p->rendtag);
		for(d = *l; d; d = d->rendhash) {
			if(d == p) {
				*l = p->rendhash;


@@ 481,7 475,7 @@ postnote(Proc *p, int dolock, char *n, int flag)
		}
		ready(p);
	}
	unlock(p->pgrp);
	unlock(p->rgrp);
	return ret;
}



@@ 561,6 555,8 @@ pexit(char *exitstr, int freemem)
		closefgrp(up->fgrp);
	if(up->egrp)
		closeegrp(up->egrp);
	if(up->rgrp)
		closergrp(up->rgrp);

	close(up->dot);
	closepgrp(up->pgrp);

M port/sysproc.c => port/sysproc.c +62 -51
@@ 63,6 63,10 @@ sysrfork(ulong *arg)
			up->noteid = incref(&noteidalloc);
		if(flag & (RFMEM|RFNOWAIT))
			error(Ebadarg);
		if(flag & RFREND) {
			closergrp(up->rgrp);
			up->rgrp = newrgrp();
		}
		return 0;
	}
	/* Check flags before we commit */


@@ 122,6 126,15 @@ sysrfork(ulong *arg)
		incref(p->pgrp);
	}

	if(flag & RFREND) {
		closergrp(up->rgrp);
		up->rgrp = newrgrp();
	}
	else {
		incref(up->rgrp);
		p->rgrp = up->rgrp;
	}

	/* Environment group */
	if(flag & (RFENVG|RFCENVG)) {
		p->egrp = smalloc(sizeof(Egrp));


@@ 202,55 215,52 @@ sysexec(ulong *arg)
	validaddr(arg[0], 1, 0);
	file = (char*)arg[0];
	indir = 0;
    Header:
	tc = namec(file, Aopen, OEXEC, 0);
	if(waserror()){
	for(;;){
		tc = namec(file, Aopen, OEXEC, 0);
		if(waserror()){
			close(tc);
			nexterror();
		}
		if(!indir)
			strcpy(elem, up->elem);
	
		n = (*devtab[tc->type].read)(tc, &exec, sizeof(Exec), 0);
		if(n < 2)
			error(Ebadexec);
		magic = l2be(exec.magic);
		text = l2be(exec.text);
		entry = l2be(exec.entry);
		if(n==sizeof(Exec) && (magic == AOUT_MAGIC)){
			if((text&KZERO)
			|| entry < UTZERO+sizeof(Exec)
			|| entry >= UTZERO+sizeof(Exec)+text)
				error(Ebadexec);
			break; /* for binary */
		}
	
		/*
		 * Process #! /bin/sh args ...
		 */
		memmove(line, &exec, sizeof(Exec));
		if(indir || line[0]!='#' || line[1]!='!')
			error(Ebadexec);
		n = shargs(line, n, progarg);
		if(n == 0)
			error(Ebadexec);
		indir = 1;
		/*
		 * First arg becomes complete file name
		 */
		progarg[n++] = file;
		progarg[n] = 0;
		validaddr(arg[1], BY2WD, 1);
		arg[1] += BY2WD;
		file = progarg[0];
		progarg[0] = elem;
		poperror();
		close(tc);
		nexterror();
	}
	if(!indir)
		strcpy(elem, up->elem);

	n = (*devtab[tc->type].read)(tc, &exec, sizeof(Exec), 0);
	if(n < 2)
    Err:
		error(Ebadexec);
	magic = l2be(exec.magic);
	text = l2be(exec.text);
	entry = l2be(exec.entry);
	if(n==sizeof(Exec) && (magic == AOUT_MAGIC)){
		if((text&KZERO)
		|| entry < UTZERO+sizeof(Exec)
		|| entry >= UTZERO+sizeof(Exec)+text)
			goto Err;
		goto Binary;
	}

	/*
	 * Process #! /bin/sh args ...
	 */
	memmove(line, &exec, sizeof(Exec));
	if(indir || line[0]!='#' || line[1]!='!')
		goto Err;
	n = shargs(line, n, progarg);
	if(n == 0)
		goto Err;
	indir = 1;
	/*
	 * First arg becomes complete file name
	 */
	progarg[n++] = file;
	progarg[n] = 0;
	validaddr(arg[1], BY2WD, 1);
	arg[1] += BY2WD;
	file = progarg[0];
	progarg[0] = elem;
	poperror();
	close(tc);
	goto Header;

    Binary:
	poperror();
	data = l2be(exec.data);
	bss = l2be(exec.bss);
	t = (UTZERO+sizeof(Exec)+text+(BY2PG-1)) & ~(BY2PG-1);


@@ 328,7 338,7 @@ sysexec(ulong *arg)
	/*
	 * Committed.
	 * Free old memory.
	 * Special segments are maintained accross exec
	 * Special segments are maintained across exec
	 */
	for(i = SSEG; i <= BSEG; i++) {
		putseg(up->seg[i]);


@@ 391,6 401,7 @@ sysexec(ulong *arg)
	else
		up->basepri = 1;
	up->priority = up->basepri;
	poperror();
	close(tc);

	/*


@@ 644,9 655,9 @@ sysrendezvous(ulong *arg)
	Proc *p, **l;

	tag = arg[0];
	l = &REND(up->pgrp, tag);
	l = &REND(up->rgrp, tag);

	lock(up->pgrp);
	lock(up->rgrp);
	for(p = *l; p; p = p->rendhash) {
		if(p->rendtag == tag) {
			*l = p->rendhash;


@@ 656,7 667,7 @@ sysrendezvous(ulong *arg)
			while(p->mach != 0)
				;
			ready(p);
			unlock(up->pgrp);
			unlock(up->rgrp);
			return val;	
		}
		l = &p->rendhash;


@@ 668,7 679,7 @@ sysrendezvous(ulong *arg)
	up->rendhash = *l;
	*l = up;
	up->state = Rendezvous;
	unlock(up->pgrp);
	unlock(up->rgrp);

	sched();