You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit dde6a08
Browse filesBrowse the repository at this point in the historyBrowse files
Fix pcntl_signal_dispatch() undoing the signal mask changes of its handlers
The dispatch blocked every signal while its handlers ran and then restored the
mask it found. A handler's pcntl_sigprocmask() was undone, and so was an
unblock done by pcntl_signal() (zend_sigaction()) or by an extension a handler
calls into, after which nothing unblocked that signal again. A signal such an
unblock let in during the handlers was lost: the end of the dispatch cleared
pending_signals, or overwrote the queue's head after a throwing handler, and
the engine interrupt it raised was spent on a nested dispatch that returned at
once.
Each handler now runs under the thread's own mask, and signals are blocked only
while the queue changes. A signal that arrives meanwhile stays queued, after
what a throwing handler left, and with async signals the engine is asked to
come back for it. A block an extension takes in a handler on a signal that was
not blocked before the dispatch now stays too.
0 commit comments