ape: change types from unsigned long to void* for rendezvous() and segattach()/segbrk() (erik), use uniqueue rendezvous tags for _buf and listen

This commit is contained in:
cinap_lenrek 2013-05-11 18:34:40 +02:00
parent 9af0b2c683
commit 389d6a1054
10 changed files with 60 additions and 52 deletions

View file

@ -64,12 +64,12 @@ extern int bind(char*, char*, int);
extern int mount(int, int, char*, int, char*); extern int mount(int, int, char*, int, char*);
extern int unmount(char*, char*); extern int unmount(char*, char*);
extern int rfork(int); extern int rfork(int);
extern int segattach(int, char*, void*, unsigned long); extern void* segattach(int, char*, void*, unsigned long);
extern int segbrk(void*, void*); extern void* segbrk(void*, void*);
extern int segdetach(void*); extern int segdetach(void*);
extern int segflush(void*, unsigned long); extern int segflush(void*, unsigned long);
extern int segfree(void*, unsigned long); extern int segfree(void*, unsigned long);
extern unsigned long rendezvous(unsigned long, unsigned long); extern void* rendezvous(void*, void*);
extern unsigned long getfcr(void); extern unsigned long getfcr(void);
extern unsigned long getfsr(void); extern unsigned long getfsr(void);
extern void setfcr(unsigned long); extern void setfcr(unsigned long);

View file

@ -1,9 +1,9 @@
#include <lib9.h> #include <lib9.h>
extern unsigned long _RENDEZVOUS(unsigned long, unsigned long); extern void* _RENDEZVOUS(void*, void*);
unsigned long void*
rendezvous(unsigned long tag, unsigned long value) rendezvous(void *tag, void *value)
{ {
return _RENDEZVOUS(tag, value); return _RENDEZVOUS(tag, value);
} }

View file

