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:
parent
9af0b2c683
commit
389d6a1054
10 changed files with 60 additions and 52 deletions
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue