# Fix pthread support in a/src/boehm-gc Index: b/src/boehm-gc/dyn_load.c =================================================================== --- a/src/boehm-gc/dyn_load.c +++ b/src/boehm-gc/dyn_load.c @@ -26,7 +26,7 @@ * None of this is safe with dlclose and incremental collection. * But then not much of anything is safe in the presence of dlclose. */ -#if (defined(__linux__) || defined(__GLIBC__)) && !defined(_GNU_SOURCE) +#if (defined(__linux__) || defined(__GLIBC__) || defined(__GNU__)) && !defined(_GNU_SOURCE) /* Can't test LINUX, since this must be define before other includes */ # define _GNU_SOURCE #endif Index: b/src/boehm-gc/pthread_support.c =================================================================== --- a/src/boehm-gc/pthread_support.c +++ b/src/boehm-gc/pthread_support.c @@ -885,7 +885,7 @@ GC_nprocs = pthread_num_processors_np(); # endif # if defined(GC_OSF1_THREADS) || defined(GC_AIX_THREADS) \ - || defined(GC_SOLARIS_PTHREADS) + || defined(GC_SOLARIS_PTHREADS) || defined(GC_GNU_THREADS) GC_nprocs = sysconf(_SC_NPROCESSORS_ONLN); if (GC_nprocs <= 0) GC_nprocs = 1; # endif Index: b/src/boehm-gc/include/gc_config_macros.h =================================================================== --- a/src/boehm-gc/include/gc_config_macros.h +++ b/src/boehm-gc/include/gc_config_macros.h @@ -6,7 +6,8 @@ || defined(GC_SOLARIS_PTHREADS) \ || defined(GC_HPUX_THREADS) \ || defined(GC_AIX_THREADS) \ - || defined(GC_LINUX_THREADS)) + || defined(GC_LINUX_THREADS) \ + || defined(GC_GNU_THREADS)) # define _REENTRANT /* Better late than never. This fails if system headers that */ /* depend on this were previously included. */ @@ -21,7 +22,8 @@ defined(GC_HPUX_THREADS) || defined(GC_OSF1_THREADS) || \ defined(GC_DGUX386_THREADS) || defined(GC_DARWIN_THREADS) || \ defined(GC_AIX_THREADS) || \ - (defined(GC_WIN32_THREADS) && defined(__CYGWIN32__)) + (defined(GC_WIN32_THREADS) && defined(__CYGWIN32__)) || \ + defined(GC_GNU_THREADS) # define GC_PTHREADS # endif Index: b/src/boehm-gc/threadlibs.c =================================================================== --- a/src/boehm-gc/threadlibs.c +++ b/src/boehm-gc/threadlibs.c @@ -12,7 +12,8 @@ # endif # if defined(GC_LINUX_THREADS) || defined(GC_IRIX_THREADS) \ || defined(GC_SOLARIS_PTHREADS) \ - || defined(GC_DARWIN_THREADS) || defined(GC_AIX_THREADS) + || defined(GC_DARWIN_THREADS) || defined(GC_AIX_THREADS) \ + || defined(GC_GNU_THREADS) printf("-lpthread\n"); # endif # if defined(GC_FREEBSD_THREADS) Index: b/src/boehm-gc/configure.ac =================================================================== --- a/src/boehm-gc/configure.ac +++ b/src/boehm-gc/configure.ac @@ -181,6 +181,11 @@ THREADCFLAGS=-pthread THREADLIBS=-pthread ;; + *-*-gnu*) + AC_DEFINE(GC_GNU_THREADS,1,[support GNU threads]) + AC_DEFINE(_REENTRANT) + AC_DEFINE(THREAD_LOCAL_ALLOC) + ;; *-*-solaris2.8*) AC_DEFINE(GC_SOLARIS_PTHREADS,1,[support for Solaris pthreads]) # Need to use alternate thread library, otherwise gctest hangs Index: b/src/boehm-gc/os_dep.c =================================================================== --- a/src/boehm-gc/os_dep.c +++ b/src/boehm-gc/os_dep.c @@ -312,7 +312,7 @@ /* for recent Linux versions. This seems to be the easiest way to */ /* cover all versions. */ -# ifdef LINUX +# if defined(LINUX) || defined(HURD) /* Some Linux distributions arrange to define __data_start. Some */ /* define data_start as a weak symbol. The latter is technically */ /* broken, since the user program may define data_start, in which */ @@ -331,7 +331,7 @@ { extern ptr_t GC_find_limit(); -# ifdef LINUX +# if defined(LINUX) || defined(HURD) /* Try the easy approaches first: */ if ((ptr_t)__data_start != 0) { GC_data_start = (ptr_t)(__data_start); Index: b/src/boehm-gc/include/private/gcconfig.h =================================================================== --- a/src/boehm-gc/include/private/gcconfig.h +++ b/src/boehm-gc/include/private/gcconfig.h @@ -1316,8 +1316,9 @@ # define OS_TYPE "HURD" # define STACK_GROWS_DOWN # define HEURISTIC2 - extern int __data_start[]; -# define DATASTART ( (ptr_t) (__data_start)) +# define SIG_SUSPEND SIGUSR1 +# define SIG_THR_RESTART SIGUSR2 +# define SEARCH_FOR_DATA_START extern int _end[]; # define DATAEND ( (ptr_t) (_end)) /* # define MPROTECT_VDB Not quite working yet? */ @@ -2169,7 +2170,8 @@ # if defined(SVR4) || defined(LINUX) || defined(IRIX5) || defined(HPUX) \ || defined(OPENBSD) || defined(NETBSD) || defined(FREEBSD) \ || defined(DGUX) || defined(BSD) || defined(SUNOS4) \ - || defined(_AIX) || defined(DARWIN) || defined(OSF1) + || defined(_AIX) || defined(DARWIN) || defined(OSF1) \ + || defined(HURD) # define UNIX_LIKE /* Basic Unix-like system calls work. */ # endif @@ -2225,7 +2227,7 @@ # define CACHE_LINE_SIZE 32 /* Wild guess */ # endif -# if defined(LINUX) || defined(__GLIBC__) +# if defined(LINUX) || defined(HURD) || defined(__GLIBC__) # define REGISTER_LIBRARIES_EARLY /* We sometimes use dl_iterate_phdr, which may acquire an internal */ /* lock. This isn't safe after the world has stopped. So we must */ @@ -2260,6 +2262,9 @@ # if defined(GC_AIX_THREADS) && !defined(_AIX) --> inconsistent configuration # endif +# if defined(GC_GNU_THREADS) && !defined(HURD) + --> inconsistent configuration +# endif # if defined(GC_WIN32_THREADS) && !defined(MSWIN32) && !defined(CYGWIN32) --> inconsistent configuration # endif Index: b/src/boehm-gc/include/gc_config.h.in =================================================================== --- a/src/boehm-gc/include/gc_config.h.in +++ b/src/boehm-gc/include/gc_config.h.in @@ -33,6 +33,9 @@ /* include support for gcj */ #undef GC_GCJ_SUPPORT +/* support GNU/Hurd threads */ +#undef GC_GNU_THREADS + /* enables support for HP/UX 11 pthreads */ #undef GC_HPUX_THREADS Index: b/src/boehm-gc/specific.c =================================================================== --- a/src/boehm-gc/specific.c +++ b/src/boehm-gc/specific.c @@ -13,7 +13,7 @@ #include "private/gc_priv.h" /* For GC_compare_and_exchange, GC_memory_barrier */ -#if defined(GC_LINUX_THREADS) +#if defined(GC_LINUX_THREADS) || defined(GC_GNU_THREADS) #include "private/specific.h"