summaryrefslogtreecommitdiffstats
path: root/lib/libc_r/uthread/uthread_init.c
diff options
context:
space:
mode:
authorjulian <julian@FreeBSD.org>1998-02-13 01:27:34 +0000
committerjulian <julian@FreeBSD.org>1998-02-13 01:27:34 +0000
commitb31dde27bfeaed94b1026c0788c4e98b1af47f3c (patch)
treefc79071c0e7ec3b06afa547a18a7327d4c544935 /lib/libc_r/uthread/uthread_init.c
parentb28763a6b13c1f0830c84238266c8ad69f7455bd (diff)
downloadFreeBSD-src-b31dde27bfeaed94b1026c0788c4e98b1af47f3c.zip
FreeBSD-src-b31dde27bfeaed94b1026c0788c4e98b1af47f3c.tar.gz
Fixes from Jeremy Allison and Terry Lambert for pthreads:
specifically: uthread_accept.c: Fix for inherited socket not getting correct entry in pthread flags. uthread_create.c: Fix to allow pthread_t pointer return to be null if caller doesn't care about return. uthread_fd.c: Fix for return codes to be placed into correct errno. uthread_init.c: Changes to make gcc-2.8 thread aware for exception stack frames (WARNING: This is #ifdef'ed out by default and is different from the Cygnus egcs fix). uthread_ioctl.c: Fix for blocking/non-blocking ioctl. uthread_kern.c: Signal handling fixes (only one case left to fix, that of an externally sent SIGSEGV and friends - a fairly unusual case). uthread_write.c: Fix for lock of fd - ask for write lock, not read/write. uthread_writev.c: Fix for lock of fd - ask for write lock, not read/write. Pthreads now works well enough to run the LDAP and ACAPD(with the gcc 2.8 fix) sample implementations.
Diffstat (limited to 'lib/libc_r/uthread/uthread_init.c')
-rw-r--r--lib/libc_r/uthread/uthread_init.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/lib/libc_r/uthread/uthread_init.c b/lib/libc_r/uthread/uthread_init.c
index 5833cdf..78967f4 100644
--- a/lib/libc_r/uthread/uthread_init.c
+++ b/lib/libc_r/uthread/uthread_init.c
@@ -46,6 +46,31 @@
#include "pthread_private.h"
extern int _thread_autoinit_dummy_decl;
+#ifdef GCC_2_8_MADE_THREAD_AWARE
+typedef void *** (*dynamic_handler_allocator)();
+extern void __set_dynamic_handler_allocator(dynamic_handler_allocator);
+
+static pthread_key_t except_head_key;
+
+typedef struct {
+ void **__dynamic_handler_chain;
+ void *top_elt[2];
+} except_struct;
+
+static void ***dynamic_allocator_handler_fn()
+{
+ except_struct *dh = (except_struct *)pthread_getspecific(except_head_key);
+
+ if(dh == NULL) {
+ dh = (except_struct *)malloc( sizeof(except_struct) );
+ memset(dh, '\0', sizeof(except_struct));
+ dh->__dynamic_handler_chain= dh->top_elt;
+ pthread_setspecific(except_head_key, (void *)dh);
+ }
+ return &dh->__dynamic_handler_chain;
+}
+#endif /* GCC_2_8_MADE_THREAD_AWARE */
+
/*
* Threaded process initialization
*/
@@ -55,7 +80,6 @@ _thread_init(void)
int flags;
int i;
struct sigaction act;
-
/* Ensure that the auto-initialization routine is linked in: */
_thread_autoinit_dummy_decl = 1;
@@ -200,6 +224,16 @@ _thread_init(void)
}
}
}
+
+#ifdef GCC_2_8_MADE_THREAD_AWARE
+ /* Create the thread-specific data for the exception linked list. */
+ if(pthread_key_create(&except_head_key, NULL) != 0)
+ PANIC("Failed to create thread specific execption head");
+
+ /* Setup the gcc exception handler per thread. */
+ __set_dynamic_handler_allocator( dynamic_allocator_handler_fn );
+#endif /* GCC_2_8_MADE_THREAD_AWARE */
+
return;
}
OpenPOWER on IntegriCloud