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;
|
||
|
-
|
||