diff options
Diffstat (limited to 'src/lib9')
-rw-r--r-- | src/lib9/create.c | 5 | ||||
-rw-r--r-- | src/lib9/mkfile | 1 | ||||
-rw-r--r-- | src/lib9/open.c | 5 | ||||
-rw-r--r-- | src/lib9/qlock.c | 32 |
4 files changed, 35 insertions, 8 deletions
diff --git a/src/lib9/create.c b/src/lib9/create.c index 97f6e7e2..eaea479c 100644 --- a/src/lib9/create.c +++ b/src/lib9/create.c @@ -1,3 +1,4 @@ +#define _GNU_SOURCE /* for Linux O_DIRECT */ #include <u.h> #define NOPLAN9DEFINES #include <libc.h> @@ -25,6 +26,10 @@ p9create(char *path, int mode, ulong perm) }else{ umode = (mode&3)|O_CREAT|O_TRUNC; mode &= ~(3|OTRUNC); + if(mode&ODIRECT){ + umode |= O_DIRECT; + mode &= ~ODIRECT; + } if(mode&OEXCL){ umode |= O_EXCL; mode &= ~OEXCL; diff --git a/src/lib9/mkfile b/src/lib9/mkfile index 6a3b1fca..273a79ba 100644 --- a/src/lib9/mkfile +++ b/src/lib9/mkfile @@ -167,3 +167,4 @@ HFILES=\ %.$O: utf/%.c $CC $CFLAGS utf/$stem.c +rendez-Linux.$O: rendez-futex.c rendez-signal.c diff --git a/src/lib9/open.c b/src/lib9/open.c index 0356a7da..b70a9a27 100644 --- a/src/lib9/open.c +++ b/src/lib9/open.c @@ -1,3 +1,4 @@ +#define _GNU_SOURCE /* for Linux O_DIRECT */ #include <u.h> #define NOPLAN9DEFINES #include <libc.h> @@ -16,6 +17,10 @@ p9open(char *name, int mode) umode |= O_TRUNC; mode ^= OTRUNC; } + if(mode&ODIRECT){ + umode |= O_DIRECT; + mode ^= ODIRECT; + } if(mode){ werrstr("mode not supported"); return -1; diff --git a/src/lib9/qlock.c b/src/lib9/qlock.c index 55a18466..00bbcc7d 100644 --- a/src/lib9/qlock.c +++ b/src/lib9/qlock.c @@ -34,8 +34,10 @@ getqlp(void) for(p = op+1; ; p++){ if(p == &ql.x[nelem(ql.x)]) p = ql.x; - if(p == op) + if(p == op){ + fprint(2, "qlock: out of qlp\n"); abort(); + } if(_tas(&(p->inuse)) == 0){ ql.p = p; p->next = nil; @@ -233,8 +235,10 @@ wunlock(RWLock *q) QLp *p; lock(&q->lock); - if(q->writer == 0) + if(q->writer == 0){ + fprint(2, "wunlock: not holding lock\n"); abort(); + } p = q->head; if(p == nil){ q->writer = 0; @@ -252,8 +256,10 @@ wunlock(RWLock *q) return; } - if(p->state != QueuingR) + if(p->state != QueuingR){ + fprint(2, "wunlock: bad state\n"); abort(); + } /* wake waiting readers */ while(q->head != nil && q->head->state == QueuingR){ @@ -274,12 +280,16 @@ rsleep(Rendez *r) { QLp *t, *me; - if(!r->l) + if(!r->l){ + fprint(2, "rsleep: no lock\n"); abort(); + } lock(&r->l->lock); /* we should hold the qlock */ - if(!r->l->locked) + if(!r->l->locked){ + fprint(2, "rsleep: not locked\n"); abort(); + } /* add ourselves to the wait list */ me = getqlp(); @@ -309,8 +319,10 @@ rsleep(Rendez *r) while((*_rendezvousp)((ulong)me, 0x23456) == ~0) ; me->inuse = 0; - if(!r->l->locked) + if(!r->l->locked){ + fprint(2, "rsleep: not locked after wakeup\n"); abort(); + } } int @@ -323,11 +335,15 @@ rwakeup(Rendez *r) * put on front so guys that have been waiting will not get starved */ - if(!r->l) + if(!r->l){ + fprint(2, "rwakeup: no lock\n"); abort(); + } lock(&r->l->lock); - if(!r->l->locked) + if(!r->l->locked){ + fprint(2, "rwakeup: not locked\n"); abort(); + } t = r->head; if(t == nil){ |