mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-07-14 22:01:59 +00:00
AsyncTask: fixed reentrancy bug tested by f8e6f036affaaca135103556bd2c7f15a943d29b
This commit is contained in:
parent
f8e6f036af
commit
70dd9c7371
@ -252,9 +252,15 @@ abstract class AsyncTask extends \Threaded{
|
|||||||
final public function __destruct(){
|
final public function __destruct(){
|
||||||
$this->reallyDestruct();
|
$this->reallyDestruct();
|
||||||
if(self::$threadLocalStorage !== null && isset(self::$threadLocalStorage[$h = spl_object_id($this)])){
|
if(self::$threadLocalStorage !== null && isset(self::$threadLocalStorage[$h = spl_object_id($this)])){
|
||||||
unset(self::$threadLocalStorage[$h]);
|
//Beware changing this code!
|
||||||
if(self::$threadLocalStorage->count() === 0){
|
//This code may cause the GC to be triggered, causing destruction of other AsyncTasks (which may or may not
|
||||||
|
//have been indirectly referenced by the TLS).
|
||||||
|
//This may cause the code to be re-entered from a different context unexpectedly, causing a crash if handled
|
||||||
|
//incorrectly.
|
||||||
|
if(self::$threadLocalStorage->count() === 1){
|
||||||
self::$threadLocalStorage = null;
|
self::$threadLocalStorage = null;
|
||||||
|
}else{
|
||||||
|
unset(self::$threadLocalStorage[$h]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user