Make the atexit mutex recursive and initialize it in __libc_init()

as suggested by ad@, based on the patch provided by Sverre Froyen
in lib/37654.

Reviewed by ad@ and jmcneill@.
This commit is contained in:
xtraeme 2008-02-25 14:06:13 +00:00
parent 8b793ad476
commit 95157b046e
2 changed files with 20 additions and 5 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: initfini.c,v 1.3 2008/02/10 18:45:41 ad Exp $ */ /* $NetBSD: initfini.c,v 1.4 2008/02/25 14:06:13 xtraeme Exp $ */
/*- /*-
* Copyright (c) 2007 The NetBSD Foundation, Inc. * Copyright (c) 2007 The NetBSD Foundation, Inc.
@ -37,7 +37,7 @@
*/ */
#include <sys/cdefs.h> #include <sys/cdefs.h>
__RCSID("$NetBSD: initfini.c,v 1.3 2008/02/10 18:45:41 ad Exp $"); __RCSID("$NetBSD: initfini.c,v 1.4 2008/02/25 14:06:13 xtraeme Exp $");
#ifdef _LIBC #ifdef _LIBC
#include "namespace.h" #include "namespace.h"
@ -48,6 +48,7 @@ static void __libc_init(void) __attribute__((__constructor__, __used__));
void __guard_setup(void); void __guard_setup(void);
void __libc_thr_init(void); void __libc_thr_init(void);
void __libc_atomic_init(void); void __libc_atomic_init(void);
void __libc_atexit_init(void);
/* LINTED used */ /* LINTED used */
static void static void
@ -62,4 +63,7 @@ __libc_init(void)
/* Threads */ /* Threads */
__libc_thr_init(); __libc_thr_init();
/* Initialize the atexit mutexes */
__libc_atexit_init();
} }

View File

@ -1,4 +1,4 @@
/* $NetBSD: atexit.c,v 1.19 2007/08/08 01:05:34 kristerw Exp $ */ /* $NetBSD: atexit.c,v 1.20 2008/02/25 14:06:13 xtraeme Exp $ */
/*- /*-
* Copyright (c) 2003 The NetBSD Foundation, Inc. * Copyright (c) 2003 The NetBSD Foundation, Inc.
@ -38,7 +38,7 @@
#include <sys/cdefs.h> #include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint) #if defined(LIBC_SCCS) && !defined(lint)
__RCSID("$NetBSD: atexit.c,v 1.19 2007/08/08 01:05:34 kristerw Exp $"); __RCSID("$NetBSD: atexit.c,v 1.20 2008/02/25 14:06:13 xtraeme Exp $");
#endif /* LIBC_SCCS and not lint */ #endif /* LIBC_SCCS and not lint */
#include "reentrant.h" #include "reentrant.h"
@ -81,9 +81,11 @@ static struct atexit_handler *atexit_handler_stack;
#ifdef _REENTRANT #ifdef _REENTRANT
/* ..and a mutex to protect it all. */ /* ..and a mutex to protect it all. */
static mutex_t atexit_mutex = MUTEX_INITIALIZER; static mutex_t atexit_mutex;
#endif /* _REENTRANT */ #endif /* _REENTRANT */
void __libc_atexit_init(void) __attribute__ ((visibility("hidden")));
/* /*
* Allocate an atexit handler descriptor. If "dso" is NULL, it indicates * Allocate an atexit handler descriptor. If "dso" is NULL, it indicates
* a normal atexit handler, which must be allocated from the static pool, * a normal atexit handler, which must be allocated from the static pool,
@ -118,6 +120,15 @@ atexit_handler_alloc(void *dso)
return (ah); return (ah);
} }
void
__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);
}
/* /*
* Register an atexit routine. This is suitable either for a cxa_atexit * Register an atexit routine. This is suitable either for a cxa_atexit
* or normal atexit type handler. The __cxa_atexit() name and arguments * or normal atexit type handler. The __cxa_atexit() name and arguments