<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/146683>146683</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[tsan] CHECK failed in thread sanitizer on ThreadCreate after finished thread was joined using pthread_clockjoin_np
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
doschropa
</td>
</tr>
</table>
<pre>
In an application that uses a large number of threads, I can frequently reproduce a CHECK failed in Thread Sanitizer.
```bash
ThreadSanitizer: CHECK failed: sanitizer_thread_registry.cpp:186 "((live_.try_emplace(user_id, tid).second)) != (0)" (0x0, 0x0) (tid=50579)
#0 __tsan::CheckUnwind() ../../../../libsanitizer/tsan/tsan_rtl.cpp:676 (libtsan.so.2+0x6a63a) (BuildId: 51a623d990ea8c1d192774bb95a1b723606c1288)
#1 __sanitizer::CheckFailed(char const*, int, char const*, unsigned long long, unsigned long long) <null> (libtsan.so.2+0xa504f) (BuildId: 51a623d990ea8c1d192774bb95a1b723606c1288)
#2 __sanitizer::ThreadRegistry::CreateThread(unsigned long, bool, unsigned int, unsigned int, void*) <null> (libtsan.so.2+0xa9cad) (BuildId: 51a623d990ea8c1d192774bb95a1b723606c1288)
#3 __tsan::ThreadCreate(__tsan::ThreadState*, unsigned long, unsigned long, bool) ../../../../libsanitizer/sanitizer_common/sanitizer_thread_registry.h:113 (libtsan.so.2+0x82136) (BuildId: 51a623d990ea8c1d192774bb95a1b723606c1288)
#4 pthread_create <null> (libtsan.so.2+0x1f4ed) (BuildId: 51a623d990ea8c1d192774bb95a1b723606c1288)
#5 g_system_thread_new ../glib/gthread-posix.c:762 (libglib-2.0.so.0+0x76a30) (BuildId: 2acd4dfbc176f0dd02c08005d3214bc81469bc57)
#6 g_thread_new_internal ../glib/gthread.c:997 (libglib-2.0.so.0+0x76a30)
#7 g_thread_new <null> (libglib-2.0.so.0+0x76c2d) (BuildId: 2acd4dfbc176f0dd02c08005d3214bc81469bc57)
#8 <null> <null> (libgstrtpmanager.so+0x137bb) (BuildId: e88f813782372b3b152ccf0a96c690f09b3e652b)
#9 gst_element_change_state <null> (libgstreamer-1.0.so.0+0x473b3) (BuildId: 8c4e928d60fdc40f3b85e0049c507f274fa8fb7a)
#10 gst_element_set_state_func.lto_priv.0 <null> (libgstreamer-1.0.so.0+0x4796b) (BuildId: 8c4e928d60fdc40f3b85e0049c507f274fa8fb7a)
#11 gst_bin_change_state_func <null> (libgstreamer-1.0.so.0+0x1c077) (BuildId: 8c4e928d60fdc40f3b85e0049c507f274fa8fb7a)
#12 gst_pipeline_change_state <null> (libgstreamer-1.0.so.0+0x7981e) (BuildId: 8c4e928d60fdc40f3b85e0049c507f274fa8fb7a)
#13 gst_element_change_state <null> (libgstreamer-1.0.so.0+0x473b3) (BuildId: 8c4e928d60fdc40f3b85e0049c507f274fa8fb7a)
#14 gst_element_change_state <null> (libgstreamer-1.0.so.0+0x473fa) (BuildId: 8c4e928d60fdc40f3b85e0049c507f274fa8fb7a)
#15 gst_element_set_state_func.lto_priv.0 <null> (libgstreamer-1.0.so.0+0x4796b) (BuildId: 8c4e928d60fdc40f3b85e0049c507f274fa8fb7a)
```
If I understood correctly, the `user_id` that is inserted into `live_` in [sanitizer_thread_registry.cpp](https://github.com/llvm/llvm-project/blob/1b7cbe1f871ebe572e383a2531257b88168eea1b/compiler-rt/lib/sanitizer_common/sanitizer_thread_registry.cpp#L186) is supposed to be the value of pthread_t that is passed by pointer to `pthread_create`. The failing check reveals that a `pthread_t` is already present in the map, as if the system may be attempting to assign the same `pthread_t` to multiple concurrently running threads.
I can imagine that `live_` is not cleaned up when a thread finishes using `pthread_clockjoin_np`, which has been used by Qt's QThread since version 6.9, as there does not appear to be an interceptor set in [tsan_interceptors_posix.cpp](https://github.com/llvm/llvm-project/blob/c0e9084b1ce1a93fd8c2a650e48b3e11d831b649/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp) for `pthread_clockjoin_np`.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzMWE2T4ygS_TXyJaMVfOgDHXxwV03FVuxeZmf2rACUspiRQQuoqr2_fgNJVV1ue3q6e-owEQ5jQwLvvUxEpmQI5mgR91n5MSvvd3KOg_P7zgU9eDfJnXLdef9oQVqQ0zQaLaNxFuIgI8wBA0gYpT8i2Pmk0IPrIQ4eZRcydgePoKWF3uN_Z7RxPIPHybtu1ggS7v7x090_oZdmxA6MhV-XefCLtCaa_6HPM3JIn4qsHyXDkJHDavZqlfHDxUrpf3gZbFcsrcejCdGfcz1NGT9QUUHGWMZExsRonrDNoz-3eJpGqTFjYg7oW9MlCjE1TR5QO5t-ZayBjNGM30PGBFl62PLzE0n2S5NMRJrJ70tS1mlSRg4AABnjBNo2Bmkzfsj44W5A_ft_7LNJq4s0Nc8z9vDF12jUK6mMPSzT16b1cdxoVXWiJUaj0kAeXM4y9pF8qmTF5Qbq42zG7nFRqaSyYrxrGoJSaNrRhtV1oVRTSqpqxitSacqEuABPoW3DG-1fGDys4jOhB-lBOxtixg5JEGNjaq76Z7uEXgejs8fl6496G8j4nZ3HMeM_3SQoS1L070SQXRNcI-7fWwxtpD3KiOtICpi3sBMP5dx4wWeT4cv_Ty7F1-FbSDY6bfUuJPlFCK4sVkYZE9dDv8Rl5NptNztW6t8Ux58Pqnank7MXXV-e3SGdXMpviiMY5dVfFidjvIBp21cvevyZV2hf4Ht5pYRjG84h4umFu8XnVcbjaFRq1v4PkwvmU64zfqgrtuFKJh9YThI2smCrK8nJNTYmdVd0vdK0rnrSdYRpIggpO85oobSgRdUoXdYX2Co4vgHVGhvRWzneQrfgapr6T3F9Xr2-WP1a81traHZD9x_iJi42vNo7RB-nk7TyiD4PbnU7r5W63h6F6AXltWC8ZoorWjKteyKbSlcN6UmjOFYlUxfbN3AMscURT2hjqwdpj9iGeDP4EhiUJ_Qf6Fs1iporfg1H6AIbJrqK9J0uSM-VKJGQotElqXtWF70Uvarl5ROeXOAJGFcwbT9bnY_RtZM3Tzn5DnBNdUOrHwNHF3DK2AuhFmzfDIhqUtfvBYgtgCYz4Wgs_pj76kZQfC9A_G8WTsW74OlvJDA_hqf8O4b3a5K75ryPPTzCbDv0ITrXgXbeo47jeclIB4SsIi85akXWbNwEMDagj2ty4ZLNktsmC2MhKz9-PS8u7zMmhhinkO5-9pCe6CYOs8q1O6W7e3x6aT5M3v2GOmbsQY0uPfupqrVC2ouaosKyZsgFl6zklJW1EoJWAlHSZKrdaTIj-g8-rhnB9yYCCSzj_6JiufFNgDBPkwvYQXSgcBHoSY4zpmrk5TqPrypNMiRbdYbJLfcYrGJdXvxZRXL4dcClrDD2CDqlueDxCeUY1sXk22lx0TmAHNPfM0weA9qYpE-ATnJKzpMBTL90rDc9nOQ5YZYx4mmKaaPoYC3LVjN5wqttooPTPEYzjZhyaj17v9VXs7XLGmsNtpVQaxlmTvJoLK7QL4IjgHUR9Igy5XHzBM8DWpDbKtAba8KAAeaQ1n4r1ej07785Y1s7peBld_A8GD3AIAMoRJtqxEXqn2PG6gA_b0VeMFYjPKEPqZqs8mbTJg7oETqHKyQ5TSj95tZEIblL4xSdh4BxC-ulDHozFNotP_qrQa0JNkQUimqksuF9JzSTVUmwEIojpZ3gVFVF8wdB7bcyzX8NIGugd_4rom4-3HV73jW8kTvc07qkRUXqku6GfVkUuqq6ptJNX3cN1Y2oK6k5q2tV11jszJ4RVpKaMMpKxmleICOaiopIRimSOisInqQZ86RC7vxxZ0KYcU-LqhJ8N0qFY1jeEDCW0rNlNNXP5f3O7xfp1HwMWUFGE2L4vEw0cVxeLSxClPdXJf8WYK9HHdzLa4C1GgHZp_O5BWD3Yv8sAySBUrAuIXlLut3sx_13e37hFtIDbSX_tGf_DwAA__8VoU1k">