M gnot/chan.c => gnot/chan.c +21 -2
@@ 96,11 96,14 @@ loop:
void
close(Chan *c)
{
+ if(c->flag & CFREE)
+ panic("close");
if(decref(c) == 0){
if(!waserror()){
(*devtab[c->type].close)(c);
poperror();
}
+ c->flag = CFREE;
lock(&chanalloc);
c->next = chanalloc.free;
chanalloc.free = c;
@@ 369,11 372,21 @@ walk(Chan *ac, char *name, int domnt)
if(name[0]) /* walk succeeded */
c->flag &= ~CMOUNT;
+ if(domnt){
+ if(waserror()){
+ print("domount error\n");
+ if(!first)
+ close(c);
+ return 0;
+ }
+ c = domount(c);
+ poperror();
+ }
+
if(!first)
close(ac);
- if(domnt)
- return domount(c);
+
return c;
Notfound:
@@ 422,6 435,11 @@ createdir(Chan *c)
return nc;
}
+void
+saveregisters(void)
+{
+}
+
/*
* Turn a name into a channel.
* &name[0] is known to be a valid address. It may be a kernel address.
@@ 539,6 557,7 @@ namec(char *name, int amode, int omode, ulong perm)
c = nc;
}
Open:
+ saveregisters(); /* else error() in open has wrong value of c saved */
c = (*devtab[c->type].open)(c, omode);
if(omode & OCEXEC)
c->flag |= CCEXEC;
M gnot/dat.h => gnot/dat.h +1 -0
@@ 499,6 499,7 @@ extern char *statename[];
#define CMOUNT 2 /* is result of a mount/bind */
#define CCREATE 4 /* permits creation if CMOUNT */
#define CCEXEC 8 /* close on exec */
+#define CFREE 16 /* not in use */
/*
* Proc.time
M gnot/devcons.c => gnot/devcons.c +3 -1
@@ 98,13 98,15 @@ printinit(void)
klogq.out = klogq.buf;
lineq.in = lineq.buf;
lineq.out = lineq.buf;
+ rs232.in.in = rs232.in.buf;
+ rs232.in.out = rs232.in.buf;
qlock(&kbdq); /* allocate qlock */
qunlock(&kbdq);
lock(&lineq); /* allocate lock */
unlock(&lineq);
lock(&klogq); /* allocate lock */
unlock(&klogq);
- lock(&klogq.put); /* allocate lock */
+ lock(&klogq.put); /* allocate lock */
unlock(&klogq.put);
screeninit();
M gnot/proc.c => gnot/proc.c +1 -0
@@ 5,6 5,7 @@
#include "fns.h"
#include "errno.h"
+#include <libg.h>
#include <gnot.h>
struct
M gnot/screen.c => gnot/screen.c +3 -6
@@ 13,7 13,6 @@
#define MINX 8
extern GFont defont0;
-extern GFont defont1;
GFont *defont;
struct{
@@ 42,11 41,9 @@ screeninit(void)
/*
* Read HEX switch to set ldepth
*/
- if(*(uchar*)MOUSE & (1<<4)){
+ if(*(uchar*)MOUSE & (1<<4))
gscreen.ldepth = 1;
- defont = &defont1;
- }else
- defont = &defont0;
+ defont = &defont0; /* save space; let bitblt do the conversion work */
gbitblt(&gscreen, Pt(0, 0), &gscreen, gscreen.r, 0);
out.pos.x = MINX;
out.pos.y = 0;
@@ 81,7 78,7 @@ screenputc(int c)
screenputc('\n');
buf[0] = c&0x7F;
buf[1] = 0;
- out.pos = gstring(&gscreen, out.pos, defont, buf, S);
+ out.pos = gbitbltstring(&gscreen, out.pos, defont, buf, S);
}
}
M gnot/stasync.c => gnot/stasync.c +8 -7
@@ 11,8 11,7 @@
* configuration
*/
enum {
- MAXFRAME= 246,
- Nasync= 1,
+ MAXFRAME= 256, /* also known to tsm8 code */
};
/* input states */
@@ 98,16 97,17 @@ asyncopen(Queue *q, Stream *s)
DPRINT("asyncopen %d\n", s->dev);
- for(ap = async; ap < &async[Nasync]; ap++){
+ for(ap = async; ap < &async[conf.nasync]; ap++){
qlock(ap);
if(ap->inuse == 0)
break;
qunlock(ap);
}
- if(ap == &async[Nasync])
+ if(ap == &async[conf.nasync])
error(0, Enoasync);
q->ptr = q->other->ptr = ap;
+ ap->inuse = 1;
ap->bp = 0;
ap->chan = -1;
ap->count = 0;
@@ 120,6 120,7 @@ asyncopen(Queue *q, Stream *s)
ap->out = 0;
ap->wq = WR(q);
ap->state = Hunt;
+ qunlock(ap);
}
static void
@@ 329,12 330,12 @@ void
asdeliver(Queue *q, Async *ap)
{
int chan, c;
- Block *bp;
+ Block *bp = 0;
uchar *p = ap->buf;
int n = ap->icount;
- chan = p[1] & 0x7e;
- chan = (chan<<5)|((p[2] & 0x7e)>>1);
+ chan = *p++ & 0x7e;
+ chan = (chan<<5)|((*p++ & 0x7e)>>1);
if(chan==0) {
DPRINT("a%d deliver chan 0\n", ap-async);
ap->chan0++;
M gnot/stream.c => gnot/stream.c +17 -16
@@ 1035,15 1035,16 @@ streamwrite(Chan *c, void *a, long n, int docopy)
long rem;
int i;
+ s = c->stream;
+
/*
* one writer at a time
- */
- s = c->stream;
qlock(&s->wrlock);
if(waserror()){
qunlock(&s->wrlock);
nexterror();
}
+ */
/*
* decode the qid
@@ 1053,9 1054,7 @@ streamwrite(Chan *c, void *a, long n, int docopy)
break;
case Sctlqid:
n = streamctlwrite(s, a, n);
- qunlock(&s->wrlock);
- poperror();
- return n;
+ goto out;
default:
panic("bad stream qid\n");
}
@@ 1104,8 1103,9 @@ streamwrite(Chan *c, void *a, long n, int docopy)
}
}
}
- qunlock(&s->wrlock);
- poperror();
+out:
+/* qunlock(&s->wrlock);
+ poperror(); /**/
return n;
}
@@ 1148,16 1148,17 @@ streamstat(Chan *c, char *db, char *name)
s = c->stream;
if(s == 0)
- panic("streamstat");
-
- q = RD(s->procq);
- lock(q);
- for(n=0, bp=q->first; bp; bp = bp->next){
- n += BLEN(bp);
- if(bp->flags&S_DELIM)
- break;
+ n = 0;
+ else {
+ q = RD(s->procq);
+ lock(q);
+ for(n=0, bp=q->first; bp; bp = bp->next){
+ n += BLEN(bp);
+ if(bp->flags&S_DELIM)
+ break;
+ }
+ unlock(q);
}
- unlock(q);
devdir(c, c->qid, name, n, 0, &dir);
convD2M(&dir, db);
M port/chan.c => port/chan.c +18 -2
@@ 372,11 372,21 @@ walk(Chan *ac, char *name, int domnt)
if(name[0]) /* walk succeeded */
c->flag &= ~CMOUNT;
+ if(domnt){
+ if(waserror()){
+ print("domount error\n");
+ if(!first)
+ close(c);
+ return 0;
+ }
+ c = domount(c);
+ poperror();
+ }
+
if(!first)
close(ac);
- if(domnt)
- return domount(c);
+
return c;
Notfound:
@@ 425,6 435,11 @@ createdir(Chan *c)
return nc;
}
+void
+saveregisters(void)
+{
+}
+
/*
* Turn a name into a channel.
* &name[0] is known to be a valid address. It may be a kernel address.
@@ 542,6 557,7 @@ namec(char *name, int amode, int omode, ulong perm)
c = nc;
}
Open:
+ saveregisters(); /* else error() in open has wrong value of c saved */
c = (*devtab[c->type].open)(c, omode);
if(omode & OCEXEC)
c->flag |= CCEXEC;
M port/devproc.c => port/devproc.c +6 -0
@@ 4,6 4,7 @@
#include "dat.h"
#include "fns.h"
#include "errno.h"
+#include "io.h"
#include "devtab.h"
@@ 282,6 283,11 @@ procread(Chan *c, void *va, long n)
n = KZERO+conf.npage0*BY2PG - c->offset;
memcpy(a, (char*)c->offset, n);
return n;
+ } else if(c->offset>=UNCACHED && c->offset<UNCACHED+conf.npage0*BY2PG){
+ if(c->offset+n > UNCACHED+conf.npage0*BY2PG)
+ n = UNCACHED+conf.npage0*BY2PG - c->offset;
+ memcpy(a, (char*)c->offset, n);
+ return n;
}
return 0;
break;
M port/stream.c => port/stream.c +10 -9
@@ 1148,16 1148,17 @@ streamstat(Chan *c, char *db, char *name)
s = c->stream;
if(s == 0)
- panic("streamstat");
-
- q = RD(s->procq);
- lock(q);
- for(n=0, bp=q->first; bp; bp = bp->next){
- n += BLEN(bp);
- if(bp->flags&S_DELIM)
- break;
+ n = 0;
+ else {
+ q = RD(s->procq);
+ lock(q);
+ for(n=0, bp=q->first; bp; bp = bp->next){
+ n += BLEN(bp);
+ if(bp->flags&S_DELIM)
+ break;
+ }
+ unlock(q);
}
- unlock(q);
devdir(c, c->qid, name, n, 0, &dir);
convD2M(&dir, db);