[Issue 23593] New: core.thread: suspendAll doesn't wait for all if current thread has detached itself
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Sat Dec 31 00:06:38 UTC 2022
https://issues.dlang.org/show_bug.cgi?id=23593
Issue ID: 23593
Summary: core.thread: suspendAll doesn't wait for all if
current thread has detached itself
Product: D
Version: D2
Hardware: x86_64
OS: FreeBSD
Status: NEW
Severity: normal
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: ibuclaw at gdcproject.org
See the following for all the gory details.
https://github.com/dlang/dmd/pull/14710
https://github.com/dlang/dmd/pull/14753
https://github.com/dlang/dmd/pull/14754
Essentially
---
new Thread({
thread_detachThis();
GC.collect();
}).start();
---
The GC collection will call thread_suspendAll, and as the calling thread
detached itself, the suspend counter will be `1` (instead of `2`) - however the
counter is decremented before the entering the loop that calls sem_wait until
all threads have signalled resume - meaning there's an implicit assumption that
the current thread was counted - so it exits immediately rather than waiting
for the main thread to respond.
This means there's now a race condition between the detached thread running the
GC and the main thread setting up the Thread.tstack/bstack values. If the GC
scan wins, then the main thread stack won't have any live data marked.
--
More information about the Digitalmars-d-bugs
mailing list