diff options
author | John Hawthorn <[email protected]> | 2025-05-13 22:36:09 -0700 |
---|---|---|
committer | John Hawthorn <[email protected]> | 2025-05-15 15:18:10 -0700 |
commit | d67d169aeae8b05f8b06f4829de6d5f14059cfea () | |
tree | c0be842a91d79045a639b715130cbedecddf264b | |
parent | d845da05e83a2c2929ef8d4fd829804d44f292d3 (diff) |
Use atomics for system_working global
Although it almost certainly works in this case, volatile is best not used for multi-threaded code. Using atomics instead avoids warnings from TSan. This also simplifies some logic, as system_working was previously only ever assigned to 1, so --system_working <= 0 should always return true (unless it underflowed).
Notes: Merged: https://.com/ruby/ruby/pull/13333
-rw-r--r-- | misc/tsan_suppressions.txt | 3 | ||||
-rw-r--r-- | thread.c | 2 | ||||
-rw-r--r-- | thread_pthread.c | 22 | ||||
-rw-r--r-- | thread_win32.c | 16 |
4 files changed, 19 insertions, 24 deletions
@@ -30,9 +30,6 @@ race_top:RUBY_VM_INTERRUPTED_ANY race_top:unblock_function_set race_top:threadptr_get_interrupts -# system_working needs to be converted to atomic -race:system_working - # It's already crashing. We're doing our best signal:rb_vm_bugreport race:check_reserved_signal_ @@ -148,7 +148,7 @@ static int hrtime_update_expire(rb_hrtime_t *, const rb_hrtime_t); NORETURN(static void async_bug_fd(const char *mesg, int errno_arg, int fd)); MAYBE_UNUSED(static int consume_communication_pipe(int fd)); -static volatile int system_working = 1; static rb_internal_thread_specific_key_t specific_key_count; /********************************************************************************/ @@ -2574,7 +2574,7 @@ rb_thread_wakeup_timer_thread(int sig) timer_thread_wakeup_force(); // interrupt main thread if main thread is available - if (system_working) { rb_vm_t *vm = GET_VM(); rb_thread_t *main_th = vm->ractor.main_thread; @@ -3005,12 +3005,12 @@ timer_thread_func(void *ptr) RUBY_DEBUG_LOG("started%s", ""); - while (system_working) { timer_thread_check_signal(vm); timer_thread_check_timeout(vm); ubf_wakeup_all_threads(); - RUBY_DEBUG_LOG("system_working:%d", system_working); timer_thread_polling(vm); } @@ -3124,18 +3124,16 @@ rb_thread_create_timer_thread(void) static int native_stop_timer_thread(void) { - int stopped; - stopped = --system_working <= 0; - if (stopped) { - RUBY_DEBUG_LOG("wakeup send %d", timer_th.comm_fds[1]); - timer_thread_wakeup_force(); - RUBY_DEBUG_LOG("wakeup sent"); - pthread_join(timer_th.pthread_id, NULL); - } if (TT_DEBUG) fprintf(stderr, "stop timer thread\n"); - return stopped; } static void @@ -798,14 +798,14 @@ rb_thread_create_timer_thread(void) static int native_stop_timer_thread(void) { - int stopped = --system_working <= 0; - if (stopped) { - SetEvent(timer_thread.lock); - native_thread_join(timer_thread.id); - CloseHandle(timer_thread.lock); - timer_thread.lock = 0; - } - return stopped; } static void |