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(¬eidalloc);
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();