$NetBSD: patch-ak,v 1.12 2015/06/15 09:27:29 joerg Exp $ --- libgc/pthread_support.c.orig 2015-04-24 01:26:16.000000000 +0000 +++ libgc/pthread_support.c @@ -71,7 +71,7 @@ defined(GC_DARWIN_THREADS) || defined(GC_AIX_THREADS)) || \ defined(GC_NETBSD_THREADS) && !defined(USE_PTHREAD_SPECIFIC) || \ defined(GC_FREEBSD_THREADS) && !defined(USE_PTHREAD_SPECIFIC) || \ - defined(GC_OPENBSD_THREADS) + !defined(USE_COMPILER_TLS) || defined(GC_OPENBSD_THREADS) # define USE_PTHREAD_SPECIFIC # endif #endif @@ -595,6 +595,20 @@ static void start_mark_threads() } } # endif /* HPUX || GC_DGUX386_THREADS */ +# if defined(__NetBSD__) +# define MAX_STACK_SIZE (1024 * 1024 *sizeof(word)) + { + size_t old_size; + int code; + + if (pthread_attr_getstacksize(&attr, &old_size) != 0) + ABORT("pthread_attr_getstacksize failed\n"); + if (old_size > MAX_STACK_SIZE) { + if (pthread_attr_setstacksize(&attr, MAX_STACK_SIZE) != 0) + ABORT("pthread_attr_setstacksize failed\n"); + } + } +# endif # ifdef CONDPRINT if (GC_print_stats) { GC_printf1("Starting %ld marker threads\n", GC_markers - 1); @@ -1282,6 +1296,22 @@ void GC_end_blocking(void) { #define __d10_sleep sleep #endif /* GC_DGUX386_THREADS */ +#undef nanosleep +#undef usleep +#undef sleep + +/* A wrapper for the standard C nanosleep function */ +int WRAP_FUNC(nanosleep) (const struct timespec *rqtp, struct timespec *rmtp) +{ + int result; + + GC_start_blocking(); + result = REAL_FUNC(nanosleep)(rqtp, rmtp); + GC_end_blocking(); + + return result; +} + /* A wrapper for the standard C sleep function */ int WRAP_FUNC(sleep) (unsigned int seconds) {