@ -1,8 +1,8 @@
#include <lib9.h> #include <lib9.h>
extern int _SEGATTACH(int, char*, void*, unsigned long); extern void* _SEGATTACH(int, char*, void*, unsigned long);
int void*
segattach(int attr, char *class, void *va, unsigned long len) segattach(int attr, char *class, void *va, unsigned long len)
{ {
return _SEGATTACH(attr, class, va, len); return _SEGATTACH(attr, class, va, len);

View file

@ -1,8 +1,8 @@
#include <lib9.h> #include <lib9.h>
extern int _SEGBRK(void*, void*); extern void* _SEGBRK(void*, void*);
int void*
segbrk(void *saddr, void *addr) segbrk(void *saddr, void *addr)
{ {
return _SEGBRK(saddr, addr); return _SEGBRK(saddr, addr);

View file

@ -31,8 +31,7 @@ lockinit(void)
arch = C_fcr0(); arch = C_fcr0();
switch(arch) { switch(arch) {
case POWER: case POWER:
n = _SEGATTACH(0, "lock", (void*)Lockaddr, Pagesize); if(_SEGATTACH(0, "lock", (void*)Lockaddr, Pagesize) == (void*)-1) {
if(n < 0) {
arch = MAGNUM; arch = MAGNUM;
break; break;
} }

View file

@ -52,6 +52,7 @@ _startbuf(int fd)
int i, pid; int i, pid;
Fdinfo *f; Fdinfo *f;
Muxbuf *b; Muxbuf *b;
void *v;
if(mux == 0){ if(mux == 0){
_RFORK(RFREND); _RFORK(RFREND);
@ -111,16 +112,20 @@ Found:
for(i=0; i<OPEN_MAX; i++) for(i=0; i<OPEN_MAX; i++)
if(i!=fd && (_fdinfo[i].flags&FD_ISOPEN)) if(i!=fd && (_fdinfo[i].flags&FD_ISOPEN))
_CLOSE(i); _CLOSE(i);
_RENDEZVOUS(0, _muxsid); while(_RENDEZVOUS(&b->copypid, (void*)_muxsid) == (void*)~0)
;
_copyproc(fd, b); _copyproc(fd, b);
} }
/* parent process continues ... */ /* parent process continues ... */
b->copypid = pid; b->copypid = pid;
f->buf = b; f->buf = b;
f->flags |= FD_BUFFERED; f->flags |= FD_BUFFERED;
unlock(&mux->lock); 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 */ /* leave fd open in parent so system doesn't reuse it */
return 0; return 0;
} }
@ -168,7 +173,7 @@ _copyproc(int fd, Muxbuf *b)
/* sleep until there's room */ /* sleep until there's room */
b->roomwait = 1; b->roomwait = 1;
unlock(&mux->lock); unlock(&mux->lock);
_RENDEZVOUS((unsigned long)&b->roomwait, 0); _RENDEZVOUS(&b->roomwait, 0);
} }
} else } else
unlock(&mux->lock); unlock(&mux->lock);
@ -193,15 +198,15 @@ _copyproc(int fd, Muxbuf *b)
if(mux->selwait && FD_ISSET(fd, &mux->ewant)) { if(mux->selwait && FD_ISSET(fd, &mux->ewant)) {
mux->selwait = 0; mux->selwait = 0;
unlock(&mux->lock); unlock(&mux->lock);
_RENDEZVOUS((unsigned long)&mux->selwait, fd); _RENDEZVOUS(&mux->selwait, (void*)fd);
} else if(b->datawait) { } else if(b->datawait) {
b->datawait = 0; b->datawait = 0;
unlock(&mux->lock); unlock(&mux->lock);
_RENDEZVOUS((unsigned long)&b->datawait, 0); _RENDEZVOUS(&b->datawait, 0);
} else if(mux->selwait && FD_ISSET(fd, &mux->rwant)) { } else if(mux->selwait && FD_ISSET(fd, &mux->rwant)) {
mux->selwait = 0; mux->selwait = 0;
unlock(&mux->lock); unlock(&mux->lock);
_RENDEZVOUS((unsigned long)&mux->selwait, fd); _RENDEZVOUS(&mux->selwait, (void*)fd);
} else } else
unlock(&mux->lock); unlock(&mux->lock);
_exit(0); _exit(0);
@ -214,12 +219,12 @@ _copyproc(int fd, Muxbuf *b)
b->datawait = 0; b->datawait = 0;
unlock(&mux->lock); unlock(&mux->lock);
/* wake up _bufreading process */ /* wake up _bufreading process */
_RENDEZVOUS((unsigned long)&b->datawait, 0); _RENDEZVOUS(&b->datawait, 0);
} else if(mux->selwait && FD_ISSET(fd, &mux->rwant)) { } else if(mux->selwait && FD_ISSET(fd, &mux->rwant)) {
mux->selwait = 0; mux->selwait = 0;
unlock(&mux->lock); unlock(&mux->lock);
/* wake up selecting process */ /* wake up selecting process */
_RENDEZVOUS((unsigned long)&mux->selwait, fd); _RENDEZVOUS(&mux->selwait, (void*)fd);
} else } else
unlock(&mux->lock); unlock(&mux->lock);
} else } else
@ -265,7 +270,7 @@ goteof:
/* sleep until there's data */ /* sleep until there's data */
b->datawait = 1; b->datawait = 1;
unlock(&mux->lock); unlock(&mux->lock);
_RENDEZVOUS((unsigned long)&b->datawait, 0); _RENDEZVOUS(&b->datawait, 0);
lock(&mux->lock); lock(&mux->lock);
if(b->fd != fd){ if(b->fd != fd){
unlock(&mux->lock); unlock(&mux->lock);
@ -287,7 +292,7 @@ goteof:
b->roomwait = 0; b->roomwait = 0;
unlock(&mux->lock); unlock(&mux->lock);
/* wake up copy process */ /* wake up copy process */
_RENDEZVOUS((unsigned long)&b->roomwait, 0); _RENDEZVOUS(&b->roomwait, 0);
} else } else
unlock(&mux->lock); unlock(&mux->lock);
return ngot; return ngot;
@ -390,7 +395,7 @@ select(int nfds, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *timeo
} }
mux->selwait = 1; mux->selwait = 1;
unlock(&mux->lock); unlock(&mux->lock);
fd = _RENDEZVOUS((unsigned long)&mux->selwait, 0); fd = (int)_RENDEZVOUS(&mux->selwait, 0);
if(fd >= 0 && fd < nfds) { if(fd >= 0 && fd < nfds) {
b = _fdinfo[fd].buf; b = _fdinfo[fd].buf;
if(b == 0 || b->fd != fd) { if(b == 0 || b->fd != fd) {
@ -435,7 +440,8 @@ _timerproc(void)
signal(SIGALRM, alarmed); signal(SIGALRM, alarmed);
for(i=0; i<OPEN_MAX; i++) for(i=0; i<OPEN_MAX; i++)
_CLOSE(i); _CLOSE(i);
_RENDEZVOUS(1, 0); while(_RENDEZVOUS(&timerpid, 0) == (void*)~0)
;
for(;;) { for(;;) {
_SLEEP(mux->waittime); _SLEEP(mux->waittime);
if(timerreset) { if(timerreset) {
@ -446,7 +452,7 @@ _timerproc(void)
mux->selwait = 0; mux->selwait = 0;
mux->waittime = LONGWAIT; mux->waittime = LONGWAIT;
unlock(&mux->lock); unlock(&mux->lock);
_RENDEZVOUS((unsigned long)&mux->selwait, -2); _RENDEZVOUS(&mux->selwait, (void*)-2);
} else { } else {
mux->waittime = LONGWAIT; mux->waittime = LONGWAIT;
unlock(&mux->lock); unlock(&mux->lock);
@ -454,9 +460,12 @@ _timerproc(void)
} }
} }
} }
atexit(_killtimerproc);
/* parent process continues */ /* parent process continues */
_RENDEZVOUS(1, 0); if(timerpid > 0){
atexit(_killtimerproc);
while(_RENDEZVOUS(&timerpid, 0) == (void*)~0)
;
}
} }
static void static void

