From: Mathieu Desnoyers Date: Wed, 17 May 2017 22:36:54 +0000 (-0400) Subject: Fix: thread exit vs futex wait/wakeup race X-Git-Tag: v2.11.0-rc1~577 X-Git-Url: https://git.lttng.org/?a=commitdiff_plain;h=0ed3b1a8426260c2b8a9cb7987b6b242568a2d02;hp=0ed3b1a8426260c2b8a9cb7987b6b242568a2d02;p=lttng-tools.git Fix: thread exit vs futex wait/wakeup race relayd_live_stop performs, in this order: CMM_STORE_SHARED(live_dispatch_thread_exit, 1); [A] futex_nto1_wake(&viewer_conn_queue.futex); [B] whereas thread_dispatcher does: while (!CMM_LOAD_SHARED(live_dispatch_thread_exit)) { [1] [...] futex_nto1_prepare(&viewer_conn_queue.futex); [2] [...] futex_nto1_wait(&viewer_conn_queue.futex); [3] Unfortunately, on the following sequence: [1] [A] [B] [2] [3] thread_dispatcher will end up hanging. We need to move the live_dispatch_thread_exit load between "prepare" and "wait" to fix this. There are similar scenarios with relay_thread_dispatcher, and the session daemon thread_dispatch_ust_registration, which are also fixed here. Signed-off-by: Mathieu Desnoyers Signed-off-by: Jérémie Galarneau ---