M pc/clock.c => pc/clock.c +2 -0
@@ 87,10 87,12 @@ clock(Ureg *ur)
else
sched();
}
+#ifdef asdf
if((ur->cs&0xffff) == UESEL){
spllo(); /* in case we fault */
(*(ulong*)(USTKTOP-BY2WD)) += TK2MS(1); /* profiling clock */
splhi();
}
+#endif asdf
}
}
M port/devcons.c => port/devcons.c +8 -8
@@ 679,7 679,7 @@ conswrite(Chan *c, void *va, long n, ulong offset)
{
char cbuf[64];
char buf[256];
- long l, m;
+ long l, bp;
char *a = va;
Mach *mp;
int id, fd;
@@ 693,13 693,13 @@ conswrite(Chan *c, void *va, long n, ulong offset)
*/
l = n;
while(l > 0){
- m = l;
- if(m > sizeof buf)
- m = sizeof buf;
- memmove(buf, a, m);
- putstrn(a, m);
- a += m;
- l -= m;
+ bp = l;
+ if(bp > sizeof buf)
+ bp = sizeof buf;
+ memmove(buf, a, bp);
+ putstrn(a, bp);
+ a += bp;
+ l -= bp;
}
break;
M port/devdk.c => port/devdk.c +30 -14
@@ 106,14 106,17 @@ struct Line {
* dkmux line discipline is pushed onto.
*/
struct Dk {
+ QLock;
+ Chan *csc;
+
Lock;
int opened;
+
char name[64]; /* dk name */
Queue *wq; /* dk output queue */
Stream *s;
- int lines; /* number of lines */
int ncsc; /* csc line number */
- Chan *csc;
+ int lines; /* number of lines */
Line **linep;
int restart;
int urpwindow;
@@ 123,7 126,7 @@ struct Dk {
Network net;
Netprot *prot;
- Block *alloc;
+ Block *alloc; /* blocks containing Line structs */
};
static Dk *dk;
static Lock dklock;
@@ 179,6 182,7 @@ extern Qinfo urpinfo;
Chan* dkattach(char*);
static void dkmuxconfig(Queue*, Block*);
static Chan* dkopenline(Dk*, int);
+static Chan* dkopencsc(Dk*);
static int dkmesg(Chan*, int, int, int, int);
static void dkcsckproc(void*);
static void dkanswer(Chan*, int, int);
@@ 504,7 508,7 @@ dkstclose(Queue *q)
close(c);
goto out;
}
- c = dkopenline(dp, dp->ncsc);
+ c = dkopencsc(dp);
/*
* shake hands with dk
@@ 536,8 540,11 @@ dkstclose(Queue *q)
out:
qlock(lp);
lp->rq = 0;
- netdisown(&dp->net, lp->lineno);
qunlock(lp);
+
+ if(lp->lineno == dp->ncsc)
+ dp->csc = 0;
+ netdisown(&dp->net, lp->lineno);
}
/*
@@ 672,7 679,7 @@ dkmuxconfig(Queue *q, Block *bp)
* all fighting for it at once.
*/
dp->closeall = 0;
- dp->csc = dkopenline(dp, dp->ncsc);
+ dkopencsc(dp);
/*
* start a process to listen to csc messages
@@ 873,9 880,6 @@ dkcloneline(Chan *c)
error(Enodev);
}
-/*
- * open the common signalling channel
- */
static Chan*
dkopenline(Dk *dp, int line)
{
@@ 896,6 900,21 @@ dkopenline(Dk *dp, int line)
}
/*
+ * open the common signalling channel
+ */
+static Chan*
+dkopencsc(Dk *dp)
+{
+ qlock(dp);
+ if(dp->csc == 0)
+ dp->csc = dkopenline(dp, dp->ncsc);
+ else
+ incref(dp->csc);
+ qunlock(dp);
+ return dp->csc;
+}
+
+/*
* return the contents of the info files
*/
void
@@ 1037,7 1056,7 @@ dkcall(int type, Chan *c, char *addr, char *nuser, char *machine)
* tell the controller we want to make a call
*/
DPRINT("dialout\n");
- csc = dkopenline(dp, dp->ncsc);
+ csc = dkopencsc(dp);
if(waserror()){
close(csc);
nexterror();
@@ 1610,10 1629,7 @@ dktimer(void *a)
return;
}
- /*
- * open csc
- */
- c = dkopenline(dp, dp->ncsc);
+ c = dkopencsc(dp);
for(;;){
if(dp->opened==0)
M port/devproc.c => port/devproc.c +1 -1
@@ 426,7 426,7 @@ procwrite(Chan *c, void *va, long n, ulong offset)
case Qnote:
if(p->kp)
- errors("can' t note kproc");
+ errors("can't note kproc");
k = kmap(p->upage);
up = (User*)VA(k);
if(up->p != p){
M port/net.c => port/net.c +2 -2
@@ 180,8 180,6 @@ netopen(Chan *c, int omode, Network *np)
case Sdataqid:
case Sctlqid:
id = STREAMID(c->qid.path);
- if(netown(np, id, u->p->user, omode&7) < 0)
- error(Eperm);
break;
case Qlisten:
streamopen(c, np->devp);
@@ 203,6 201,8 @@ netopen(Chan *c, int omode, Network *np)
streamopen(c, np->devp);
if(np->protop && c->stream->devq->next->info != np->protop)
pushq(c->stream, np->protop);
+ if(netown(np, id, u->p->user, omode&7) < 0)
+ error(Eperm);
break;
}
}