diff options
author | 2017-09-05 02:40:54 +0000 | |
---|---|---|
committer | 2017-09-05 02:40:54 +0000 | |
commit | a5511fa9f431600dbd6dc2b46fc4e6b73e7d239c (patch) | |
tree | bf9e27f29ab35e6599d4c1362a9902d7e7bfdc74 /lib/libc/thread/callbacks.c | |
parent | Serialize access to IP reassembly queue with a mutex. This lets (diff) | |
download | wireguard-openbsd-a5511fa9f431600dbd6dc2b46fc4e6b73e7d239c.tar.xz wireguard-openbsd-a5511fa9f431600dbd6dc2b46fc4e6b73e7d239c.zip |
Move mutex, condvar, and thread-specific data routes, pthread_once, and
pthread_exit from libpthread to libc, along with low-level bits to
support them. Major bump to both libc and libpthread.
Requested by libressl team. Ports testing by naddy@
ok kettenis@
Diffstat (limited to 'lib/libc/thread/callbacks.c')
-rw-r--r-- | lib/libc/thread/callbacks.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/lib/libc/thread/callbacks.c b/lib/libc/thread/callbacks.c index c76811dd246..e38cf205a54 100644 --- a/lib/libc/thread/callbacks.c +++ b/lib/libc/thread/callbacks.c @@ -14,12 +14,20 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include <pthread.h> #include <signal.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include "thread_private.h" +#include "rthread_cb.h" + +static __dead void +_thread_canceled(void) +{ + pthread_exit(PTHREAD_CANCELED); +} void _thread_set_callbacks(const struct thread_callbacks *cb, size_t len) @@ -37,6 +45,30 @@ _thread_set_callbacks(const struct thread_callbacks *cb, size_t len) if (sigprocmask(SIG_BLOCK, &allmask, &omask) == 0) { /* mprotect RW */ memcpy(&_thread_cb, cb, sizeof(_thread_cb)); + + /* + * These are supplied by libc, but only enabled + * here when we actually need to prep for doing MT. + */ + _thread_cb.tc_canceled = _thread_canceled; + _thread_cb.tc_flockfile = _thread_flockfile; + _thread_cb.tc_ftrylockfile = _thread_ftrylockfile; + _thread_cb.tc_funlockfile = _thread_funlockfile; + _thread_cb.tc_malloc_lock = _thread_malloc_lock; + _thread_cb.tc_malloc_unlock = _thread_malloc_unlock; + _thread_cb.tc_atexit_lock = _thread_atexit_lock; + _thread_cb.tc_atexit_unlock = _thread_atexit_unlock; + _thread_cb.tc_atfork_lock = _thread_atfork_lock; + _thread_cb.tc_atfork_unlock = _thread_atfork_unlock; + _thread_cb.tc_arc4_lock = _thread_arc4_lock; + _thread_cb.tc_arc4_unlock = _thread_arc4_unlock; + _thread_cb.tc_mutex_lock = _thread_mutex_lock; + _thread_cb.tc_mutex_unlock = _thread_mutex_unlock; + _thread_cb.tc_mutex_destroy = _thread_mutex_destroy; + _thread_cb.tc_tag_lock = _thread_tag_lock; + _thread_cb.tc_tag_unlock = _thread_tag_unlock; + _thread_cb.tc_tag_storage = _thread_tag_storage; + /* mprotect RO | LOCKPERM | NOUNMAP */ sigprocmask(SIG_SETMASK, &omask, NULL); } |