diff --git a/ChangeLog b/ChangeLog index ca67c5a9ab..da6c9499a0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Wed Feb 3 12:30:10 2010 NARUSE, Yui + + * thread_pthread.c (ruby_init_stack): use pthread_get_attr_np + to get the stack size of the main thread on FreeBSD. + + * thread_pthread.c: include pthread_np.h on FreeBSD. + Wed Feb 3 11:38:44 2010 Nobuyoshi Nakada * ext/dl/{closure,function}.c: removed C99 features and warnings. diff --git a/thread_pthread.c b/thread_pthread.c index af0b28644a..14da80b9f7 100644 --- a/thread_pthread.c +++ b/thread_pthread.c @@ -12,6 +12,9 @@ #ifdef THREAD_SYSTEM_DEPENDENT_IMPLEMENTATION #include "gc.h" +#ifdef __FreeBSD__ +#include +#endif #ifdef HAVE_SYS_RESOURCE_H #include @@ -292,18 +295,24 @@ ruby_init_stack(volatile VALUE *addr native_main_thread.register_stack_start = (VALUE*)bsp; } #endif -#ifdef HAVE_GETRLIMIT { - struct rlimit rlim; - - if (getrlimit(RLIMIT_STACK, &rlim) == 0) { - size_t space = (size_t)(rlim.rlim_cur/5); - - if (space > 1024*1024) space = 1024*1024; - native_main_thread.stack_maxsize = (size_t)rlim.rlim_cur - space; + size_t size = 0, space = 0; +#ifdef __FreeBSD__ + pthread_attr_t attr; + if (pthread_attr_init(&attr) == 0) { + pthread_attr_get_np(native_main_thread.id, &attr) || + pthread_attr_getstacksize(&attr, &size); + pthread_attr_destroy(&attr); + } +#elif defined(HAVE_GETRLIMIT) + struct rlimit rlim; + if (getrlimit(RLIMIT_STACK, &rlim) == 0) { + size = (size_t)rlim.rlim_cur; } - } #endif + space = size > 5 * 1024 * 1024 ? 1024 * 1024 : size / 5; + native_main_thread.stack_maxsize = size - space; + } } #define CHECK_ERR(expr) \