View file

@ -73,7 +73,7 @@ qlock(QLock *q)
unlock(&q->lock); unlock(&q->lock);
/* wait */ /* wait */
while((*_rendezvousp)((ulong)mp, 1) == ~0) while((*_rendezvousp)(mp, (void*)1) == (void*)~0)
; ;
mp->inuse = 0; mp->inuse = 0;
} }
@ -91,7 +91,7 @@ qunlock(QLock *q)
if(q->head == nil) if(q->head == nil)
q->tail = nil; q->tail = nil;
unlock(&q->lock); unlock(&q->lock);
while((*_rendezvousp)((ulong)p, 0x12345) == ~0) while((*_rendezvousp)(p, (void*)0x12345) == (void*)~0)
; ;
return; return;
} }
@ -140,7 +140,7 @@ rlock(RWLock *q)
unlock(&q->lock); unlock(&q->lock);
/* wait in kernel */ /* wait in kernel */
while((*_rendezvousp)((ulong)mp, 1) == ~0) while((*_rendezvousp)(mp, (void*)1) == (void*)~0)
; ;
mp->inuse = 0; mp->inuse = 0;
} }
@ -183,7 +183,7 @@ runlock(RWLock *q)
unlock(&q->lock); unlock(&q->lock);
/* wakeup waiter */ /* 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); unlock(&q->lock);
/* wait in kernel */ /* wait in kernel */
while((*_rendezvousp)((ulong)mp, 1) == ~0) while((*_rendezvousp)(mp, (void*)1) == (void*)~0)
; ;
mp->inuse = 0; mp->inuse = 0;
} }
@ -252,7 +252,7 @@ wunlock(RWLock *q)
if(q->head == nil) if(q->head == nil)
q->tail = nil; q->tail = nil;
unlock(&q->lock); unlock(&q->lock);
while((*_rendezvousp)((ulong)p, 0) == ~0) while((*_rendezvousp)(p, (void*)0) == (void*)~0)
; ;
return; return;
} }
@ -265,7 +265,7 @@ wunlock(RWLock *q)
p = q->head; p = q->head;
q->head = p->next; q->head = p->next;
q->readers++; q->readers++;
while((*_rendezvousp)((ulong)p, 0) == ~0) while((*_rendezvousp)(p, (void*)0) == (void*)~0)
; ;
} }
if(q->head == nil) if(q->head == nil)
@ -303,7 +303,7 @@ rsleep(Rendez *r)
if(r->l->head == nil) if(r->l->head == nil)
r->l->tail = nil; r->l->tail = nil;
unlock(&r->l->lock); unlock(&r->l->lock);
while((*_rendezvousp)((ulong)t, 0x12345) == ~0) while((*_rendezvousp)(t, (void*)0x12345) == (void*)~0)
; ;
}else{ }else{
r->l->locked = 0; r->l->locked = 0;
@ -311,7 +311,7 @@ rsleep(Rendez *r)
} }
/* wait for a wakeup */ /* wait for a wakeup */
while((*_rendezvousp)((ulong)me, 1) == ~0) while((*_rendezvousp)(me, (void*)1) == (void*)~0)
; ;
me->inuse = 0; me->inuse = 0;
} }

