summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libc/include/thread_private.h70
-rw-r--r--src/lib/libc/stdlib/abort.c10
-rw-r--r--src/lib/libc/stdlib/malloc.c57
3 files changed, 44 insertions, 93 deletions
diff --git a/src/lib/libc/include/thread_private.h b/src/lib/libc/include/thread_private.h
index 8cf06a86c4..976e330cac 100644
--- a/src/lib/libc/include/thread_private.h
+++ b/src/lib/libc/include/thread_private.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: thread_private.h,v 1.11 2002/02/16 21:27:23 millert Exp $ */ 1/* $OpenBSD: thread_private.h,v 1.12 2002/11/03 20:36:43 marc Exp $ */
2 2
3#ifndef _THREAD_PRIVATE_H_ 3#ifndef _THREAD_PRIVATE_H_
4#define _THREAD_PRIVATE_H_ 4#define _THREAD_PRIVATE_H_
@@ -18,19 +18,7 @@ extern int __isthreaded;
18 * Use WEAK_NAME(n) to get a libc-private name for n (_weak_n), 18 * Use WEAK_NAME(n) to get a libc-private name for n (_weak_n),
19 * WEAK_ALIAS(n) to generate the weak symbol n pointing to _weak_n, 19 * WEAK_ALIAS(n) to generate the weak symbol n pointing to _weak_n,
20 * WEAK_PROTOTYPE(n) to generate a prototype for _weak_n (based on n). 20 * WEAK_PROTOTYPE(n) to generate a prototype for _weak_n (based on n).
21 *
22 * If the symbol _NO_WEAK_ALIASES is defined, then symbols will be
23 */ 21 */
24
25#ifdef _NO_WEAK_ALIASES
26#ifdef _THREAD_SAFE
27#define WEAK_NAME(name) __CONCAT(_weak,name)
28#else
29#define WEAK_NAME(name) name
30#endif
31#define WEAK_ALIAS(name) /* unavailable */
32#define WEAK_PROTOTYPE(name) /* unnecessary */
33#else /* !_NO_WEAK_ALIASES */
34#define WEAK_NAME(name) __CONCAT(_weak_,name) 22#define WEAK_NAME(name) __CONCAT(_weak_,name)
35#define WEAK_ALIAS(name) __weak_alias(name, WEAK_NAME(name)) 23#define WEAK_ALIAS(name) __weak_alias(name, WEAK_NAME(name))
36#ifdef __GNUC__ 24#ifdef __GNUC__
@@ -38,7 +26,6 @@ extern int __isthreaded;
38#else 26#else
39#define WEAK_PROTOTYPE(name) /* typeof() only in gcc */ 27#define WEAK_PROTOTYPE(name) /* typeof() only in gcc */
40#endif 28#endif
41#endif /* !_NO_WEAK_ALIASES */
42 29
43/* 30/*
44 * These macros help in making persistent storage thread-specific. 31 * These macros help in making persistent storage thread-specific.
@@ -62,7 +49,7 @@ struct _thread_private_key_struct {
62void _libc_private_storage_lock(pthread_mutex_t *); 49void _libc_private_storage_lock(pthread_mutex_t *);
63void _libc_private_storage_unlock(pthread_mutex_t *); 50void _libc_private_storage_unlock(pthread_mutex_t *);
64void * _libc_private_storage(volatile struct _thread_private_key_struct *, 51void * _libc_private_storage(volatile struct _thread_private_key_struct *,
65 void *, size_t, void *); 52 void *, size_t, void *);
66 53
67/* Declare a module mutex. */ 54/* Declare a module mutex. */
68#define _THREAD_PRIVATE_MUTEX(name) \ 55#define _THREAD_PRIVATE_MUTEX(name) \
@@ -97,18 +84,7 @@ void * _libc_private_storage(volatile struct _thread_private_key_struct *,
97 */ 84 */
98#define _THREAD_PRIVATE(keyname, storage, error) \ 85#define _THREAD_PRIVATE(keyname, storage, error) \
99 _libc_private_storage(&__THREAD_KEY_NAME(keyname), \ 86 _libc_private_storage(&__THREAD_KEY_NAME(keyname), \
100 &(storage), sizeof (storage), error) 87 &(storage), sizeof (storage), error)
101
102/*
103 * Macros for locking and unlocking FILEs. These test if the
104 * process is threaded to avoid locking when not required.
105 */
106#ifdef _FLOCK_DEBUG
107#define FLOCKFILE(fp) _flockfile_debug(fp, __FILE__, __LINE__)
108#else
109#define FLOCKFILE(fp) flockfile(fp)
110#endif
111#define FUNLOCKFILE(fp) funlockfile(fp)
112 88
113/* 89/*
114 * File descriptor locking definitions. 90 * File descriptor locking definitions.
@@ -117,19 +93,33 @@ void * _libc_private_storage(volatile struct _thread_private_key_struct *,
117#define FD_WRITE 0x2 93#define FD_WRITE 0x2
118#define FD_RDWR (FD_READ | FD_WRITE) 94#define FD_RDWR (FD_READ | FD_WRITE)
119 95
120#ifdef _LOCK_DEBUG 96#define _FD_LOCK(_fd,_type,_ts) \
121#define _FD_LOCK(_fd,_type,_ts) _thread_fd_lock_debug(_fd, _type, \ 97 _thread_fd_lock(_fd, _type, _ts, __FILE__, __LINE__)
122 _ts, __FILE__, __LINE__) 98#define _FD_UNLOCK(_fd,_type) \
123#define _FD_UNLOCK(_fd,_type) _thread_fd_unlock_debug(_fd, _type, \ 99 _thread_fd_unlock(_fd, _type, __FILE__, __LINE__)
124 __FILE__, __LINE__)
125#else
126#define _FD_LOCK(_fd,_type,_ts) _thread_fd_lock(_fd, _type, _ts)
127#define _FD_UNLOCK(_fd,_type) _thread_fd_unlock(_fd, _type)
128#endif
129 100
130int _thread_fd_lock(int, int, struct timespec *); 101int _thread_fd_lock(int, int, struct timespec *, const char *, int);
131int _thread_fd_lock_debug(int, int, struct timespec *, char *, int); 102void _thread_fd_unlock(int, int, const char *, int);
132void _thread_fd_unlock(int, int); 103
133void _thread_fd_unlock_debug(int, int, char *, int); 104/*
105 * malloc lock/unlock definitions
106 */
107# define _MALLOC_LOCK() do { \
108 if (__isthreaded) \
109 _thread_malloc_lock(); \
110 } while (0)
111# define _MALLOC_UNLOCK() do { \
112 if (__isthreaded) \
113 _thread_malloc_unlock();\
114 } while (0)
115# define _MALLOC_LOCK_INIT()do { \
116 if (__isthreaded) \
117 _thread_malloc_init();\
118 } while (0)
119
120
121void _thread_malloc_init(void);
122void _thread_malloc_lock(void);
123void _thread_malloc_unlock(void);
134 124
135#endif /* _THREAD_PRIVATE_H_ */ 125#endif /* _THREAD_PRIVATE_H_ */
diff --git a/src/lib/libc/stdlib/abort.c b/src/lib/libc/stdlib/abort.c
index 7057f9b1ad..6fffe3df7c 100644
--- a/src/lib/libc/stdlib/abort.c
+++ b/src/lib/libc/stdlib/abort.c
@@ -32,7 +32,7 @@
32 */ 32 */
33 33
34#if defined(LIBC_SCCS) && !defined(lint) 34#if defined(LIBC_SCCS) && !defined(lint)
35static char *rcsid = "$OpenBSD: abort.c,v 1.8 2002/09/14 22:03:14 dhartmei Exp $"; 35static char *rcsid = "$OpenBSD: abort.c,v 1.9 2002/11/03 20:36:43 marc Exp $";
36#endif /* LIBC_SCCS and not lint */ 36#endif /* LIBC_SCCS and not lint */
37 37
38#include <signal.h> 38#include <signal.h>
@@ -55,11 +55,7 @@ abort()
55 * any errors -- X311J doesn't allow abort to return anyway. 55 * any errors -- X311J doesn't allow abort to return anyway.
56 */ 56 */
57 sigdelset(&mask, SIGABRT); 57 sigdelset(&mask, SIGABRT);
58#ifdef _THREAD_SAFE
59 (void)_thread_sys_sigprocmask(SIG_SETMASK, &mask, (sigset_t *)NULL); 58 (void)_thread_sys_sigprocmask(SIG_SETMASK, &mask, (sigset_t *)NULL);
60#else /* _THREAD_SAFE */
61 (void)sigprocmask(SIG_SETMASK, &mask, (sigset_t *)NULL);
62#endif /* _THREAD_SAFE */
63 59
64 /* 60 /*
65 * POSIX requires we flush stdio buffers on abort 61 * POSIX requires we flush stdio buffers on abort
@@ -80,11 +76,7 @@ abort()
80 * it again, only harder. 76 * it again, only harder.
81 */ 77 */
82 (void)signal(SIGABRT, SIG_DFL); 78 (void)signal(SIGABRT, SIG_DFL);
83#ifdef _THREAD_SAFE
84 (void)_thread_sys_sigprocmask(SIG_SETMASK, &mask, (sigset_t *)NULL); 79 (void)_thread_sys_sigprocmask(SIG_SETMASK, &mask, (sigset_t *)NULL);
85#else /* _THREAD_SAFE */
86 (void)sigprocmask(SIG_SETMASK, &mask, (sigset_t *)NULL);
87#endif /* _THREAD_SAFE */
88 (void)kill(getpid(), SIGABRT); 80 (void)kill(getpid(), SIGABRT);
89 exit(1); 81 exit(1);
90} 82}
diff --git a/src/lib/libc/stdlib/malloc.c b/src/lib/libc/stdlib/malloc.c
index 4e90ce402e..3aff1bfb9c 100644
--- a/src/lib/libc/stdlib/malloc.c
+++ b/src/lib/libc/stdlib/malloc.c
@@ -8,7 +8,7 @@
8 */ 8 */
9 9
10#if defined(LIBC_SCCS) && !defined(lint) 10#if defined(LIBC_SCCS) && !defined(lint)
11static char rcsid[] = "$OpenBSD: malloc.c,v 1.48 2002/05/27 03:13:23 deraadt Exp $"; 11static char rcsid[] = "$OpenBSD: malloc.c,v 1.49 2002/11/03 20:36:43 marc Exp $";
12#endif /* LIBC_SCCS and not lint */ 12#endif /* LIBC_SCCS and not lint */
13 13
14/* 14/*
@@ -48,6 +48,8 @@ static char rcsid[] = "$OpenBSD: malloc.c,v 1.48 2002/05/27 03:13:23 deraadt Exp
48#include <fcntl.h> 48#include <fcntl.h>
49#include <errno.h> 49#include <errno.h>
50 50
51#include "thread_private.h"
52
51/* 53/*
52 * The basic parameters you can tweak. 54 * The basic parameters you can tweak.
53 * 55 *
@@ -67,39 +69,6 @@ static char rcsid[] = "$OpenBSD: malloc.c,v 1.48 2002/05/27 03:13:23 deraadt Exp
67# define malloc_pageshift 13U 69# define malloc_pageshift 13U
68#endif /* __OpenBSD__ */ 70#endif /* __OpenBSD__ */
69 71
70#ifdef _THREAD_SAFE
71# include "thread_private.h"
72# if 0
73 /* kernel threads */
74# include <pthread.h>
75 static pthread_mutex_t malloc_lock;
76# define THREAD_LOCK() pthread_mutex_lock(&malloc_lock)
77# define THREAD_UNLOCK() pthread_mutex_unlock(&malloc_lock)
78# define THREAD_LOCK_INIT() pthread_mutex_init(&malloc_lock, 0);
79# else
80 /* user threads */
81# include "spinlock.h"
82 static spinlock_t malloc_lock = _SPINLOCK_INITIALIZER;
83# define THREAD_LOCK() if (__isthreaded) _SPINLOCK(&malloc_lock)
84# define THREAD_UNLOCK() if (__isthreaded) _SPINUNLOCK(&malloc_lock)
85# define THREAD_LOCK_INIT()
86 /*
87 * Malloc can't use the wrapped write() if it fails very early, so
88 * we use the unwrapped syscall _thread_sys_write()
89 */
90# define write _thread_sys_write
91 ssize_t write(int, const void *, size_t);
92# undef malloc
93# undef realloc
94# undef free
95# endif
96#else
97 /* no threads */
98# define THREAD_LOCK()
99# define THREAD_UNLOCK()
100# define THREAD_LOCK_INIT()
101#endif
102
103/* 72/*
104 * No user serviceable parts behind this point. 73 * No user serviceable parts behind this point.
105 * 74 *
@@ -494,7 +463,7 @@ malloc_init ()
494 int i, j; 463 int i, j;
495 int save_errno = errno; 464 int save_errno = errno;
496 465
497 THREAD_LOCK_INIT(); 466 _MALLOC_LOCK_INIT();
498 467
499 INIT_MMAP(); 468 INIT_MMAP();
500 469
@@ -1244,17 +1213,17 @@ malloc(size_t size)
1244 register void *r; 1213 register void *r;
1245 1214
1246 malloc_func = " in malloc():"; 1215 malloc_func = " in malloc():";
1247 THREAD_LOCK(); 1216 _MALLOC_LOCK();
1248 if (malloc_active++) { 1217 if (malloc_active++) {
1249 wrtwarning("recursive call.\n"); 1218 wrtwarning("recursive call.\n");
1250 malloc_active--; 1219 malloc_active--;
1251 THREAD_UNLOCK(); 1220 _MALLOC_UNLOCK();
1252 return (0); 1221 return (0);
1253 } 1222 }
1254 r = imalloc(size); 1223 r = imalloc(size);
1255 UTRACE(0, size, r); 1224 UTRACE(0, size, r);
1256 malloc_active--; 1225 malloc_active--;
1257 THREAD_UNLOCK(); 1226 _MALLOC_UNLOCK();
1258 if (malloc_xmalloc && !r) 1227 if (malloc_xmalloc && !r)
1259 wrterror("out of memory.\n"); 1228 wrterror("out of memory.\n");
1260 return (r); 1229 return (r);
@@ -1264,17 +1233,17 @@ void
1264free(void *ptr) 1233free(void *ptr)
1265{ 1234{
1266 malloc_func = " in free():"; 1235 malloc_func = " in free():";
1267 THREAD_LOCK(); 1236 _MALLOC_LOCK();
1268 if (malloc_active++) { 1237 if (malloc_active++) {
1269 wrtwarning("recursive call.\n"); 1238 wrtwarning("recursive call.\n");
1270 malloc_active--; 1239 malloc_active--;
1271 THREAD_UNLOCK(); 1240 _MALLOC_UNLOCK();
1272 return; 1241 return;
1273 } 1242 }
1274 ifree(ptr); 1243 ifree(ptr);
1275 UTRACE(ptr, 0, 0); 1244 UTRACE(ptr, 0, 0);
1276 malloc_active--; 1245 malloc_active--;
1277 THREAD_UNLOCK(); 1246 _MALLOC_UNLOCK();
1278 return; 1247 return;
1279} 1248}
1280 1249
@@ -1284,11 +1253,11 @@ realloc(void *ptr, size_t size)
1284 register void *r; 1253 register void *r;
1285 1254
1286 malloc_func = " in realloc():"; 1255 malloc_func = " in realloc():";
1287 THREAD_LOCK(); 1256 _MALLOC_LOCK();
1288 if (malloc_active++) { 1257 if (malloc_active++) {
1289 wrtwarning("recursive call.\n"); 1258 wrtwarning("recursive call.\n");
1290 malloc_active--; 1259 malloc_active--;
1291 THREAD_UNLOCK(); 1260 _MALLOC_UNLOCK();
1292 return (0); 1261 return (0);
1293 } 1262 }
1294 if (!ptr) { 1263 if (!ptr) {
@@ -1298,7 +1267,7 @@ realloc(void *ptr, size_t size)
1298 } 1267 }
1299 UTRACE(ptr, size, r); 1268 UTRACE(ptr, size, r);
1300 malloc_active--; 1269 malloc_active--;
1301 THREAD_UNLOCK(); 1270 _MALLOC_UNLOCK();
1302 if (malloc_xmalloc && !r) 1271 if (malloc_xmalloc && !r)
1303 wrterror("out of memory.\n"); 1272 wrterror("out of memory.\n");
1304 return (r); 1273 return (r);