Module Name: src Committed By: christos Date: Fri Apr 26 18:29:55 UTC 2013
Modified Files: src/lib/libc/stdlib: Makefile.inc atexit.3 atexit.c exit.3 Added Files: src/lib/libc/stdlib: at_quick_exit.3 quick_exit.3 quick_exit.c Log Message: add {at_,}quick_exit(3) from FreeBSD To generate a diff of this commit: cvs rdiff -u -r1.78 -r1.79 src/lib/libc/stdlib/Makefile.inc cvs rdiff -u -r0 -r1.1 src/lib/libc/stdlib/at_quick_exit.3 \ src/lib/libc/stdlib/quick_exit.3 src/lib/libc/stdlib/quick_exit.c cvs rdiff -u -r1.9 -r1.10 src/lib/libc/stdlib/atexit.3 cvs rdiff -u -r1.24 -r1.25 src/lib/libc/stdlib/atexit.c cvs rdiff -u -r1.15 -r1.16 src/lib/libc/stdlib/exit.3 Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libc/stdlib/Makefile.inc diff -u src/lib/libc/stdlib/Makefile.inc:1.78 src/lib/libc/stdlib/Makefile.inc:1.79 --- src/lib/libc/stdlib/Makefile.inc:1.78 Wed Sep 14 19:33:51 2011 +++ src/lib/libc/stdlib/Makefile.inc Fri Apr 26 14:29:55 2013 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile.inc,v 1.78 2011/09/14 23:33:51 christos Exp $ +# $NetBSD: Makefile.inc,v 1.79 2013/04/26 18:29:55 christos Exp $ # from: @(#)Makefile.inc 8.3 (Berkeley) 2/4/95 # stdlib sources @@ -11,7 +11,7 @@ SRCS+= _env.c _rand48.c \ hcreate.c heapsort.c imaxdiv.c insque.c jrand48.c l64a.c lldiv.c \ lcong48.c lrand48.c lsearch.c merge.c mi_vector_hash.c mrand48.c \ nrand48.c putenv.c qabs.c qdiv.c qsort.c posix_openpt.c pty.c \ - radixsort.c rand.c rand_r.c random.c remque.c \ + quick_exit.c radixsort.c rand.c rand_r.c random.c remque.c \ seed48.c setenv.c srand48.c strsuftoll.c \ strtoimax.c strtol.c strtoll.c strtoq.c strtoul.c strtoull.c \ strtoumax.c strtouq.c system.c tdelete.c tfind.c tsearch.c twalk.c \ @@ -38,6 +38,7 @@ CPPFLAGS.strtouq.c+= -I${LIBCDIR}/../../ .include "${ARCHDIR}/stdlib/Makefile.inc" MAN+= a64l.3 abort.3 abs.3 alloca.3 atexit.3 atof.3 atoi.3 atol.3 atoll.3 \ + at_quick_exit.3 \ bsearch.3 \ div.3 \ exit.3 \ @@ -48,7 +49,7 @@ MAN+= a64l.3 abort.3 abs.3 alloca.3 atex lsearch.3 \ malloc.3 memory.3 mi_vector_hash.3 \ posix_memalign.3 posix_openpt.3 ptsname.3 \ - qabs.3 qdiv.3 qsort.3 \ + qabs.3 qdiv.3 quick_exit.3 qsort.3 \ radixsort.3 rand48.3 rand.3 random.3 \ strfmon.3 strsuftoll.3 strtod.3 strtol.3 strtoul.3 system.3 \ tsearch.3 \ Index: src/lib/libc/stdlib/atexit.3 diff -u src/lib/libc/stdlib/atexit.3:1.9 src/lib/libc/stdlib/atexit.3:1.10 --- src/lib/libc/stdlib/atexit.3:1.9 Thu Aug 7 12:43:38 2003 +++ src/lib/libc/stdlib/atexit.3 Fri Apr 26 14:29:55 2013 @@ -1,4 +1,4 @@ -.\" $NetBSD: atexit.3,v 1.9 2003/08/07 16:43:38 agc Exp $ +.\" $NetBSD: atexit.3,v 1.10 2013/04/26 18:29:55 christos Exp $ .\" .\" Copyright (c) 1990, 1991, 1993 .\" The Regents of the University of California. All rights reserved. @@ -68,7 +68,9 @@ No memory was available to add the funct The existing list of functions is unmodified. .El .Sh SEE ALSO +.Xr at_quick_exit 3 .Xr exit 3 +.Xr quick_exit 3 .Sh STANDARDS The .Fn atexit Index: src/lib/libc/stdlib/atexit.c diff -u src/lib/libc/stdlib/atexit.c:1.24 src/lib/libc/stdlib/atexit.c:1.25 --- src/lib/libc/stdlib/atexit.c:1.24 Thu Oct 8 12:33:45 2009 +++ src/lib/libc/stdlib/atexit.c Fri Apr 26 14:29:55 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: atexit.c,v 1.24 2009/10/08 16:33:45 pooka Exp $ */ +/* $NetBSD: atexit.c,v 1.25 2013/04/26 18:29:55 christos Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> #if defined(LIBC_SCCS) && !defined(lint) -__RCSID("$NetBSD: atexit.c,v 1.24 2009/10/08 16:33:45 pooka Exp $"); +__RCSID("$NetBSD: atexit.c,v 1.25 2013/04/26 18:29:55 christos Exp $"); #endif /* LIBC_SCCS and not lint */ #include "reentrant.h" @@ -74,7 +74,7 @@ static struct atexit_handler *atexit_han #ifdef _REENTRANT /* ..and a mutex to protect it all. */ -static mutex_t atexit_mutex; +mutex_t __atexit_mutex; #endif /* _REENTRANT */ void __libc_atexit_init(void) __attribute__ ((visibility("hidden"))); @@ -85,7 +85,7 @@ void __libc_atexit_init(void) __attribut * if possible. cxa_atexit handlers are never allocated from the static * pool. * - * atexit_mutex must be held. + * __atexit_mutex must be held. */ static struct atexit_handler * atexit_handler_alloc(void *dso) @@ -105,7 +105,7 @@ atexit_handler_alloc(void *dso) /* * Either no static slot was free, or this is a cxa_atexit - * handler. Allocate a new one. We keep the atexit_mutex + * handler. Allocate a new one. We keep the __atexit_mutex * held to prevent handlers from being run while we (potentially) * block in malloc(). */ @@ -114,7 +114,7 @@ atexit_handler_alloc(void *dso) } /* - * Initialize atexit_mutex with the PTHREAD_MUTEX_RECURSIVE attribute. + * Initialize __atexit_mutex with the PTHREAD_MUTEX_RECURSIVE attribute. * Note that __cxa_finalize may generate calls to __cxa_atexit. */ void @@ -123,7 +123,7 @@ __libc_atexit_init(void) mutexattr_t atexit_mutex_attr; mutexattr_init(&atexit_mutex_attr); mutexattr_settype(&atexit_mutex_attr, PTHREAD_MUTEX_RECURSIVE); - mutex_init(&atexit_mutex, &atexit_mutex_attr); + mutex_init(&__atexit_mutex, &atexit_mutex_attr); } /* @@ -140,11 +140,11 @@ __cxa_atexit(void (*func)(void *), void _DIAGASSERT(func != NULL); - mutex_lock(&atexit_mutex); + mutex_lock(&__atexit_mutex); ah = atexit_handler_alloc(dso); if (ah == NULL) { - mutex_unlock(&atexit_mutex); + mutex_unlock(&__atexit_mutex); return (-1); } @@ -155,7 +155,7 @@ __cxa_atexit(void (*func)(void *), void ah->ah_next = atexit_handler_stack; atexit_handler_stack = ah; - mutex_unlock(&atexit_mutex); + mutex_unlock(&__atexit_mutex); return (0); } @@ -175,7 +175,7 @@ __cxa_finalize(void *dso) void (*cxa_func)(void *); void (*atexit_func)(void); - mutex_lock(&atexit_mutex); + mutex_lock(&__atexit_mutex); call_depth++; /* @@ -220,7 +220,7 @@ again: prevp = &ah->ah_next; } call_depth--; - mutex_unlock(&atexit_mutex); + mutex_unlock(&__atexit_mutex); if (call_depth > 0) return; Index: src/lib/libc/stdlib/exit.3 diff -u src/lib/libc/stdlib/exit.3:1.15 src/lib/libc/stdlib/exit.3:1.16 --- src/lib/libc/stdlib/exit.3:1.15 Mon Jan 2 10:55:29 2012 +++ src/lib/libc/stdlib/exit.3 Fri Apr 26 14:29:55 2013 @@ -1,4 +1,4 @@ -.\" $NetBSD: exit.3,v 1.15 2012/01/02 15:55:29 dholland Exp $ +.\" $NetBSD: exit.3,v 1.16 2013/04/26 18:29:55 christos Exp $ .\" .\" Copyright (c) 1990, 1991, 1993 .\" The Regents of the University of California. All rights reserved. @@ -98,8 +98,10 @@ function never returns. .Sh SEE ALSO .Xr _exit 2 , +.Xr at_quick_exit 3 , .Xr atexit 3 , .Xr intro 3 , +.Xr quick_exit 3 , .Xr tmpfile 3 .Sh STANDARDS The Added files: Index: src/lib/libc/stdlib/at_quick_exit.3 diff -u /dev/null src/lib/libc/stdlib/at_quick_exit.3:1.1 --- /dev/null Fri Apr 26 14:29:55 2013 +++ src/lib/libc/stdlib/at_quick_exit.3 Fri Apr 26 14:29:55 2013 @@ -0,0 +1,63 @@ +.\" $NetBSD: at_quick_exit.3,v 1.1 2013/04/26 18:29:55 christos Exp $ +.\" Copyright (c) 2011 David Chisnall +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD: src/lib/libc/stdlib/at_quick_exit.3,v 1.5 2012/11/17 01:49:41 svnexp Exp $ +.\" +.Dd December 7, 2011 +.Dt AT_QUICK_EXIT 3 +.Os +.Sh NAME +.Nm at_quick_exit +.Nd registers a cleanup function to run on quick exit +.Sh LIBRARY +.Lb libc +.Sh SYNOPSIS +.In stdlib.h +.Ft int +.Fn at_quick_exit "void (*func)(void)" +.Sh DESCRIPTION +The +.Fn at_quick_exit +function registers a cleanup function to be called when the program exits as a +result of calling +.Xr quick_exit 3 . +The cleanup functions are called in the reverse order and will not be called if +the program exits by calling +.Xr exit 3 , +.Xr _Exit 3 , +or +.Xr abort 3 . +.Sh RETURN VALUES +The +.Fn at_quick_exit +function returns the value 0 if successful and a non-zero value on failure. +.Sh SEE ALSO +.Xr exit 3 , +.Xr quick_exit 3 +.Sh STANDARDS +The +.Fn at_quick_exit +function conforms to +.St -isoC-2011 . Index: src/lib/libc/stdlib/quick_exit.3 diff -u /dev/null src/lib/libc/stdlib/quick_exit.3:1.1 --- /dev/null Fri Apr 26 14:29:55 2013 +++ src/lib/libc/stdlib/quick_exit.3 Fri Apr 26 14:29:55 2013 @@ -0,0 +1,59 @@ +.\" $NetBSD: quick_exit.3,v 1.1 2013/04/26 18:29:55 christos Exp $ +.\" Copyright (c) 2011 David Chisnall +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD: src/lib/libc/stdlib/quick_exit.3,v 1.4 2012/11/17 01:49:41 svnexp Exp $ +.\" +.Dd December 7, 2011 +.Dt QUICK_EXIT 3 +.Os +.Sh NAME +.Nm quick_exit +.Nd exits a program quickly, running minimal cleanup +.Sh LIBRARY +.Lb libc +.Sh SYNOPSIS +.In stdlib.h +.Ft _Noreturn void +.Fn quick_exit "void" +.Sh DESCRIPTION +The +.Fn quick_exit +function exits the program quickly calling any cleanup functions registered +with +.Xr at_quick_exit 3 +but not any C++ destructors or cleanup code registered with +.Xr atexit 3 . +.Sh RETURN VALUES +The +.Fn quick_exit +function does not return. +.Sh SEE ALSO +.Xr at_quick_exit 3 , +.Xr exit 3 +.Sh STANDARDS +The +.Fn quick_exit +function conforms to +.St -isoC-2011 . Index: src/lib/libc/stdlib/quick_exit.c diff -u /dev/null src/lib/libc/stdlib/quick_exit.c:1.1 --- /dev/null Fri Apr 26 14:29:55 2013 +++ src/lib/libc/stdlib/quick_exit.c Fri Apr 26 14:29:55 2013 @@ -0,0 +1,93 @@ +/* $NetBSD: quick_exit.c,v 1.1 2013/04/26 18:29:55 christos Exp $ */ + +/*- + * Copyright (c) 2011 David Chisnall + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: src/lib/libc/stdlib/quick_exit.c,v 1.4 2012/11/17 01:49:41 svnexp Exp $ + */ +#include <sys/cdefs.h> +__RCSID("$NetBSD: quick_exit.c,v 1.1 2013/04/26 18:29:55 christos Exp $"); + +#include "namespace.h" +#include "reentrant.h" + +#include <stdlib.h> + +/** + * Linked list of quick exit handlers. This is simpler than the atexit() + * version, because it is not required to support C++ destructors or + * DSO-specific cleanups. + */ +struct quick_exit_handler { + struct quick_exit_handler *next; + void (*cleanup)(void); +}; + +/** + * Lock protecting the handlers list. + */ +#ifdef _REENTRANT +extern mutex_t __atexit_mutex; +#endif + +/** + * Stack of cleanup handlers. These will be invoked in reverse order when + */ +static struct quick_exit_handler *handlers; + +int +at_quick_exit(void (*func)(void)) +{ + struct quick_exit_handler *h; + + h = malloc(sizeof(*h)); + + if (NULL == h) + return 1; + h->cleanup = func; +#ifdef _REENTRANT + mutex_lock(&__atexit_mutex); +#endif + h->next = handlers; + handlers = h; +#ifdef _REENTRANT + mutex_unlock(&__atexit_mutex); +#endif + return 0; +} + +void +quick_exit(int status) +{ + struct quick_exit_handler *h; + + /* + * XXX: The C++ spec requires us to call std::terminate if there is an + * exception here. + */ + for (h = handlers; NULL != h; h = h->next) + (*h->cleanup)(); + _Exit(status); +}