Module Name: src Committed By: pooka Date: Fri Nov 26 14:37:08 UTC 2010
Modified Files: src/lib/librumpuser: rumpuser_sp.c sp_common.c Log Message: Improve reliability in cases where client disconnects mid-operation. To generate a diff of this commit: cvs rdiff -u -r1.16 -r1.17 src/lib/librumpuser/rumpuser_sp.c cvs rdiff -u -r1.10 -r1.11 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.16 src/lib/librumpuser/rumpuser_sp.c:1.17 --- src/lib/librumpuser/rumpuser_sp.c:1.16 Fri Nov 26 10:59:14 2010 +++ src/lib/librumpuser/rumpuser_sp.c Fri Nov 26 14:37:08 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: rumpuser_sp.c,v 1.16 2010/11/26 10:59:14 pooka Exp $ */ +/* $NetBSD: rumpuser_sp.c,v 1.17 2010/11/26 14:37:08 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.16 2010/11/26 10:59:14 pooka Exp $"); +__RCSID("$NetBSD: rumpuser_sp.c,v 1.17 2010/11/26 14:37:08 pooka Exp $"); #include <sys/types.h> #include <sys/atomic.h> @@ -345,6 +345,13 @@ spc->spc_dying = 1; kickall(spc); pthread_mutex_unlock(&spc->spc_mtx); + + /* + * Nobody's going to attempt to send/receive anymore, + * so reinit info relevant to that. + */ + memset((char *)spc + SPC_ZEROFF, 0, sizeof(*spc) - SPC_ZEROFF); + spcrelease(spc); } Index: src/lib/librumpuser/sp_common.c diff -u src/lib/librumpuser/sp_common.c:1.10 src/lib/librumpuser/sp_common.c:1.11 --- src/lib/librumpuser/sp_common.c:1.10 Thu Nov 25 17:59:02 2010 +++ src/lib/librumpuser/sp_common.c Fri Nov 26 14:37:08 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: sp_common.c,v 1.10 2010/11/25 17:59:02 pooka Exp $ */ +/* $NetBSD: sp_common.c,v 1.11 2010/11/26 14:37:08 pooka Exp $ */ /* * Copyright (c) 2010 Antti Kantee. All Rights Reserved. @@ -47,6 +47,7 @@ #include <poll.h> #include <pthread.h> #include <stdarg.h> +#include <stddef.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -123,22 +124,24 @@ int spc_refcnt; int spc_dying; + pthread_mutex_t spc_mtx; + pthread_cond_t spc_cv; + struct lwp *spc_mainlwp; pid_t spc_pid; + TAILQ_HEAD(, respwait) spc_respwait; + + /* rest of the fields are zeroed upon disconnect */ +#define SPC_ZEROFF offsetof(struct spclient, spc_pid) struct pollfd *spc_pfd; struct rsp_hdr spc_hdr; uint8_t *spc_buf; size_t spc_off; - pthread_mutex_t spc_mtx; - pthread_cond_t spc_cv; - uint64_t spc_nextreq; int spc_ostatus, spc_istatus; - - TAILQ_HEAD(, respwait) spc_respwait; }; #define SPCSTATUS_FREE 0 #define SPCSTATUS_BUSY 1 @@ -249,7 +252,7 @@ } DPRINTF(("rump_sp: client %p woke up waiter at %p\n", spc, rw)); rw->rw_data = spc->spc_buf; - rw->rw_dlen = (size_t)spc->spc_off; + rw->rw_dlen = (size_t)(spc->spc_off - HDRSZ); pthread_cond_signal(&rw->rw_cv); pthread_mutex_unlock(&spc->spc_mtx); @@ -292,7 +295,7 @@ case -1: rv = errno; spc->spc_dying = 1; - break; + goto cleanup; default: break; } @@ -311,6 +314,7 @@ break; } } + cleanup: pthread_mutex_lock(&spc->spc_mtx); if (spc->spc_istatus == SPCSTATUS_WANTED) kickall(spc); @@ -326,6 +330,8 @@ pthread_cond_destroy(&rw->rw_cv); + if (rv == 0 && spc->spc_dying) + rv = ENOTCONN; return rv; }