summaryrefslogtreecommitdiff
path: root/lib/libc/stdlib
diff options
context:
space:
mode:
authorMarco S Hyman <marc@cvs.openbsd.org>2002-11-05 22:19:57 +0000
committerMarco S Hyman <marc@cvs.openbsd.org>2002-11-05 22:19:57 +0000
commit18f91d47d9735c52e8c411d33ddfd95db158838b (patch)
treecb9f8328e35c7aa89eff800e8104ac42f6f06526 /lib/libc/stdlib
parentadc2ae85730a0252b7aa8c29f3bb73a13e81ea76 (diff)
thread safe libc -- 2nd try. OK miod@, millert@
Thanks to miod@ for m68k and vax fixes
Diffstat (limited to 'lib/libc/stdlib')
-rw-r--r--lib/libc/stdlib/abort.c10
-rw-r--r--lib/libc/stdlib/malloc.c57
2 files changed, 14 insertions, 53 deletions
diff --git a/lib/libc/stdlib/abort.c b/lib/libc/stdlib/abort.c
index 7252cd8a8b2..a833a1a8b78 100644
--- a/lib/libc/stdlib/abort.c
+++ b/lib/libc/stdlib/abort.c
@@ -32,7 +32,7 @@
*/
#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 */
#include <signal.h>
@@ -55,11 +55,7 @@ abort()
* any errors -- X311J doesn't allow abort to return anyway.
*/
sigdelset(&mask, SIGABRT);
-#ifdef _THREAD_SAFE
(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
@@ -80,11 +76,7 @@ abort()
* it again, only harder.
*/
(void)signal(SIGABRT, SIG_DFL);
-#ifdef _THREAD_SAFE
(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);
exit(1);
}
diff --git a/lib/libc/stdlib/malloc.c b/lib/libc/stdlib/malloc.c
index 2ebc1eff05f..3cdacc59b9f 100644
--- a/lib/libc/stdlib/malloc.c
+++ b/lib/libc/stdlib/malloc.c
@@ -8,7 +8,7 @@
*/
#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 */
/*
@@ -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 <errno.h>
+#include "thread_private.h"
+
/*
* 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
#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.
*
@@ -494,7 +463,7 @@ malloc_init ()
int i, j;
int save_errno = errno;
- THREAD_LOCK_INIT();
+ _MALLOC_LOCK_INIT();
INIT_MMAP();
@@ -1244,17 +1213,17 @@ malloc(size_t size)
register void *r;
malloc_func = " in malloc():";
- THREAD_LOCK();
+ _MALLOC_LOCK();
if (malloc_active++) {
wrtwarning("recursive call.\n");
malloc_active--;
- THREAD_UNLOCK();
+ _MALLOC_UNLOCK();
return (0);
}
r = imalloc(size);
UTRACE(0, size, r);
malloc_active--;
- THREAD_UNLOCK();
+ _MALLOC_UNLOCK();
if (malloc_xmalloc && !r)
wrterror("out of memory.\n");
return (r);
@@ -1264,17 +1233,17 @@ void
free(void *ptr)
{
malloc_func = " in free():";
- THREAD_LOCK();
+ _MALLOC_LOCK();
if (malloc_active++) {
wrtwarning("recursive call.\n");
malloc_active--;
- THREAD_UNLOCK();
+ _MALLOC_UNLOCK();
return;
}
ifree(ptr);
UTRACE(ptr, 0, 0);
malloc_active--;
- THREAD_UNLOCK();
+ _MALLOC_UNLOCK();
return;
}
@@ -1284,11 +1253,11 @@ realloc(void *ptr, size_t size)
register void *r;
malloc_func = " in realloc():";
- THREAD_LOCK();
+ _MALLOC_LOCK();
if (malloc_active++) {
wrtwarning("recursive call.\n");
malloc_active--;
- THREAD_UNLOCK();
+ _MALLOC_UNLOCK();
return (0);
}
if (!ptr) {
@@ -1298,7 +1267,7 @@ realloc(void *ptr, size_t size)
}
UTRACE(ptr, size, r);
malloc_active--;
- THREAD_UNLOCK();
+ _MALLOC_UNLOCK();
if (malloc_xmalloc && !r)
wrterror("out of memory.\n");
return (r);