Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. TracingDriver.php

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\Driver
View 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&lt;string, string&gt;
TracingDriver::$creationTraces private property @var array&lt;string, string&gt;
TracingDriver::$driver private property
TracingDriver::$enabledCallbacks private property @var array&lt;string, true&gt;
TracingDriver::$unreferencedCallbacks private property @var array&lt;string, true&gt;
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

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal