67e36b90b6
and adjust boehm-gc to deal with any number of holes that may appear between __data_start and _end. (requires -current binutils) - work-around libpthread bugs that prevent sigsuspend() from working in a signal handler by using pthread_suspend_np() + an arch/libpthread specific offset to obtain the suspended thread's stack pointer. thanks to sthen@ and jasper@ for access to other arches. discussed with todd@
45 lines
1.6 KiB
Plaintext
45 lines
1.6 KiB
Plaintext
$OpenBSD: patch-pthread_support_c,v 1.2 2008/04/01 17:41:13 kurt Exp $
|
|
--- pthread_support.c.orig Tue May 15 06:24:46 2007
|
|
+++ pthread_support.c Mon Feb 11 16:35:23 2008
|
|
@@ -774,6 +774,9 @@ void GC_thr_init(void)
|
|
# if defined(GC_NETBSD_THREADS)
|
|
GC_nprocs = get_ncpu();
|
|
# endif
|
|
+# if defined(GC_OPENBSD_THREADS)
|
|
+ GC_nprocs = 1;
|
|
+# endif
|
|
# if defined(GC_DARWIN_THREADS) || defined(GC_FREEBSD_THREADS)
|
|
int ncpus = 1;
|
|
size_t len = sizeof(ncpus);
|
|
@@ -848,7 +851,7 @@ void GC_init_parallel(void)
|
|
}
|
|
|
|
|
|
-#if !defined(GC_DARWIN_THREADS)
|
|
+#if !defined(GC_DARWIN_THREADS) && !defined(GC_OPENBSD_THREADS)
|
|
int WRAP_FUNC(pthread_sigmask)(int how, const sigset_t *set, sigset_t *oset)
|
|
{
|
|
sigset_t fudged_set;
|
|
@@ -1103,6 +1106,12 @@ void * GC_start_routine(void * arg)
|
|
GC_enable();
|
|
# endif
|
|
return GC_inner_start_routine(&sb, arg);
|
|
+# elif defined(GC_OPENBSD_THREADS)
|
|
+ /* On OpenBSD GC_get_stack_base() doesn't cause any allocations */
|
|
+ struct GC_stack_base sb;
|
|
+ if (GC_get_stack_base(&sb) != GC_SUCCESS)
|
|
+ ABORT("Failed to get thread stack base.");
|
|
+ return GC_inner_start_routine(&sb, arg);
|
|
# else
|
|
return GC_call_with_stack_base(GC_inner_start_routine, arg);
|
|
# endif
|
|
@@ -1297,7 +1306,7 @@ void GC_generic_lock(pthread_mutex_t * lock)
|
|
/* as STL alloc.h. This isn't really the right way to do this. */
|
|
/* but until the POSIX scheduling mess gets straightened out ... */
|
|
|
|
-volatile AO_TS_t GC_allocate_lock = 0;
|
|
+volatile AO_TS_t GC_allocate_lock = AO_TS_INITIALIZER;
|
|
|
|
|
|
void GC_lock(void)
|