Module Name:    src
Committed By:   pooka
Date:           Fri Nov 19 17:09:45 UTC 2010

Modified Files:
        src/lib/librumpuser: rumpuser_sp.c sp_common.c

Log Message:
Support multithreaded clients and fix a few bugs.


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/lib/librumpuser/rumpuser_sp.c
cvs rdiff -u -r1.5 -r1.6 src/lib/librumpuser/sp_common.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/librumpuser/rumpuser_sp.c
diff -u src/lib/librumpuser/rumpuser_sp.c:1.7 src/lib/librumpuser/rumpuser_sp.c:1.8
--- src/lib/librumpuser/rumpuser_sp.c:1.7	Fri Nov 19 15:25:49 2010
+++ src/lib/librumpuser/rumpuser_sp.c	Fri Nov 19 17:09:44 2010
@@ -1,4 +1,4 @@
-/*      $NetBSD: rumpuser_sp.c,v 1.7 2010/11/19 15:25:49 pooka Exp $	*/
+/*      $NetBSD: rumpuser_sp.c,v 1.8 2010/11/19 17:09:44 pooka Exp $	*/
 
 /*
  * Copyright (c) 2010 Antti Kantee.  All Rights Reserved.
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: rumpuser_sp.c,v 1.7 2010/11/19 15:25:49 pooka Exp $");
+__RCSID("$NetBSD: rumpuser_sp.c,v 1.8 2010/11/19 17:09:44 pooka Exp $");
 
 #include <sys/types.h>
 #include <sys/mman.h>
@@ -107,6 +107,18 @@
 	return rv;
 }
 
+static int
+lwproc_newlwp(pid_t pid)
+{
+	int rv;
+
+	spops.spop_schedule();
+	rv = spops.spop_lwproc_newlwp(pid);
+	spops.spop_unschedule();
+
+	return rv;
+}
+
 static struct lwp *
 lwproc_curlwp(void)
 {
@@ -119,6 +131,18 @@
 	return l;
 }
 
+static pid_t
+lwproc_getpid(void)
+{
+	pid_t p;
+
+	spops.spop_schedule();
+	p = spops.spop_getpid();
+	spops.spop_unschedule();
+
+	return p;
+}
+
 static int
 rumpsyscall(int sysnum, void *data, register_t *retval)
 {
@@ -271,7 +295,7 @@
 
 	DPRINTF(("rump_sp: disconnecting [%u]\n", idx));
 
-	lwproc_switch(spc->spc_lwp);
+	lwproc_switch(spc->spc_mainlwp);
 	lwproc_release();
 
 	pthread_mutex_destroy(&spc->spc_mtx);
@@ -342,8 +366,9 @@
 
 	pfdlist[i].fd = newfd;
 	spclist[i].spc_fd = newfd;
-	spclist[i].spc_lwp = lwproc_curlwp();
+	spclist[i].spc_mainlwp = lwproc_curlwp();
 	spclist[i].spc_istatus = SPCSTATUS_BUSY; /* dedicated receiver */
+	spclist[i].spc_pid = lwproc_getpid();
 
 	TAILQ_INIT(&spclist[i].spc_respwait);
 	pthread_mutex_init(&spclist[i].spc_mtx, NULL);
@@ -353,7 +378,7 @@
 		maxidx = i;
 
 	DPRINTF(("rump_sp: added new connection at idx %u, pid %d\n",
-	    i, 9)); /* XXX: getpid not spop */
+	    i, lwproc_getpid()));
 
 	lwproc_switch(NULL);
 
@@ -371,7 +396,7 @@
 	    sysnum, 0));
 
 	pthread_setspecific(spclient_tls, spc);
-	lwproc_switch(spc->spc_lwp);
+	lwproc_newlwp(spc->spc_pid);
 	rv = rumpsyscall(sysnum, data, retval);
 	lwproc_switch(NULL);
 	pthread_setspecific(spclient_tls, NULL);

Index: src/lib/librumpuser/sp_common.c
diff -u src/lib/librumpuser/sp_common.c:1.5 src/lib/librumpuser/sp_common.c:1.6
--- src/lib/librumpuser/sp_common.c:1.5	Fri Nov 19 15:40:55 2010
+++ src/lib/librumpuser/sp_common.c	Fri Nov 19 17:09:44 2010
@@ -1,4 +1,4 @@
-/*      $NetBSD: sp_common.c,v 1.5 2010/11/19 15:40:55 pooka Exp $	*/
+/*      $NetBSD: sp_common.c,v 1.6 2010/11/19 17:09:44 pooka Exp $	*/
 
 /*
  * Copyright (c) 2010 Antti Kantee.  All Rights Reserved.
@@ -117,7 +117,9 @@
 
 struct spclient {
 	int spc_fd;
-	struct lwp *spc_lwp;
+
+	struct lwp *spc_mainlwp;
+	pid_t spc_pid;
 
 	/* incoming */
 	struct rsp_hdr spc_hdr;
@@ -226,11 +228,10 @@
 	}
 	if (rw == NULL) {
 		printf("PANIC: no waiter\n");
-		pthread_mutex_unlock(&spc->spc_mtx);
+		abort();
 		return;
 	}
 	rw->rw_data = spc->spc_buf;
-	TAILQ_REMOVE(&spc->spc_respwait, rw, rw_entries);
 	pthread_cond_signal(&rw->rw_cv);
 	pthread_mutex_unlock(&spc->spc_mtx);
 
@@ -288,7 +289,6 @@
 			if (spc->spc_istatus == SPCSTATUS_WANTED)
 				kickall(spc);
 			spc->spc_istatus = SPCSTATUS_FREE;
-			pthread_mutex_unlock(&spc->spc_mtx);
 		} else {
 			spc->spc_istatus = SPCSTATUS_WANTED;
 			pthread_cond_wait(&rw->rw_cv, &spc->spc_mtx);

Reply via email to