git: 9front

Download patch

ref: 4621691ae0af5cc5217bf07fc22a6b12d4fab1cf
parent: ccf3eae2ed3c4a85d6ade136c124652b078e5cd6
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Sat May 11 14:34:40 EDT 2013

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

--- a/sys/include/ape/lib9.h
+++ b/sys/include/ape/lib9.h
@@ -64,12 +64,12 @@
 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);
--- a/sys/src/ape/lib/9/rendezvous.c
+++ b/sys/src/ape/lib/9/rendezvous.c
@@ -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);
 }
--- a/sys/src/ape/lib/9/segattach.c
+++ b/sys/src/ape/lib/9/segattach.c
@@ -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);
--- a/sys/src/ape/lib/9/segbrk.c
+++ b/sys/src/ape/lib/9/segbrk.c
@@ -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);
--- a/sys/src/ape/lib/ap/mips/lock.c
+++ b/sys/src/ape/lib/ap/mips/lock.c
@@ -31,8 +31,7 @@
 	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;
 		}
--- a/sys/src/ape/lib/ap/plan9/_buf.c
+++ b/sys/src/ape/lib/ap/plan9/_buf.c
@@ -52,6 +52,7 @@
 	int i, pid;
 	Fdinfo *f;
 	Muxbuf *b;
+	void *v;
 
 	if(mux == 0){
 		_RFORK(RFREND);
@@ -111,16 +112,20 @@
 		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 @@
 				/* 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 @@
 			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 @@
 					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 @@
 		/* 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 @@
 		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 @@
 	}
 	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 @@
 		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 @@
 					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 @@
 			}
 		}
 	}
-	atexit(_killtimerproc);
 	/* parent process continues */
-	_RENDEZVOUS(1, 0);
+	if(timerpid > 0){
+		atexit(_killtimerproc);
+		while(_RENDEZVOUS(&timerpid, 0) == (void*)~0)
+			;
+	}
 }
 
 static void
--- a/sys/src/ape/lib/ap/plan9/qlock.c
+++ b/sys/src/ape/lib/ap/plan9/qlock.c
@@ -73,7 +73,7 @@
 	unlock(&q->lock);
 
 	/* wait */
-	while((*_rendezvousp)((ulong)mp, 1) == ~0)
+	while((*_rendezvousp)(mp, (void*)1) == (void*)~0)
 		;
 	mp->inuse = 0;
 }
@@ -91,7 +91,7 @@
 		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 @@
 	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 @@
 	unlock(&q->lock);
 
 	/* wakeup waiter */
-	while((*_rendezvousp)((ulong)p, 0) == ~0)
+	while((*_rendezvousp)(p, (void*)0) == (void*)~0)
 		;
 }
 
@@ -213,7 +213,7 @@
 	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 @@
 		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 @@
 		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 @@
 		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 @@
 	}
 
 	/* wait for a wakeup */
-	while((*_rendezvousp)((ulong)me, 1) == ~0)
+	while((*_rendezvousp)(me, (void*)1) == (void*)~0)
 		;
 	me->inuse = 0;
 }
--- a/sys/src/ape/lib/ap/plan9/sys9.h
+++ b/sys/src/ape/lib/ap/plan9/sys9.h
@@ -98,10 +98,10 @@
 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);
--- a/sys/src/ape/lib/bsd/listen.c
+++ b/sys/src/ape/lib/bsd/listen.c
@@ -31,14 +31,11 @@
 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 @@
 			_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;
--- a/sys/src/ape/lib/draw/libc.h
+++ b/sys/src/ape/lib/draw/libc.h
@@ -84,10 +84,10 @@
 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);
--