class TracingDriver
Hierarchy
- class \Revolt\EventLoop\Driver\TracingDriver implements \Revolt\EventLoop\Driver
Expanded class hierarchy of TracingDriver
1 file declares its use of TracingDriver
- DriverFactory.php in vendor/
revolt/ event-loop/ src/ EventLoop/ DriverFactory.php
File
-
vendor/
revolt/ event-loop/ src/ EventLoop/ Driver/ TracingDriver.php, line 12
Namespace
Revolt\EventLoop\DriverView source
final class TracingDriver implements Driver {
private readonly Driver $driver;
/** @var array<string, true> */
private array $enabledCallbacks = [];
/** @var array<string, true> */
private array $unreferencedCallbacks = [];
/** @var array<string, string> */
private array $creationTraces = [];
/** @var array<string, string> */
private array $cancelTraces = [];
public function __construct(Driver $driver) {
$this->driver = $driver;
}
public function run() : void {
$this->driver
->run();
}
public function stop() : void {
$this->driver
->stop();
}
public function getSuspension() : Suspension {
return $this->driver
->getSuspension();
}
public function isRunning() : bool {
return $this->driver
->isRunning();
}
public function defer(\Closure $closure) : string {
$id = $this->driver
->defer(function (...$args) use ($closure) {
$this->cancel($args[0]);
return $closure(...$args);
});
$this->creationTraces[$id] = $this->formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS));
$this->enabledCallbacks[$id] = true;
return $id;
}
public function delay(float $delay, \Closure $closure) : string {
$id = $this->driver
->delay($delay, function (...$args) use ($closure) {
$this->cancel($args[0]);
return $closure(...$args);
});
$this->creationTraces[$id] = $this->formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS));
$this->enabledCallbacks[$id] = true;
return $id;
}
public function repeat(float $interval, \Closure $closure) : string {
$id = $this->driver
->repeat($interval, $closure);
$this->creationTraces[$id] = $this->formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS));
$this->enabledCallbacks[$id] = true;
return $id;
}
public function onReadable(mixed $stream, \Closure $closure) : string {
$id = $this->driver
->onReadable($stream, $closure);
$this->creationTraces[$id] = $this->formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS));
$this->enabledCallbacks[$id] = true;
return $id;
}
public function onWritable(mixed $stream, \Closure $closure) : string {
$id = $this->driver
->onWritable($stream, $closure);
$this->creationTraces[$id] = $this->formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS));
$this->enabledCallbacks[$id] = true;
return $id;
}
public function onSignal(int $signal, \Closure $closure) : string {
$id = $this->driver
->onSignal($signal, $closure);
$this->creationTraces[$id] = $this->formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS));
$this->enabledCallbacks[$id] = true;
return $id;
}
public function enable(string $callbackId) : string {
try {
$this->driver
->enable($callbackId);
$this->enabledCallbacks[$callbackId] = true;
} catch (InvalidCallbackError $e) {
$e->addInfo("Creation trace", $this->getCreationTrace($callbackId));
$e->addInfo("Cancellation trace", $this->getCancelTrace($callbackId));
throw $e;
}
return $callbackId;
}
public function cancel(string $callbackId) : void {
$this->driver
->cancel($callbackId);
if (!isset($this->cancelTraces[$callbackId])) {
$this->cancelTraces[$callbackId] = $this->formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS));
}
unset($this->enabledCallbacks[$callbackId], $this->unreferencedCallbacks[$callbackId]);
}
public function disable(string $callbackId) : string {
$this->driver
->disable($callbackId);
unset($this->enabledCallbacks[$callbackId]);
return $callbackId;
}
public function reference(string $callbackId) : string {
try {
$this->driver
->reference($callbackId);
unset($this->unreferencedCallbacks[$callbackId]);
} catch (InvalidCallbackError $e) {
$e->addInfo("Creation trace", $this->getCreationTrace($callbackId));
$e->addInfo("Cancellation trace", $this->getCancelTrace($callbackId));
throw $e;
}
return $callbackId;
}
public function unreference(string $callbackId) : string {
$this->driver
->unreference($callbackId);
$this->unreferencedCallbacks[$callbackId] = true;
return $callbackId;
}
public function setErrorHandler(?\Closure $errorHandler) : void {
$this->driver
->setErrorHandler($errorHandler);
}
public function getErrorHandler() : ?\Closure {
return $this->driver
->getErrorHandler();
}
/** @inheritdoc */
public function getHandle() : mixed {
return $this->driver
->getHandle();
}
public function dump() : string {
$dump = "Enabled, referenced callbacks keeping the loop running: ";
foreach ($this->enabledCallbacks as $callbackId => $_) {
if (isset($this->unreferencedCallbacks[$callbackId])) {
continue;
}
$dump .= "Callback identifier: " . $callbackId . "\r\n";
$dump .= $this->getCreationTrace($callbackId);
$dump .= "\r\n\r\n";
}
return \rtrim($dump);
}
public function getIdentifiers() : array {
return $this->driver
->getIdentifiers();
}
public function getType(string $callbackId) : CallbackType {
return $this->driver
->getType($callbackId);
}
public function isEnabled(string $callbackId) : bool {
return $this->driver
->isEnabled($callbackId);
}
public function isReferenced(string $callbackId) : bool {
return $this->driver
->isReferenced($callbackId);
}
public function __debugInfo() : array {
return $this->driver
->__debugInfo();
}
public function queue(\Closure $closure, mixed ...$args) : void {
$this->driver
->queue($closure, ...$args);
}
private function getCreationTrace(string $callbackId) : string {
return $this->creationTraces[$callbackId] ?? 'No creation trace, yet.';
}
private function getCancelTrace(string $callbackId) : string {
return $this->cancelTraces[$callbackId] ?? 'No cancellation trace, yet.';
}
/**
* Formats a stacktrace obtained via `debug_backtrace()`.
*
* @param list<array{
* args?: list<mixed>,
* class?: class-string,
* file?: string,
* function: string,
* line?: int,
* object?: object,
* type?: string
* }> $trace Output of `debug_backtrace()`.
*
* @return string Formatted stacktrace.
*/
private function formatStacktrace(array $trace) : string {
return \implode("\n", \array_map(static function ($e, $i) {
$line = "#{$i} ";
if (isset($e["file"], $e['line'])) {
$line .= "{$e['file']}:{$e['line']} ";
}
if (isset($e["class"], $e["type"])) {
$line .= $e["class"] . $e["type"];
}
return $line . $e["function"] . "()";
}, $trace, \array_keys($trace)));
}
}
Members
Title Sort descending | Modifiers | Object type | Summary | Overriden Title |
---|---|---|---|---|
TracingDriver::$cancelTraces | private | property | @var array<string, string> | |
TracingDriver::$creationTraces | private | property | @var array<string, string> | |
TracingDriver::$driver | private | property | ||
TracingDriver::$enabledCallbacks | private | property | @var array<string, true> | |
TracingDriver::$unreferencedCallbacks | private | property | @var array<string, true> | |
TracingDriver::cancel | public | function | Cancel a callback. | Overrides Driver::cancel |
TracingDriver::defer | public | function | Defer the execution of a callback. | Overrides Driver::defer |
TracingDriver::delay | public | function | Delay the execution of a callback. | Overrides Driver::delay |
TracingDriver::disable | public | function | Disable a callback immediately. | Overrides Driver::disable |
TracingDriver::dump | public | function | ||
TracingDriver::enable | public | function | Enable a callback to be active starting in the next tick. | Overrides Driver::enable |
TracingDriver::formatStacktrace | private | function | Formats a stacktrace obtained via `debug_backtrace()`. | |
TracingDriver::getCancelTrace | private | function | ||
TracingDriver::getCreationTrace | private | function | ||
TracingDriver::getErrorHandler | public | function | Gets the error handler closure or {@code null} if none is set. | Overrides Driver::getErrorHandler |
TracingDriver::getHandle | public | function | @inheritdoc | Overrides Driver::getHandle |
TracingDriver::getIdentifiers | public | function | Returns all registered non-cancelled callback identifiers. | Overrides Driver::getIdentifiers |
TracingDriver::getSuspension | public | function | Returns an object used to suspend and resume execution of the current fiber or {main}. | Overrides Driver::getSuspension |
TracingDriver::getType | public | function | Returns the type of the callback identified by the given callback identifier. | Overrides Driver::getType |
TracingDriver::isEnabled | public | function | Returns whether the callback identified by the given callback identifier is currently enabled. | Overrides Driver::isEnabled |
TracingDriver::isReferenced | public | function | Returns whether the callback identified by the given callback identifier is currently referenced. | Overrides Driver::isReferenced |
TracingDriver::isRunning | public | function | Overrides Driver::isRunning | |
TracingDriver::onReadable | public | function | Execute a callback when a stream resource becomes readable or is closed for reading. | Overrides Driver::onReadable |
TracingDriver::onSignal | public | function | Execute a callback when a signal is received. | Overrides Driver::onSignal |
TracingDriver::onWritable | public | function | Execute a callback when a stream resource becomes writable or is closed for writing. | Overrides Driver::onWritable |
TracingDriver::queue | public | function | Queue a microtask. | Overrides Driver::queue |
TracingDriver::reference | public | function | Reference a callback. | Overrides Driver::reference |
TracingDriver::repeat | public | function | Repeatedly execute a callback. | Overrides Driver::repeat |
TracingDriver::run | public | function | Run the event loop. | Overrides Driver::run |
TracingDriver::setErrorHandler | public | function | Set a callback to be executed when an error occurs. | Overrides Driver::setErrorHandler |
TracingDriver::stop | public | function | Stop the event loop. | Overrides Driver::stop |
TracingDriver::unreference | public | function | Unreference a callback. | Overrides Driver::unreference |
TracingDriver::__construct | public | function | ||
TracingDriver::__debugInfo | public | function | Returns some useful information about the event loop. | Overrides Driver::__debugInfo |