summaryrefslogtreecommitdiff
path: root/thread_pthread.c
diff options
context:
space:
mode:
authorJohn Hawthorn <[email protected]>2025-05-13 22:36:09 -0700
committerJohn Hawthorn <[email protected]>2025-05-15 15:18:10 -0700
commitd67d169aeae8b05f8b06f4829de6d5f14059cfea ()
treec0be842a91d79045a639b715130cbedecddf264b /thread_pthread.c
parentd845da05e83a2c2929ef8d4fd829804d44f292d3 (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--thread_pthread.c22
1 files changed, 10 insertions, 12 deletions
@@ -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