mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-06-12 06:25:32 +00:00
The following callbacks can now be registered in timings, to allow threads to be notified of these events: - Turning on/off (`TimingsHandler::getToggleCallbacks()->add(...)`) - Reset (`TimingsHandler::getReloadCallbacks()->add(...)`) - Collect (`TimingsHandler::getCollectCallbacks()->add(...)`) Collect callbacks must return `list<Promise>`. The promises must be `resolve()`d with `list<string>` of printed timings records, as returned by `TimingsHandler::printCurrentThreadRecords()`. It's recommended to use 1 promise per thread. A timings report will be produced once all promises have been resolved. This system is used internally to collect timings for async tasks (closes #6166). For timings viewer developers: Timings format version has been bumped to 3 to accommodate this change. Timings groups should now include a `ThreadId` at the end of timings group names to ensure that their record IDs are segregated correctly, as they could otherwise conflict between threads. The main thread is not required to specify a thread ID. See pmmp/timings@13cefa6279 for implementation examples. New PHPStan error is caused by phpstan/phpstan#10924
61 lines
1.7 KiB
PHP
61 lines
1.7 KiB
PHP
<?php
|
|
|
|
/*
|
|
*
|
|
* ____ _ _ __ __ _ __ __ ____
|
|
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
|
|
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
|
|
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
|
|
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* @author PocketMine Team
|
|
* @link http://www.pocketmine.net/
|
|
*
|
|
*
|
|
*/
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace pocketmine\scheduler;
|
|
|
|
use pocketmine\promise\PromiseResolver;
|
|
use pocketmine\timings\TimingsHandler;
|
|
|
|
/**
|
|
* @phpstan-type Resolver PromiseResolver<list<string>>
|
|
*/
|
|
final class TimingsCollectionTask extends AsyncTask{
|
|
private const TLS_KEY_RESOLVER = "resolver";
|
|
|
|
/**
|
|
* @phpstan-param PromiseResolver<list<string>> $promiseResolver
|
|
*/
|
|
public function __construct(PromiseResolver $promiseResolver){
|
|
$this->storeLocal(self::TLS_KEY_RESOLVER, $promiseResolver);
|
|
}
|
|
|
|
public function onRun() : void{
|
|
$this->setResult(TimingsHandler::printCurrentThreadRecords());
|
|
}
|
|
|
|
public function onCompletion() : void{
|
|
/**
|
|
* @var string[] $result
|
|
* @phpstan-var list<string> $result
|
|
*/
|
|
$result = $this->getResult();
|
|
/**
|
|
* @var PromiseResolver $promiseResolver
|
|
* @phpstan-var PromiseResolver<list<string>> $promiseResolver
|
|
*/
|
|
$promiseResolver = $this->fetchLocal(self::TLS_KEY_RESOLVER);
|
|
|
|
$promiseResolver->resolve($result);
|
|
}
|
|
}
|