Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
QThread::terminate(): don't depend on stack unwinding
Posix doesn't seem to specify whether the stack of cancelled threads is unwound, and there's nothing preventing a QThread from terminate()ing itself, so be extra careful to drop the mutex before calling pthread_cancel. We can't drop the mutex in general, as that would open a window for the following race condition: T1 T2 t3->terminate() lock(); read ID; terminated = true; unlock(); ----------- t3 exits naturally ----------- t3->wait(); t4->start(); // gets ex-t3's ID pthread_cancel(ID) // oops, cancels new t4 But we can drop it when this == currentThread(), because said window does not exist: While this_thread is executing terminate(), it cannot at the same time exit naturally. As drive-by, scope a variable tighter. Pick-to: 6.8 6.7 6.5 Change-Id: I77a628e62d88e383d5aa91cfd97440186c997fc4 Reviewed-by: Thiago Macieira <[email protected]>
- Loading branch information