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 unmount(char*, char*);
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);
extern unsigned long rendezvous(unsigned long, unsigned long);
extern void* rendezvous(void*, void*);
extern unsigned long getfcr(void);
extern unsigned long getfsr(void);
extern void setfcr(unsigned long);

View file

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

View file

@ -1,8 +1,8 @@
#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)
{
return _SEGATTACH(attr, class, va, len);

View file

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

View file

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

View file

@ -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

View file

@ -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;
}

View file

@ -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);

View file

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