thread_pthread.c: reinitialize ubf_list at fork
It's possible for the ubf_list_head to be populated with dead threads at fork or the ubf_list_lock to be held, so reinitialize both at startup. And while we're at it, use a static initializer at startup to save a library call and kill some ifdef. [ruby-core:88578] [Bug #15013] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64485 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
ce48b55805
commit
17e4aff277
1
thread.c
1
thread.c
@ -4396,6 +4396,7 @@ rb_thread_atfork_internal(rb_thread_t *th, void (*atfork)(rb_thread_t *, const r
|
|||||||
vm->main_thread = th;
|
vm->main_thread = th;
|
||||||
|
|
||||||
gvl_atfork(th->vm);
|
gvl_atfork(th->vm);
|
||||||
|
ubf_list_atfork();
|
||||||
|
|
||||||
list_for_each(&vm->living_threads, i, vmlt_node) {
|
list_for_each(&vm->living_threads, i, vmlt_node) {
|
||||||
atfork(i, th);
|
atfork(i, th);
|
||||||
|
@ -532,10 +532,6 @@ native_cond_timeout(rb_nativethread_cond_t *cond, struct timespec timeout_rel)
|
|||||||
#define native_cleanup_push pthread_cleanup_push
|
#define native_cleanup_push pthread_cleanup_push
|
||||||
#define native_cleanup_pop pthread_cleanup_pop
|
#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 pthread_key_t ruby_native_thread_key;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -574,9 +570,6 @@ Init_native_thread(rb_thread_t *th)
|
|||||||
th->thread_id = pthread_self();
|
th->thread_id = pthread_self();
|
||||||
fill_thread_id_str(th);
|
fill_thread_id_str(th);
|
||||||
native_thread_init(th);
|
native_thread_init(th);
|
||||||
#ifdef USE_UBF_LIST
|
|
||||||
rb_native_mutex_initialize(&ubf_list_lock);
|
|
||||||
#endif
|
|
||||||
posix_signal(SIGVTALRM, null_func);
|
posix_signal(SIGVTALRM, null_func);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1268,6 +1261,14 @@ native_cond_sleep(rb_thread_t *th, struct timespec *timeout_rel)
|
|||||||
|
|
||||||
#ifdef USE_UBF_LIST
|
#ifdef USE_UBF_LIST
|
||||||
static LIST_HEAD(ubf_list_head);
|
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. */
|
/* The thread 'th' is registered to be trying unblock. */
|
||||||
static void
|
static void
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#define ubf_wakeup_all_threads() do {} while (0)
|
#define ubf_wakeup_all_threads() do {} while (0)
|
||||||
#define ubf_threads_empty() (1)
|
#define ubf_threads_empty() (1)
|
||||||
#define ubf_timer_disarm() do {} while (0)
|
#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;
|
static volatile DWORD ruby_native_thread_key = TLS_OUT_OF_INDEXES;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user