Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/lib/librumpuser improve threadsafety
details: https://anonhg.NetBSD.org/src/rev/193e3aedb80b
branches: trunk
changeset: 759014:193e3aedb80b
user: pooka <pooka%NetBSD.org@localhost>
date: Wed Nov 24 15:17:46 2010 +0000
description:
improve threadsafety
diffstat:
lib/librumpuser/rumpuser_sp.c | 39 +++++++++++++++++++++++----------------
1 files changed, 23 insertions(+), 16 deletions(-)
diffs (143 lines):
diff -r 5249a5dfe71d -r 193e3aedb80b lib/librumpuser/rumpuser_sp.c
--- a/lib/librumpuser/rumpuser_sp.c Wed Nov 24 14:56:18 2010 +0000
+++ b/lib/librumpuser/rumpuser_sp.c Wed Nov 24 15:17:46 2010 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: rumpuser_sp.c,v 1.11 2010/11/24 11:40:24 pooka Exp $ */
+/* $NetBSD: rumpuser_sp.c,v 1.12 2010/11/24 15:17:46 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.11 2010/11/24 11:40:24 pooka Exp $");
+__RCSID("$NetBSD: rumpuser_sp.c,v 1.12 2010/11/24 15:17:46 pooka Exp $");
#include <sys/types.h>
#include <sys/atomic.h>
@@ -308,7 +308,9 @@
if (ref > 0)
return;
- _DIAGASSERT(TAILQ_EMPTY(&spclist[i].spc_respwait));
+ DPRINTF(("spcrelease: spc %p fd %d\n", spc, spc->spc_fd));
+
+ _DIAGASSERT(TAILQ_EMPTY(spc->spc_respwait));
_DIAGASSERT(spc->spc_buf == NULL);
lwproc_switch(spc->spc_mainlwp);
@@ -317,9 +319,8 @@
close(spc->spc_fd);
spc->spc_fd = -1;
+ spc->spc_dying = 0;
- spc->spc_pfd->fd = -1;
- membar_producer();
atomic_inc_uint(&disco);
}
@@ -331,6 +332,12 @@
DPRINTF(("rump_sp: disconnecting [%u]\n", idx));
+ pfdlist[idx].fd = -1;
+ pfdlist[idx].revents = 0;
+ pthread_mutex_lock(&spc->spc_mtx);
+ spc->spc_dying = 1;
+ kickall(spc);
+ pthread_mutex_unlock(&spc->spc_mtx);
spcrelease(spc);
}
@@ -367,7 +374,7 @@
/* find empty slot the simple way */
for (i = 0; i < MAXCLI; i++) {
- if (pfdlist[i].fd == -1)
+ if (pfdlist[i].fd == -1 && spclist[i].spc_dying == 0)
break;
}
@@ -427,6 +434,7 @@
struct sysbouncearg *barg = arg;
serv_handlesyscall(barg->sba_spc, &barg->sba_hdr, barg->sba_data);
+ spcrelease(barg->sba_spc);
free(arg);
return NULL;
}
@@ -436,8 +444,11 @@
{
struct spclient *spc = arg;
void *rdata = NULL; /* XXXuninit */
+ int rv;
- copyin_req(spc, uaddr, len, &rdata);
+ rv = copyin_req(spc, uaddr, len, &rdata);
+ if (rv)
+ return EFAULT;
memcpy(kaddr, rdata, len);
free(rdata);
@@ -536,8 +547,6 @@
pfdlist[idx].events = POLLIN;
spc = &spclist[idx];
-
- spc->spc_pfd = &pfdlist[idx];
pthread_mutex_init(&spc->spc_mtx, NULL);
pthread_cond_init(&spc->spc_cv, NULL);
}
@@ -553,20 +562,20 @@
if (disco) {
int discoed;
- membar_consumer();
discoed = atomic_swap_uint(&disco, 0);
while (discoed--) {
nfds--;
idx = maxidx;
- while (idx--) {
+ while (idx) {
if (pfdlist[idx].fd != -1) {
maxidx = idx;
break;
}
- assert(idx != 0);
+ idx--;
}
DPRINTF(("rump_sp: set maxidx to [%u]\n",
maxidx));
+ assert(maxidx+1 >= nfds);
}
}
@@ -583,9 +592,7 @@
break;
}
- for (idx = 0; seen < rv; idx++) {
- assert(idx < MAXCLI);
-
+ for (idx = 0; seen < rv && idx < MAXCLI; idx++) {
if ((pfdlist[idx].revents & POLLIN) == 0)
continue;
@@ -594,7 +601,6 @@
idx, seen, rv));
if (idx > 0) {
spc = &spclist[idx];
-
DPRINTF(("rump_sp: mainloop read [%u]\n", idx));
switch (readframe(spc)) {
case 0:
@@ -627,6 +633,7 @@
nfds++;
if (idx > maxidx)
maxidx = idx;
+ DPRINTF(("rump_sp: maxid now %d\n", maxidx));
}
}
}
Home |
Main Index |
Thread Index |
Old Index