mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-09-04 00:55:14 +00:00
Fixed AsyncTask publishProgress() race condition on task exit
It's possible for a progress update to be lost due to the task finishing before the main thread found the progress update.
This commit is contained in:
@ -289,12 +289,20 @@ class AsyncPool{
|
||||
*/
|
||||
public function collectTasks() : void{
|
||||
foreach($this->tasks as $task){
|
||||
if(!$task->isGarbage()){
|
||||
$task->checkProgressUpdates($this->server);
|
||||
}
|
||||
$task->checkProgressUpdates($this->server);
|
||||
if($task->isGarbage() and !$task->isRunning() and !$task->isCrashed()){
|
||||
if(!$task->hasCancelledRun()){
|
||||
try{
|
||||
/*
|
||||
* It's possible for a task to submit a progress update and then finish before the progress
|
||||
* update is detected by the parent thread, so here we consume any missed updates.
|
||||
*
|
||||
* When this happens, it's possible for a progress update to arrive between the previous
|
||||
* checkProgressUpdates() call and the next isGarbage() call, causing progress updates to be
|
||||
* lost. Thus, it's necessary to do one last check here to make sure all progress updates have
|
||||
* been consumed before completing.
|
||||
*/
|
||||
$task->checkProgressUpdates($this->server);
|
||||
$task->onCompletion($this->server);
|
||||
if($task->removeDanglingStoredObjects()){
|
||||
$this->logger->notice("AsyncTask " . get_class($task) . " stored local complex data but did not remove them after completion");
|
||||
|
Reference in New Issue
Block a user