Module Name: src Committed By: pooka Date: Tue Jan 12 18:42:39 UTC 2010
Modified Files: src/lib/libpuffs: framebuf.c puffs.3 puffs.c puffs.h puffs_priv.h Log Message: Add convenience routine puffs_unmountonsignal(), which does exactly that. To generate a diff of this commit: cvs rdiff -u -r1.29 -r1.30 src/lib/libpuffs/framebuf.c cvs rdiff -u -r1.46 -r1.47 src/lib/libpuffs/puffs.3 cvs rdiff -u -r1.104 -r1.105 src/lib/libpuffs/puffs.c cvs rdiff -u -r1.113 -r1.114 src/lib/libpuffs/puffs.h cvs rdiff -u -r1.41 -r1.42 src/lib/libpuffs/puffs_priv.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libpuffs/framebuf.c diff -u src/lib/libpuffs/framebuf.c:1.29 src/lib/libpuffs/framebuf.c:1.30 --- src/lib/libpuffs/framebuf.c:1.29 Thu Sep 4 15:30:36 2008 +++ src/lib/libpuffs/framebuf.c Tue Jan 12 18:42:38 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: framebuf.c,v 1.29 2008/09/04 15:30:36 pooka Exp $ */ +/* $NetBSD: framebuf.c,v 1.30 2010/01/12 18:42:38 pooka Exp $ */ /* * Copyright (c) 2007 Antti Kantee. All Rights Reserved. @@ -35,7 +35,7 @@ #include <sys/cdefs.h> #if !defined(lint) -__RCSID("$NetBSD: framebuf.c,v 1.29 2008/09/04 15:30:36 pooka Exp $"); +__RCSID("$NetBSD: framebuf.c,v 1.30 2010/01/12 18:42:38 pooka Exp $"); #endif /* !lint */ #include <sys/types.h> @@ -783,11 +783,11 @@ struct puffs_fctrl_io *fio; struct kevent *newevs; struct kevent kev[2]; - size_t nfds; + size_t nevs; int rv, readenable; - nfds = pu->pu_nfds+1; - newevs = realloc(pu->pu_evs, (2*nfds) * sizeof(struct kevent)); + nevs = pu->pu_nevs+2; + newevs = realloc(pu->pu_evs, nevs*sizeof(struct kevent)); if (newevs == NULL) return -1; pu->pu_evs = newevs; @@ -824,7 +824,7 @@ fio->stat |= FIO_ENABLE_W; LIST_INSERT_HEAD(&pu->pu_ios, fio, fio_entries); - pu->pu_nfds = nfds; + pu->pu_nevs = nevs; return 0; } @@ -999,7 +999,7 @@ } /* don't bother with realloc */ - pu->pu_nfds--; + pu->pu_nevs -= 2; /* don't free us yet, might have some references in event arrays */ fio->stat |= FIO_DEAD; Index: src/lib/libpuffs/puffs.3 diff -u src/lib/libpuffs/puffs.3:1.46 src/lib/libpuffs/puffs.3:1.47 --- src/lib/libpuffs/puffs.3:1.46 Fri Feb 20 14:26:56 2009 +++ src/lib/libpuffs/puffs.3 Tue Jan 12 18:42:38 2010 @@ -1,4 +1,4 @@ -.\" $NetBSD: puffs.3,v 1.46 2009/02/20 14:26:56 pooka Exp $ +.\" $NetBSD: puffs.3,v 1.47 2010/01/12 18:42:38 pooka Exp $ .\" .\" Copyright (c) 2006, 2007, 2008 Antti Kantee. All rights reserved. .\" @@ -23,7 +23,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd December 12, 2008 +.Dd January 8, 2010 .Dt PUFFS 3 .Os .Sh NAME @@ -82,6 +82,8 @@ .Ft int .Fn puffs_mainloop "struct puffs_usermount *pu" .Ft int +.Fn puffs_unmountonsignal "int sig" "bool ignoresig" +.Ft int .Fo puffs_dispatch_create .Fa "struct puffs_usermount *pu" "struct puffs_framebuf *pb" .Fa "struct puffs_cc **pccp" @@ -438,6 +440,22 @@ .Xr puffs_framebuf 3 has been initialized, I/O from the relevant descriptors is processed automatically by the eventloop. +.It Fn puffs_unmountonsignal signum ignoresig +Cause all file servers within the process to initiate unmount upon +receipt of signal +.Ar signum . +This works only for servers which call +.Fn puffs_mainloop +and must be called before any server within the process enters the mainloop. +The process signal handler is still called before starting the unmount +procedure. +The parameter +.Ar ignoresig +is provided as a convenience and tells if to install a signal handler +to ignore +.Ar sig +so that the process will not e.g. terminate based on the default action +before the file system unmount can be initiated. .It Fn puffs_dispatch_create pu pb pccp .It Fn puffs_dispatch_exec pcc pbp In case the use of Index: src/lib/libpuffs/puffs.c diff -u src/lib/libpuffs/puffs.c:1.104 src/lib/libpuffs/puffs.c:1.105 --- src/lib/libpuffs/puffs.c:1.104 Thu Jan 7 23:03:26 2010 +++ src/lib/libpuffs/puffs.c Tue Jan 12 18:42:38 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs.c,v 1.104 2010/01/07 23:03:26 pooka Exp $ */ +/* $NetBSD: puffs.c,v 1.105 2010/01/12 18:42:38 pooka Exp $ */ /* * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> #if !defined(lint) -__RCSID("$NetBSD: puffs.c,v 1.104 2010/01/07 23:03:26 pooka Exp $"); +__RCSID("$NetBSD: puffs.c,v 1.105 2010/01/12 18:42:38 pooka Exp $"); #endif /* !lint */ #include <sys/param.h> @@ -731,6 +731,29 @@ return 0; } +/* no sigset_t static intializer */ +static int sigs[NSIG] = { 0, }; +static int sigcatch = 0; + +int +puffs_unmountonsignal(int sig, bool sigignore) +{ + + if (sig < 0 || sig >= (int)NSIG) { + errno = EINVAL; + return -1; + } + if (sigignore) + if (signal(sig, SIG_IGN) == SIG_ERR) + return -1; + + if (!sigs[sig]) + sigcatch++; + sigs[sig] = 1; + + return 0; +} + /* * Actual mainloop. This is called from a context which can block. * It is called either from puffs_mainloop (indirectly, via @@ -747,6 +770,7 @@ int ndone; while (puffs_getstate(pu) != PUFFS_STATE_UNMOUNTED) { + /* * Schedule existing requests. */ @@ -819,11 +843,10 @@ fio->stat &= ~FIO_WR; nchanges++; } - assert(nchanges <= pu->pu_nfds); } ndone = kevent(pu->pu_kq, pu->pu_evs, nchanges, - pu->pu_evs, 2*pu->pu_nfds, pu->pu_ml_timep); + pu->pu_evs, pu->pu_nevs, pu->pu_ml_timep); if (ndone == -1) { if (errno != EINTR) @@ -850,7 +873,10 @@ #endif fio = (void *)curev->udata; - pfctrl = fio->fctrl; + if (__predict_true(fio)) + pfctrl = fio->fctrl; + else + pfctrl = NULL; if (curev->flags & EV_ERROR) { assert(curev->filter == EVFILT_WRITE); fio->stat &= ~FIO_WR; @@ -872,6 +898,13 @@ puffs__framev_output(pu, pfctrl, fio); what |= PUFFS_FBIO_WRITE; } + + else if (__predict_false(curev->filter==EVFILT_SIGNAL)){ + if ((pu->pu_state & PU_DONEXIT) == 0) { + PU_SETSFLAG(pu, PU_DONEXIT); + puffs_exit(pu, 0); + } + } if (what) puffs__framev_notify(fio, what); } @@ -889,14 +922,14 @@ if (puffs__cc_restoremain(pu) == -1) warn("cannot restore main context. impending doom"); } - int puffs_mainloop(struct puffs_usermount *pu) { struct puffs_fctrl_io *fio; struct puffs_cc *pcc; struct kevent *curev; - int sverrno; + size_t nevs; + int sverrno, i; assert(puffs_getstate(pu) >= PUFFS_STATE_RUNNING); @@ -911,10 +944,12 @@ &pu->pu_framectrl[PU_FRAMECTRL_FS]) == -1) goto out; - curev = realloc(pu->pu_evs, (2*pu->pu_nfds)*sizeof(struct kevent)); + nevs = pu->pu_nevs + sigcatch; + curev = realloc(pu->pu_evs, nevs * sizeof(struct kevent)); if (curev == NULL) goto out; pu->pu_evs = curev; + pu->pu_nevs = nevs; LIST_FOREACH(fio, &pu->pu_ios, fio_entries) { EV_SET(curev, fio->io_fd, EVFILT_READ, EV_ADD, @@ -924,7 +959,15 @@ 0, 0, (uintptr_t)fio); curev++; } - if (kevent(pu->pu_kq, pu->pu_evs, 2*pu->pu_nfds, NULL, 0, NULL) == -1) + for (i = 0; i < NSIG; i++) { + if (sigs[i]) { + EV_SET(curev, i, EVFILT_SIGNAL, EV_ADD | EV_ENABLE, + 0, 0, 0); + curev++; + } + } + assert(curev - pu->pu_evs == (ssize_t)pu->pu_nevs); + if (kevent(pu->pu_kq, pu->pu_evs, pu->pu_nevs, NULL, 0, NULL) == -1) goto out; pu->pu_state |= PU_INLOOP; Index: src/lib/libpuffs/puffs.h diff -u src/lib/libpuffs/puffs.h:1.113 src/lib/libpuffs/puffs.h:1.114 --- src/lib/libpuffs/puffs.h:1.113 Sat Dec 5 20:54:10 2009 +++ src/lib/libpuffs/puffs.h Tue Jan 12 18:42:39 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs.h,v 1.113 2009/12/05 20:54:10 pooka Exp $ */ +/* $NetBSD: puffs.h,v 1.114 2010/01/12 18:42:39 pooka Exp $ */ /* * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. @@ -427,6 +427,8 @@ int puffs_mainloop(struct puffs_usermount *); int puffs_daemon(struct puffs_usermount *, int, int); +int puffs_unmountonsignal(int, bool); + int puffs_getselectable(struct puffs_usermount *); int puffs_setblockingmode(struct puffs_usermount *, int); Index: src/lib/libpuffs/puffs_priv.h diff -u src/lib/libpuffs/puffs_priv.h:1.41 src/lib/libpuffs/puffs_priv.h:1.42 --- src/lib/libpuffs/puffs_priv.h:1.41 Mon Aug 11 16:23:37 2008 +++ src/lib/libpuffs/puffs_priv.h Tue Jan 12 18:42:39 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs_priv.h,v 1.41 2008/08/11 16:23:37 pooka Exp $ */ +/* $NetBSD: puffs_priv.h,v 1.42 2010/01/12 18:42:39 pooka Exp $ */ /* * Copyright (c) 2006, 2007, 2008 Antti Kantee. All Rights Reserved. @@ -116,6 +116,7 @@ #define PU_HASKQ 0x0400 #define PU_PUFFSDAEMON 0x0800 #define PU_MAINRESTORE 0x1000 +#define PU_DONEXIT 0x2000 #define PU_SETSTATE(pu, s) (pu->pu_state = (s) | (pu->pu_state & ~PU_STATEMASK)) #define PU_SETSFLAG(pu, s) (pu->pu_state |= (s)) #define PU_CLRSFLAG(pu, s) \ @@ -149,7 +150,7 @@ LIST_HEAD(, puffs_fctrl_io) pu_ios; LIST_HEAD(, puffs_fctrl_io) pu_ios_rmlist; struct kevent *pu_evs; - size_t pu_nfds; + size_t pu_nevs; puffs_ml_loop_fn pu_ml_lfn; struct timespec pu_ml_timeout;