M gnot/devhifi.c => gnot/devhifi.c +7 -4
@@ 15,7 15,7 @@
#define DPRINT if(hifidebug)kprint
-#define BSIZE 4096
+#define BSIZE 4000
typedef struct Hifichan
{
@@ 433,9 433,9 @@ Top:
for(;;){
qlock(hp);
while(hp->ri != hp->wi){
- if(hp->rq)
- PUTNEXT(hp->rq, hp->inb[hp->ri]);
- else
+ if(hp->rq){
+ FLOWCTL(hp->rq, hp->inb[hp->ri]);
+ }else
freeb(hp->inb[hp->ri]);
if(hp->renable)
hp->inb[hp->ri] = allocb(BSIZE);
@@ 583,6 583,7 @@ Loop:
if(n > m){
hp->toolong++;
bp->wptr = bp->base;
+ bp->rptr = bp->base;
SET(hifi->opreg, hp->opreg | Rres);
return wake;
}
@@ 613,6 614,7 @@ Loop:
hp->badcount++;
}
bp->wptr = bp->base;
+ bp->rptr = bp->base;
}else
bp->wptr = p;
}else{
@@ 627,6 629,7 @@ Loop:
i = NEXT(hp->wi);
if(i == hp->ri){
bp->wptr = bp->base;
+ bp->rptr = bp->base;
return wake;
}else{
bp->flags |= S_DELIM;
M gnot/devisdn.c => gnot/devisdn.c +9 -9
@@ 15,7 15,7 @@
#define DPRINT if(isdndebug)kprint
-#define BSIZE 260
+#define BSIZE 200 /* should be 260, but for xalloc */
Isdn * isdndev;
Isdn * isdndevN;
@@ 412,7 412,7 @@ isdnkproc(void *arg)
Isdn *ip = (Isdn *)arg;
int i;
- if (waserror()) {
+ if(waserror()){
devctl(ip, Enr, 0);
ip->kstart = 0;
wakeup(&ip->kctlr);
@@ 421,7 421,7 @@ isdnkproc(void *arg)
/*
* create a number of blocks for input
*/
- for (i=0; i<NB; i++)
+ for(i=0; i<NB; i++)
if (!ip->inb[i])
ip->inb[i] = allocb(BSIZE);
ip->ri = 0;
@@ 429,19 429,19 @@ isdnkproc(void *arg)
devctl(ip, 0, Enr);
ip->kstart = 1;
wakeup(&ip->kctlr);
- for (;;) {
+ for(;;){
qlock(ip);
- if (!ip->rq) {
+ if (!ip->rq){
qunlock(ip);
break;
}
- while (ip->ri != ip->wi) {
- PUTNEXT(ip->rq, ip->inb[ip->ri]);
+ while (ip->ri != ip->wi){
+ FLOWCTL(ip->rq, ip->inb[ip->ri]);
ip->inb[ip->ri] = allocb(BSIZE);
ip->ri = NEXT(ip->ri);
}
i = 0;
- while (ip->so != ip->ro) {
+ while(ip->so != ip->ro){
freeb(ip->outb[ip->so]);
ip->so = NEXT(ip->so);
i++;
@@ 453,7 453,7 @@ isdnkproc(void *arg)
}
devctl(ip, Enr, 0);
sleep(&ip->kr, tEmpty, ip);
- while (ip->so != ip->ro) {
+ while(ip->so != ip->ro){
freeb(ip->outb[ip->so]);
ip->so = NEXT(ip->so);
}
M gnot/trap.c => gnot/trap.c +1 -1
@@ 322,7 322,7 @@ syscall(Ureg *aur)
if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-sizeof(Sargs)))
validaddr(sp, sizeof(Sargs), 0);
- u->s = *((Sargs*)(sp+BY2WD));
+ u->s = *((Sargs*)(sp+1*BY2WD));
u->p->psstate = sysctab[u->scallnr];
ret = (*systab[u->scallnr])(u->s.args);
M port/alarm.c => port/alarm.c +5 -4
@@ 12,10 12,9 @@ Talarm talarm;
void
alarmkproc(void *arg)
{
- int i, n;
- ulong now;
Proc *rp;
- int s;
+ ulong now;
+ int i, n, s;
USED(arg);
@@ 67,12 66,14 @@ checkalarms(void)
if(p->twhen == 0) {
talarm.list = p->tlink;
+ p->trend = 0;
continue;
}
if(now < p->twhen)
break;
- talarm.list = p->tlink;
wakeup(p->trend);
+ talarm.list = p->tlink;
+ p->trend = 0;
}
unlock(&talarm);
M port/proc.c => port/proc.c +18 -9
@@ 326,26 326,35 @@ void
tsleep(Rendez *r, int (*fn)(void*), void *arg, int ms)
{
ulong when;
- Proc *p, *f, **l, **i;
+ Proc *p, *f, **l;
p = u->p;
when = MS2TK(ms)+MACHP(0)->ticks;
- i = &talarm.list;
lock(&talarm);
+ /* take out of list if checkalarm didn't */
+ if(p->trend) {
+ l = &talarm.list;
+ for(f = *l; f; f = f->tlink) {
+ if(f == p) {
+ *l = p->tlink;
+ break;
+ }
+ l = &f->tlink;
+ }
+ }
+ /* insert in increasing time order */
l = &talarm.list;
- for(f = talarm.list; f; f = f->tlink) {
- if(f == p)
- *l = p->tlink;
- if(f->twhen && f->twhen < when)
- i = &f->tlink;
+ for(f = *l; f; f = f->tlink) {
+ if(f->twhen >= when)
+ break;
l = &f->tlink;
}
p->trend = r;
p->twhen = when;
- p->tlink = *i;
p->tfn = fn;
- *i = p;
+ p->tlink = *l;
+ *l = p;
unlock(&talarm);
sleep(r, tfn, arg);