Annotation of src/lib/libc/stdlib/quick_exit.c, Revision 1.1
1.1 ! christos 1: /* $NetBSD$ */
! 2:
! 3: /*-
! 4: * Copyright (c) 2011 David Chisnall
! 5: * All rights reserved.
! 6: *
! 7: * Redistribution and use in source and binary forms, with or without
! 8: * modification, are permitted provided that the following conditions
! 9: * are met:
! 10: * 1. Redistributions of source code must retain the above copyright
! 11: * notice, this list of conditions and the following disclaimer.
! 12: * 2. Redistributions in binary form must reproduce the above copyright
! 13: * notice, this list of conditions and the following disclaimer in the
! 14: * documentation and/or other materials provided with the distribution.
! 15: *
! 16: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
! 17: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 18: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 19: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
! 20: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 21: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 22: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 23: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 24: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 25: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 26: * SUCH DAMAGE.
! 27: *
! 28: * $FreeBSD: src/lib/libc/stdlib/quick_exit.c,v 1.4 2012/11/17 01:49:41 svnexp Exp $
! 29: */
! 30: #include <sys/cdefs.h>
! 31: __RCSID("$NetBSD$");
! 32:
! 33: #include "namespace.h"
! 34: #include "reentrant.h"
! 35:
! 36: #include <stdlib.h>
! 37:
! 38: /**
! 39: * Linked list of quick exit handlers. This is simpler than the atexit()
! 40: * version, because it is not required to support C++ destructors or
! 41: * DSO-specific cleanups.
! 42: */
! 43: struct quick_exit_handler {
! 44: struct quick_exit_handler *next;
! 45: void (*cleanup)(void);
! 46: };
! 47:
! 48: /**
! 49: * Lock protecting the handlers list.
! 50: */
! 51: #ifdef _REENTRANT
! 52: extern mutex_t __atexit_mutex;
! 53: #endif
! 54:
! 55: /**
! 56: * Stack of cleanup handlers. These will be invoked in reverse order when
! 57: */
! 58: static struct quick_exit_handler *handlers;
! 59:
! 60: int
! 61: at_quick_exit(void (*func)(void))
! 62: {
! 63: struct quick_exit_handler *h;
! 64:
! 65: h = malloc(sizeof(*h));
! 66:
! 67: if (NULL == h)
! 68: return 1;
! 69: h->cleanup = func;
! 70: #ifdef _REENTRANT
! 71: mutex_lock(&__atexit_mutex);
! 72: #endif
! 73: h->next = handlers;
! 74: handlers = h;
! 75: #ifdef _REENTRANT
! 76: mutex_unlock(&__atexit_mutex);
! 77: #endif
! 78: return 0;
! 79: }
! 80:
! 81: void
! 82: quick_exit(int status)
! 83: {
! 84: struct quick_exit_handler *h;
! 85:
! 86: /*
! 87: * XXX: The C++ spec requires us to call std::terminate if there is an
! 88: * exception here.
! 89: */
! 90: for (h = handlers; NULL != h; h = h->next)
! 91: (*h->cleanup)();
! 92: _Exit(status);
! 93: }
CVSweb <webmaster@jp.NetBSD.org>