Skip to content

Commit

Permalink
bug #48210 [Console]  Fix signal handlers called after event listener…
Browse files Browse the repository at this point in the history
…s and skip exit (GromNaN)

This PR was merged into the 5.4 branch.

Discussion
----------

[Console]  Fix signal handlers called after event listeners and skip exit

| Q             | A
| ------------- | ---
| Branch?       | 5.4
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | Fix #48205
| License       | MIT
| Doc PR        | -

Restore registration of signal handlers after the event dispatcher.
https://github.com/symfony/symfony/pull/45333/files#diff-8f1fd83284712ab08cb5d391da70ea0e78719ef08db852596997a4085848a026L1009

Commits
-------

eebfd6e Fix signal handlers called after event listeners and skip exit
  • Loading branch information
nicolas-grekas committed Nov 14, 2022
2 parents fdf9df3 + eebfd6e commit b0e1f66
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 4 deletions.
8 changes: 4 additions & 4 deletions src/Symfony/Component/Console/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -1012,10 +1012,6 @@ protected function doRunCommand(Command $command, InputInterface $input, OutputI
});
}
}

foreach ($commandSignals as $signal) {
$this->signalRegistry->register($signal, [$command, 'handleSignal']);
}
}

if (null !== $this->dispatcher) {
Expand All @@ -1034,6 +1030,10 @@ protected function doRunCommand(Command $command, InputInterface $input, OutputI
});
}
}

foreach ($commandSignals as $signal) {
$this->signalRegistry->register($signal, [$command, 'handleSignal']);
}
}

if (null === $this->dispatcher) {
Expand Down
18 changes: 18 additions & 0 deletions src/Symfony/Component/Console/Tests/ApplicationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -1975,6 +1975,21 @@ public function testSignalableCommandInterfaceWithoutSignals()
$this->assertSame(0, $application->run(new ArrayInput(['signal'])));
}

public function testSignalableCommandHandlerCalledAfterEventListener()
{
$command = new SignableCommand();

$subscriber = new SignalEventSubscriber();

$dispatcher = new EventDispatcher();
$dispatcher->addSubscriber($subscriber);

$application = $this->createSignalableApplication($command, $dispatcher);
$application->setSignalsToDispatchEvent(\SIGUSR1);
$this->assertSame(1, $application->run(new ArrayInput(['signal'])));
$this->assertSame([SignalEventSubscriber::class, SignableCommand::class], $command->signalHandlers);
}

/**
* @group tty
*/
Expand Down Expand Up @@ -2076,6 +2091,7 @@ public function isEnabled(): bool
class BaseSignableCommand extends Command
{
public $signaled = false;
public $signalHandlers = [];
public $loop = 1000;
private $emitsSignal;

Expand Down Expand Up @@ -2116,6 +2132,7 @@ public function getSubscribedSignals(): array
public function handleSignal(int $signal): void
{
$this->signaled = true;
$this->signalHandlers[] = __CLASS__;
}
}

Expand All @@ -2127,6 +2144,7 @@ public function onSignal(ConsoleSignalEvent $event): void
{
$this->signaled = true;
$event->getCommand()->signaled = true;
$event->getCommand()->signalHandlers[] = __CLASS__;
}

public static function getSubscribedEvents(): array
Expand Down

0 comments on commit b0e1f66

Please sign in to comment.