View file

@ -98,10 +98,10 @@ extern long _PREAD(int, void*, long, long long);
extern long _PWRITE(int, void*, long, long long); extern long _PWRITE(int, void*, long, long long);
extern long _READ(int, void*, long); extern long _READ(int, void*, long);
extern int _REMOVE(const char*); extern int _REMOVE(const char*);
extern int _RENDEZVOUS(unsigned long, unsigned long); extern void* _RENDEZVOUS(void*, void*);
extern int _RFORK(int); extern int _RFORK(int);
extern int _SEGATTACH(int, char*, void*, unsigned long); extern void* _SEGATTACH(int, char*, void*, unsigned long);
extern int _SEGBRK(void*, void*); extern void* _SEGBRK(void*, void*);
extern int _SEGDETACH(void*); extern int _SEGDETACH(void*);
extern int _SEGFLUSH(void*, unsigned long); extern int _SEGFLUSH(void*, unsigned long);
extern int _SEGFREE(void*, unsigned long); extern int _SEGFREE(void*, unsigned long);

View file

@ -31,14 +31,11 @@ extern void _killmuxsid(void);
static int static int
listenproc(Rock *r, int fd) listenproc(Rock *r, int fd)
{ {
Rock *nr; char listen[Ctlsize], name[Ctlsize], *net, *p;
char *net; int cfd, nfd, dfd, pfd[2];
int cfd, nfd, dfd;
int pfd[2];
struct stat d; struct stat d;
char *p; Rock *nr;
char listen[Ctlsize]; void *v;
char name[Ctlsize];
switch(r->stype){ switch(r->stype){
case SOCK_DGRAM: case SOCK_DGRAM:
@ -81,11 +78,14 @@ listenproc(Rock *r, int fd)
_muxsid = getpgrp(); _muxsid = getpgrp();
} else } else
setpgid(getpid(), _muxsid); setpgid(getpid(), _muxsid);
_RENDEZVOUS(2, _muxsid); while(_RENDEZVOUS(r, (void*)_muxsid) == (void*)~0)
;
break; break;
default: default:
while((v = _RENDEZVOUS(r, 0)) == (void*)~0)
;
_muxsid = (int)v;
atexit(_killmuxsid); atexit(_killmuxsid);
_muxsid = _RENDEZVOUS(2, 0);
close(pfd[1]); close(pfd[1]);
close(nfd); close(nfd);
return 0; return 0;

View file

@ -84,10 +84,10 @@ extern long _PREAD(int, void*, long, long long);
extern long _PWRITE(int, void*, long, long long); extern long _PWRITE(int, void*, long, long long);
extern long _READ(int, void*, long); extern long _READ(int, void*, long);
extern int _REMOVE(const char*); extern int _REMOVE(const char*);
extern int _RENDEZVOUS(unsigned long, unsigned long); extern void* _RENDEZVOUS(void*, void*);
extern int _RFORK(int); extern int _RFORK(int);
extern int _SEGATTACH(int, char*, void*, unsigned long); extern void* _SEGATTACH(int, char*, void*, unsigned long);
extern int _SEGBRK(void*, void*); extern void* _SEGBRK(void*, void*);
extern int _SEGDETACH(void*); extern int _SEGDETACH(void*);
extern int _SEGFLUSH(void*, unsigned long); extern int _SEGFLUSH(void*, unsigned long);
extern int _SEGFREE(void*, unsigned long); extern int _SEGFREE(void*, unsigned long);