Skip to content

Fatal error: Uncaught AssertionError: assert($fiber !== $this->fiber) when server::stop() in Windows sapi_windows_set_ctrl_handler() #29

@DrLightman

Description

@DrLightman

I adapted the last lines of the example in the README to Windows, because SIGINT (pcntl) is not available there.
I converted it this way making use of sapi_windows_set_ctrl_handler($callback) to intercept CTRL+C whilst the script is running in a terminal.

EventLoop::defer( function () use ( $logger, $server ): void {
    $logger->info( 'OS: Windows' );
    // async wait for server admin to hit CTRL+C
    sapi_windows_set_ctrl_handler( function ( int $event ) use ( $logger, $server ) {
        $logger->info( sprintf( "Received signal, stopping HTTP server" ) );
        $server->stop();
    } );
} );

EventLoop::run();

The callback is fired, the server says is stopping, but an assertion fires afterward, I don't think it successfully stops:

...
...
[2025-01-05T14:39:38.870938+00:00] server.info: OS: Windows
[2025-01-05T14:39:41.882420+00:00] server.info: Received signal, stopping HTTP server
[2025-01-05T14:39:41.882738+00:00] server.info: Stopping server

Fatal error: Uncaught AssertionError: assert($fiber !== $this->fiber) in D:\server-php\vendor\revolt\event-loop\src\EventLoop\Internal\AbstractDriver.php:293
Stack trace:
#0 D:\server-php\vendor\revolt\event-loop\src\EventLoop\Internal\AbstractDriver.php(293): assert(false, 'assert($fiber !...')
#1 D:\server-php\vendor\revolt\event-loop\src\EventLoop.php(392): Revolt\EventLoop\Internal\AbstractDriver->getSuspension()
#2 D:\server-php\vendor\amphp\amp\src\Internal\FutureIterator.php(130): Revolt\EventLoop::getSuspension()
#3 D:\server-php\vendor\amphp\amp\src\Future.php(59): Amp\Internal\FutureIterator->consume()
#4 D:\server-php\vendor\amphp\amp\src\Future\functions.php(118): Amp\Future::iterate(Array, NULL)
#5 D:\server-php\vendor\amphp\http-server\src\SocketHttpServer.php(402): Amp\Future\awaitAll(Array)
#6 D:\server-php\start-php8.php(88): Amp\Http\Server\SocketHttpServer->stop()
#7 [internal function]: {closure:D:\server-php\start-php8.php:85}(0)
#8 D:\server-php\vendor\revolt\event-loop\src\EventLoop\Driver\StreamSelectDriver.php(254): stream_select(Array, Array, Array, 0, 999642)
#9 D:\server-php\vendor\revolt\event-loop\src\EventLoop\Driver\StreamSelectDriver.php(133): Revolt\EventLoop\Driver\StreamSelectDriver->selectStreams(Array, Array, 0.9996424000019)
#10 D:\server-php\vendor\revolt\event-loop\src\EventLoop\Internal\AbstractDriver.php(489): Revolt\EventLoop\Driver\StreamSelectDriver->dispatch(true)
#11 D:\server-php\vendor\revolt\event-loop\src\EventLoop\Internal\AbstractDriver.php(552): Revolt\EventLoop\Internal\AbstractDriver->tick(true)
#12 [internal function]: Revolt\EventLoop\Internal\AbstractDriver->{closure:Revolt\EventLoop\Internal\AbstractDriver::createLoopFiber():533}()
#13 D:\server-php\vendor\revolt\event-loop\src\EventLoop\Internal\AbstractDriver.php(113): Fiber->resume()
#14 D:\server-php\vendor\revolt\event-loop\src\EventLoop.php(406): Revolt\EventLoop\Internal\AbstractDriver->run()
#15 D:\server-php\start-php8.php(106): Revolt\EventLoop::run()
#16 {main}
  thrown in D:\server-php\vendor\revolt\event-loop\src\EventLoop\Internal\AbstractDriver.php on line 293

This is not breaking the script atm but maybe it's worth taking a look into it?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions