Browse Source

thread safe libc -- 2nd try. OK miod@, millert@


OPENBSD_3_3
marc 21 years ago
parent
commit
eefd3d97b6
2 changed files with 14 additions and 53 deletions
  1. +1
    -9
      src/lib/libc/stdlib/abort.c
  2. +13
    -44
      src/lib/libc/stdlib/malloc.c

+ 1
- 9
src/lib/libc/stdlib/abort.c View File

@ -32,7 +32,7 @@
*/ */
#if defined(LIBC_SCCS) && !defined(lint) #if defined(LIBC_SCCS) && !defined(lint)
static char *rcsid = "$OpenBSD: abort.c,v 1.10 2002/11/03 23:58:39 marc Exp $";
static char *rcsid = "$OpenBSD: abort.c,v 1.11 2002/11/05 22:19:55 marc Exp $";
#endif /* LIBC_SCCS and not lint */ #endif /* LIBC_SCCS and not lint */
#include <signal.h> #include <signal.h>
@ -55,11 +55,7 @@ abort()
* any errors -- X311J doesn't allow abort to return anyway. * any errors -- X311J doesn't allow abort to return anyway.
*/ */
sigdelset(&mask, SIGABRT); sigdelset(&mask, SIGABRT);
#ifdef _THREAD_SAFE
(void)_thread_sys_sigprocmask(SIG_SETMASK, &mask, (sigset_t *)NULL); (void)_thread_sys_sigprocmask(SIG_SETMASK, &mask, (sigset_t *)NULL);
#else /* _THREAD_SAFE */
(void)sigprocmask(SIG_SETMASK, &mask, (sigset_t *)NULL);
#endif /* _THREAD_SAFE */
/* /*
* POSIX requires we flush stdio buffers on abort * POSIX requires we flush stdio buffers on abort
@ -80,11 +76,7 @@ abort()
* it again, only harder. * it again, only harder.
*/ */
(void)signal(SIGABRT, SIG_DFL); (void)signal(SIGABRT, SIG_DFL);
#ifdef _THREAD_SAFE
(void)_thread_sys_sigprocmask(SIG_SETMASK, &mask, (sigset_t *)NULL); (void)_thread_sys_sigprocmask(SIG_SETMASK, &mask, (sigset_t *)NULL);
#else /* _THREAD_SAFE */
(void)sigprocmask(SIG_SETMASK, &mask, (sigset_t *)NULL);
#endif /* _THREAD_SAFE */
(void)kill(getpid(), SIGABRT); (void)kill(getpid(), SIGABRT);
exit(1); exit(1);
} }

+ 13
- 44
src/lib/libc/stdlib/malloc.c View File

@ -8,7 +8,7 @@
*/ */
#if defined(LIBC_SCCS) && !defined(lint) #if defined(LIBC_SCCS) && !defined(lint)
static char rcsid[] = "$OpenBSD: malloc.c,v 1.50 2002/11/03 23:58:39 marc Exp $";
static char rcsid[] = "$OpenBSD: malloc.c,v 1.51 2002/11/05 22:19:55 marc Exp $";
#endif /* LIBC_SCCS and not lint */ #endif /* LIBC_SCCS and not lint */
/* /*
@ -48,6 +48,8 @@ static char rcsid[] = "$OpenBSD: malloc.c,v 1.50 2002/11/03 23:58:39 marc Exp $"
#include <fcntl.h> #include <fcntl.h>
#include <errno.h> #include <errno.h>
#include "thread_private.h"
/* /*
* The basic parameters you can tweak. * The basic parameters you can tweak.
* *
@ -67,39 +69,6 @@ static char rcsid[] = "$OpenBSD: malloc.c,v 1.50 2002/11/03 23:58:39 marc Exp $"
# define malloc_pageshift 13U # define malloc_pageshift 13U
#endif /* __OpenBSD__ */ #endif /* __OpenBSD__ */
#ifdef _THREAD_SAFE
# include "thread_private.h"
# if 0
/* kernel threads */
# include <pthread.h>
static pthread_mutex_t malloc_lock;
# define THREAD_LOCK() pthread_mutex_lock(&malloc_lock)
# define THREAD_UNLOCK() pthread_mutex_unlock(&malloc_lock)
# define THREAD_LOCK_INIT() pthread_mutex_init(&malloc_lock, 0);
# else
/* user threads */
# include "spinlock.h"
static spinlock_t malloc_lock = _SPINLOCK_INITIALIZER;
# define THREAD_LOCK() if (__isthreaded) _SPINLOCK(&malloc_lock)
# define THREAD_UNLOCK() if (__isthreaded) _SPINUNLOCK(&malloc_lock)
# define THREAD_LOCK_INIT()
/*
* Malloc can't use the wrapped write() if it fails very early, so
* we use the unwrapped syscall _thread_sys_write()
*/
# define write _thread_sys_write
ssize_t write(int, const void *, size_t);
# undef malloc
# undef realloc
# undef free
# endif
#else
/* no threads */
# define THREAD_LOCK()
# define THREAD_UNLOCK()
# define THREAD_LOCK_INIT()
#endif
/* /*
* No user serviceable parts behind this point. * No user serviceable parts behind this point.
* *
@ -494,7 +463,7 @@ malloc_init ()
int i, j; int i, j;
int save_errno = errno; int save_errno = errno;
THREAD_LOCK_INIT();
_MALLOC_LOCK_INIT();
INIT_MMAP(); INIT_MMAP();
@ -1244,17 +1213,17 @@ malloc(size_t size)
register void *r; register void *r;
malloc_func = " in malloc():"; malloc_func = " in malloc():";
THREAD_LOCK();
_MALLOC_LOCK();
if (malloc_active++) { if (malloc_active++) {
wrtwarning("recursive call.\n"); wrtwarning("recursive call.\n");
malloc_active--; malloc_active--;
THREAD_UNLOCK();
_MALLOC_UNLOCK();
return (0); return (0);
} }
r = imalloc(size); r = imalloc(size);
UTRACE(0, size, r); UTRACE(0, size, r);
malloc_active--; malloc_active--;
THREAD_UNLOCK();
_MALLOC_UNLOCK();
if (malloc_xmalloc && !r) if (malloc_xmalloc && !r)
wrterror("out of memory.\n"); wrterror("out of memory.\n");
return (r); return (r);
@ -1264,17 +1233,17 @@ void
free(void *ptr) free(void *ptr)
{ {
malloc_func = " in free():"; malloc_func = " in free():";
THREAD_LOCK();
_MALLOC_LOCK();
if (malloc_active++) { if (malloc_active++) {
wrtwarning("recursive call.\n"); wrtwarning("recursive call.\n");
malloc_active--; malloc_active--;
THREAD_UNLOCK();
_MALLOC_UNLOCK();
return; return;
} }
ifree(ptr); ifree(ptr);
UTRACE(ptr, 0, 0); UTRACE(ptr, 0, 0);
malloc_active--; malloc_active--;
THREAD_UNLOCK();
_MALLOC_UNLOCK();
return; return;
} }
@ -1284,11 +1253,11 @@ realloc(void *ptr, size_t size)
register void *r; register void *r;
malloc_func = " in realloc():"; malloc_func = " in realloc():";
THREAD_LOCK();
_MALLOC_LOCK();
if (malloc_active++) { if (malloc_active++) {
wrtwarning("recursive call.\n"); wrtwarning("recursive call.\n");
malloc_active--; malloc_active--;
THREAD_UNLOCK();
_MALLOC_UNLOCK();
return (0); return (0);
} }
if (!ptr) { if (!ptr) {
@ -1298,7 +1267,7 @@ realloc(void *ptr, size_t size)
} }
UTRACE(ptr, size, r); UTRACE(ptr, size, r);
malloc_active--; malloc_active--;
THREAD_UNLOCK();
_MALLOC_UNLOCK();
if (malloc_xmalloc && !r) if (malloc_xmalloc && !r)
wrterror("out of memory.\n"); wrterror("out of memory.\n");
return (r); return (r);


Loading…
Cancel
Save