AsyncTask::setResult(): permit returning ThreadSafe objects to the main thread

this is now supported thanks to the object rescue feature implemented in pthreads 5.1, making returning of thread-safe values from async tasks possible.
This needs to be explicitly supported, since otherwise it will attempt to serialize them, which isn't supported anymore.
This commit is contained in:
Dylan K. Taylor
2023-05-21 16:37:41 +01:00
parent fdb724c646
commit 69273f3ff7
3 changed files with 77 additions and 3 deletions

View File

@ -25,6 +25,7 @@ namespace pocketmine\scheduler;
use pmmp\thread\Runnable;
use pmmp\thread\Thread as NativeThread;
use pmmp\thread\ThreadSafe;
use pmmp\thread\ThreadSafeArray;
use pocketmine\thread\NonThreadSafeValue;
use function assert;
@ -70,8 +71,7 @@ abstract class AsyncTask extends Runnable{
/** @phpstan-var ThreadSafeArray<int, string> */
public ThreadSafeArray $progressUpdates;
/** @phpstan-var NonThreadSafeValue<mixed>|string|int|bool|float|null */
private NonThreadSafeValue|string|int|bool|null|float $result = null;
private ThreadSafe|string|int|bool|null|float $result = null;
private bool $cancelRun = false;
private bool $submitted = false;
@ -124,7 +124,7 @@ abstract class AsyncTask extends Runnable{
}
public function setResult(mixed $result) : void{
$this->result = is_scalar($result) || is_null($result) ? $result : new NonThreadSafeValue($result);
$this->result = is_scalar($result) || is_null($result) || $result instanceof ThreadSafe ? $result : new NonThreadSafeValue($result);
}
public function cancelRun() : void{