base: resolve dead lock in weak pointer templates
This commit eliminates the mutual interlaced taking of destruction lock, list lock and weak pointer locks that could lead to a dead-lock situation when a lock pointer was tried to construct while a weak object is in destruction progress. Now, all weak pointers are invalidated and dequeued at the very beginning of the weak object's destruction. Moreover, before a weak pointer gets invalidated during destruction of a weak object, it gets dequeued, and the list lock is freed again to avoid the former dead-lock. Fix #1607
This commit is contained in:
committed by
Norman Feske
parent
64831c63c9
commit
0f05fa6fd4
@@ -128,6 +128,9 @@ Platform_pd::Platform_pd()
|
||||
|
||||
Platform_pd::~Platform_pd()
|
||||
{
|
||||
/* invalidate weak pointers to this object */
|
||||
Address_space::lock_for_destruction();
|
||||
|
||||
for (unsigned i = 0; i < THREAD_MAX; i++) {
|
||||
if (_threads[i])
|
||||
_threads[i]->unbind();
|
||||
|
||||
Reference in New Issue
Block a user