From: Motohiro KOSAKI Date: 2012-02-02T05:30:43+09:00 Subject: [ruby-core:42316] [ruby-trunk - Bug #5957][Rejected] pthreads not working on ulibc (linuxthreads) Issue #5957 has been updated by Motohiro KOSAKI. Status changed from Open to Rejected I'm sorry. We have no plan to support linuxthreads any more. Core developers can't access linuxthreads platform easily and I don't think we can get great contributor in near futur in this area. So, I don't think the supporting is practical option. Please use fiber. Again, I'm very sorry. ---------------------------------------- Bug #5957: pthreads not working on ulibc (linuxthreads) https://bugs.ruby-lang.org/issues/5957 Author: stephen gooberman-hill Status: Rejected Priority: Normal Assignee: Category: Target version: ruby -v: ruby 1.9.2p290 (2011-07-09 revision 32553) [arm-linux] Hi I have an arm-linux crosscompile of ruby 1.9.2p290 and 1.9.3p0 Trying to implement a thread (via Thrad.new) causes an error to be thrown "ruby engine can initialize only in the main thread" and a stack trace is thrown. Tracing this issue (in 1.9.2p290) leads to thread_pthread.c lines 350-388 static int native_thread_init_stack(rb_thread_t *th) { rb_thread_id_t curr = pthread_self(); if (pthread_equal(curr, native_main_thread.id)) { th->machine_stack_start = native_main_thread.stack_start; th->machine_stack_maxsize = native_main_thread.stack_maxsize; } else { #ifdef STACKADDR_AVAILABLE void *start; size_t size; if (get_stack(&start, &size) == 0) { th->machine_stack_start = start; th->machine_stack_maxsize = size; } #else rb_raise(rb_eNotImpError, "ruby engine can initialize only in the main thread"); #endif } #ifdef __ia64 th->machine_register_stack_start = native_main_thread.register_stack_start; th->machine_stack_maxsize /= 2; th->machine_register_stack_maxsize = th->machine_stack_maxsize; #endif return 0; } I have done some digging, comparing by build machine on which I run ruby1.9.2p290 built from source, and my arm-linux target machine STACKADDR_AVAILABLE is defined based on a whole set of possible conditions higher in the code (lines 221-229) #if defined HAVE_PTHREAD_GETATTR_NP || defined HAVE_PTHREAD_ATTR_GET_NP #define STACKADDR_AVAILABLE 1 #elif defined HAVE_PTHREAD_GET_STACKADDR_NP && defined HAVE_PTHREAD_GET_STACKSIZE_NP #define STACKADDR_AVAILABLE 1 #elif defined HAVE_THR_STKSEGMENT || defined HAVE_PTHREAD_STACKSEG_NP #define STACKADDR_AVAILABLE 1 #elif defined HAVE_PTHREAD_GETTHRDS_NP #define STACKADDR_AVAILABLE 1 #endif I have done some greping around /usr/includes, and I can't find any of these definitions. So I assume that on my i686 build system ruby is running on the native_main_thread, but on the arm system it is not. Is this the case. Any ideas on how to persuade ruby to run on the native main thread. I can probably rewrite a few critical sections of my app to run of fibers if necessary....but I'd prefer to have thread support Kind regards Steve G-H -- http://bugs.ruby-lang.org/