Bug #15013 ยป 0001-thread_pthread.c-reinitialize-ubf_list-at-fork.patch
| thread.c | ||
|---|---|---|
|     vm->main_thread = th; | ||
|     gvl_atfork(th->vm); | ||
|     ubf_list_atfork(); | ||
|     list_for_each(&vm->living_threads, i, vmlt_node) { | ||
| 	atfork(i, th); | ||
| thread_pthread.c | ||
|---|---|---|
| #define native_cleanup_push pthread_cleanup_push | ||
| #define native_cleanup_pop  pthread_cleanup_pop | ||
| #if defined(USE_UBF_LIST) | ||
| static rb_nativethread_lock_t ubf_list_lock; | ||
| #endif | ||
| static pthread_key_t ruby_native_thread_key; | ||
| static void | ||
| ... | ... | |
|     th->thread_id = pthread_self(); | ||
|     fill_thread_id_str(th); | ||
|     native_thread_init(th); | ||
| #ifdef USE_UBF_LIST | ||
|     rb_native_mutex_initialize(&ubf_list_lock); | ||
| #endif | ||
|     posix_signal(SIGVTALRM, null_func); | ||
| } | ||
| ... | ... | |
| #ifdef USE_UBF_LIST | ||
| static LIST_HEAD(ubf_list_head); | ||
| static rb_nativethread_lock_t ubf_list_lock = RB_NATIVETHREAD_LOCK_INIT; | ||
| static void | ||
| ubf_list_atfork(void) | ||
| { | ||
|     list_head_init(&ubf_list_head); | ||
|     rb_native_mutex_initialize(&ubf_list_lock); | ||
| } | ||
| /* The thread 'th' is registered to be trying unblock. */ | ||
| static void | ||
| thread_win32.c | ||
|---|---|---|
| #define ubf_wakeup_all_threads() do {} while (0) | ||
| #define ubf_threads_empty() (1) | ||
| #define ubf_timer_disarm() do {} while (0) | ||
| #define ubf_list_atfork() do {} while (0) | ||
| static volatile DWORD ruby_native_thread_key = TLS_OUT_OF_INDEXES; | ||
| -  | ||