diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-05-11 18:34:40 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-05-11 18:34:40 +0200 |
commit | 389d6a1054cbf6734499a81c7de2dbc8251fa65c (patch) | |
tree | 62b4b68ecb8ba2916f65f7c477d9f300705b0812 /sys/src/ape/lib/ap/plan9 | |
parent | 9af0b2c68377c321475ec0c2e5a0af85b4965709 (diff) |
ape: change types from unsigned long to void* for rendezvous() and segattach()/segbrk() (erik), use uniqueue rendezvous tags for _buf and listen
Diffstat (limited to 'sys/src/ape/lib/ap/plan9')
-rw-r--r-- | sys/src/ape/lib/ap/plan9/_buf.c | 41 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/plan9/qlock.c | 18 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/plan9/sys9.h | 6 |
3 files changed, 37 insertions, 28 deletions
diff --git a/sys/src/ape/lib/ap/plan9/_buf.c b/sys/src/ape/lib/ap/plan9/_buf.c index 9836886d7..906c2335d 100644 --- a/sys/src/ape/lib/ap/plan9/_buf.c +++ b/sys/src/ape/lib/ap/plan9/_buf.c @@ -52,6 +52,7 @@ _startbuf(int fd) int i, pid; Fdinfo *f; Muxbuf *b; + void *v; if(mux == 0){ _RFORK(RFREND); @@ -111,16 +112,20 @@ Found: for(i=0; i<OPEN_MAX; i++) if(i!=fd && (_fdinfo[i].flags&FD_ISOPEN)) _CLOSE(i); - _RENDEZVOUS(0, _muxsid); + while(_RENDEZVOUS(&b->copypid, (void*)_muxsid) == (void*)~0) + ; _copyproc(fd, b); } - /* parent process continues ... */ b->copypid = pid; f->buf = b; f->flags |= FD_BUFFERED; unlock(&mux->lock); - _muxsid = _RENDEZVOUS(0, 0); + + while((v = _RENDEZVOUS(&b->copypid, 0)) == (void*)~0) + ; + _muxsid = (int)v; + /* leave fd open in parent so system doesn't reuse it */ return 0; } @@ -168,7 +173,7 @@ _copyproc(int fd, Muxbuf *b) /* sleep until there's room */ b->roomwait = 1; unlock(&mux->lock); - _RENDEZVOUS((unsigned long)&b->roomwait, 0); + _RENDEZVOUS(&b->roomwait, 0); } } else unlock(&mux->lock); @@ -193,15 +198,15 @@ _copyproc(int fd, Muxbuf *b) if(mux->selwait && FD_ISSET(fd, &mux->ewant)) { mux->selwait = 0; unlock(&mux->lock); - _RENDEZVOUS((unsigned long)&mux->selwait, fd); + _RENDEZVOUS(&mux->selwait, (void*)fd); } else if(b->datawait) { b->datawait = 0; unlock(&mux->lock); - _RENDEZVOUS((unsigned long)&b->datawait, 0); + _RENDEZVOUS(&b->datawait, 0); } else if(mux->selwait && FD_ISSET(fd, &mux->rwant)) { mux->selwait = 0; unlock(&mux->lock); - _RENDEZVOUS((unsigned long)&mux->selwait, fd); + _RENDEZVOUS(&mux->selwait, (void*)fd); } else unlock(&mux->lock); _exit(0); @@ -214,12 +219,12 @@ _copyproc(int fd, Muxbuf *b) b->datawait = 0; unlock(&mux->lock); /* wake up _bufreading process */ - _RENDEZVOUS((unsigned long)&b->datawait, 0); + _RENDEZVOUS(&b->datawait, 0); } else if(mux->selwait && FD_ISSET(fd, &mux->rwant)) { mux->selwait = 0; unlock(&mux->lock); /* wake up selecting process */ - _RENDEZVOUS((unsigned long)&mux->selwait, fd); + _RENDEZVOUS(&mux->selwait, (void*)fd); } else unlock(&mux->lock); } else @@ -265,7 +270,7 @@ goteof: /* sleep until there's data */ b->datawait = 1; unlock(&mux->lock); - _RENDEZVOUS((unsigned long)&b->datawait, 0); + _RENDEZVOUS(&b->datawait, 0); lock(&mux->lock); if(b->fd != fd){ unlock(&mux->lock); @@ -287,7 +292,7 @@ goteof: b->roomwait = 0; unlock(&mux->lock); /* wake up copy process */ - _RENDEZVOUS((unsigned long)&b->roomwait, 0); + _RENDEZVOUS(&b->roomwait, 0); } else unlock(&mux->lock); return ngot; @@ -390,7 +395,7 @@ select(int nfds, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *timeo } mux->selwait = 1; unlock(&mux->lock); - fd = _RENDEZVOUS((unsigned long)&mux->selwait, 0); + fd = (int)_RENDEZVOUS(&mux->selwait, 0); if(fd >= 0 && fd < nfds) { b = _fdinfo[fd].buf; if(b == 0 || b->fd != fd) { @@ -435,7 +440,8 @@ _timerproc(void) signal(SIGALRM, alarmed); for(i=0; i<OPEN_MAX; i++) _CLOSE(i); - _RENDEZVOUS(1, 0); + while(_RENDEZVOUS(&timerpid, 0) == (void*)~0) + ; for(;;) { _SLEEP(mux->waittime); if(timerreset) { @@ -446,7 +452,7 @@ _timerproc(void) mux->selwait = 0; mux->waittime = LONGWAIT; unlock(&mux->lock); - _RENDEZVOUS((unsigned long)&mux->selwait, -2); + _RENDEZVOUS(&mux->selwait, (void*)-2); } else { mux->waittime = LONGWAIT; unlock(&mux->lock); @@ -454,9 +460,12 @@ _timerproc(void) } } } - atexit(_killtimerproc); /* parent process continues */ - _RENDEZVOUS(1, 0); + if(timerpid > 0){ + atexit(_killtimerproc); + while(_RENDEZVOUS(&timerpid, 0) == (void*)~0) + ; + } } static void diff --git a/sys/src/ape/lib/ap/plan9/qlock.c b/sys/src/ape/lib/ap/plan9/qlock.c index b0882f789..3be8dae25 100644 --- a/sys/src/ape/lib/ap/plan9/qlock.c +++ b/sys/src/ape/lib/ap/plan9/qlock.c @@ -73,7 +73,7 @@ qlock(QLock *q) unlock(&q->lock); /* wait */ - while((*_rendezvousp)((ulong)mp, 1) == ~0) + while((*_rendezvousp)(mp, (void*)1) == (void*)~0) ; mp->inuse = 0; } @@ -91,7 +91,7 @@ qunlock(QLock *q) if(q->head == nil) q->tail = nil; unlock(&q->lock); - while((*_rendezvousp)((ulong)p, 0x12345) == ~0) + while((*_rendezvousp)(p, (void*)0x12345) == (void*)~0) ; return; } @@ -140,7 +140,7 @@ rlock(RWLock *q) unlock(&q->lock); /* wait in kernel */ - while((*_rendezvousp)((ulong)mp, 1) == ~0) + while((*_rendezvousp)(mp, (void*)1) == (void*)~0) ; mp->inuse = 0; } @@ -183,7 +183,7 @@ runlock(RWLock *q) unlock(&q->lock); /* wakeup waiter */ - while((*_rendezvousp)((ulong)p, 0) == ~0) + while((*_rendezvousp)(p, (void*)0) == (void*)~0) ; } @@ -213,7 +213,7 @@ wlock(RWLock *q) unlock(&q->lock); /* wait in kernel */ - while((*_rendezvousp)((ulong)mp, 1) == ~0) + while((*_rendezvousp)(mp, (void*)1) == (void*)~0) ; mp->inuse = 0; } @@ -252,7 +252,7 @@ wunlock(RWLock *q) if(q->head == nil) q->tail = nil; unlock(&q->lock); - while((*_rendezvousp)((ulong)p, 0) == ~0) + while((*_rendezvousp)(p, (void*)0) == (void*)~0) ; return; } @@ -265,7 +265,7 @@ wunlock(RWLock *q) p = q->head; q->head = p->next; q->readers++; - while((*_rendezvousp)((ulong)p, 0) == ~0) + while((*_rendezvousp)(p, (void*)0) == (void*)~0) ; } if(q->head == nil) @@ -303,7 +303,7 @@ rsleep(Rendez *r) if(r->l->head == nil) r->l->tail = nil; unlock(&r->l->lock); - while((*_rendezvousp)((ulong)t, 0x12345) == ~0) + while((*_rendezvousp)(t, (void*)0x12345) == (void*)~0) ; }else{ r->l->locked = 0; @@ -311,7 +311,7 @@ rsleep(Rendez *r) } /* wait for a wakeup */ - while((*_rendezvousp)((ulong)me, 1) == ~0) + while((*_rendezvousp)(me, (void*)1) == (void*)~0) ; me->inuse = 0; } diff --git a/sys/src/ape/lib/ap/plan9/sys9.h b/sys/src/ape/lib/ap/plan9/sys9.h index b289273cb..b9e5bbc04 100644 --- a/sys/src/ape/lib/ap/plan9/sys9.h +++ b/sys/src/ape/lib/ap/plan9/sys9.h @@ -98,10 +98,10 @@ extern long _PREAD(int, void*, long, long long); extern long _PWRITE(int, void*, long, long long); extern long _READ(int, void*, long); extern int _REMOVE(const char*); -extern int _RENDEZVOUS(unsigned long, unsigned long); +extern void* _RENDEZVOUS(void*, void*); extern int _RFORK(int); -extern int _SEGATTACH(int, char*, void*, unsigned long); -extern int _SEGBRK(void*, void*); +extern void* _SEGATTACH(int, char*, void*, unsigned long); +extern void* _SEGBRK(void*, void*); extern int _SEGDETACH(void*); extern int _SEGFLUSH(void*, unsigned long); extern int _SEGFREE(void*, unsigned long); |