/** * @param \Icicle\Loop\UvLoop $loop * @param \Icicle\Loop\Events\EventFactoryInterface $factory */ public function __construct(UvLoop $loop, EventFactoryInterface $factory) { parent::__construct($loop, $factory); $loopHandle = $loop->getLoopHandle(); $signalCallback = $this->createSignalCallback(); $callback = function ($sigHandle, int $signo) use($signalCallback) { $signalCallback($signo); }; foreach ($this->getSignalList() as $signo) { $sigHandle = \uv_signal_init($loopHandle); \uv_signal_start($sigHandle, $callback, $signo); $this->sigHandles[$signo] = $sigHandle; } }
/** * {@inheritdoc} */ protected function enableSignalWatcher(SignalWatcher $watcher) { if ($watcher->event === null) { if (isset($this->signalEvents[$watcher->signo])) { $watcher->event = $this->signalEvents[$watcher->signo]; } else { $watcher->event = \uv_signal_init($this->loop); } } if (!\uv_is_active($watcher->event)) { \uv_signal_start($watcher->event, $this->signalCallback, $watcher->signo); } $this->signalWatchers[$watcher->signo][$watcher->id] = $watcher; }
/** * {@inheritDoc} */ public function onSignal($signo, callable $func, array $options = []) { $watcher = new \StdClass(); $watcher->id = $watcherId = \spl_object_hash($watcher); $watcher->type = Watcher::SIGNAL; $watcher->callback = $this->wrapSignalCallback($watcher, $func); $watcher->cbData = @$options["cb_data"]; $watcher->isEnabled = isset($options["enable"]) ? (bool) $options["enable"] : true; $watcher->keepAlive = isset($options["keep_alive"]) ? (bool) $options["keep_alive"] : true; $this->keepAliveCount += $watcher->isEnabled && $watcher->keepAlive; $watcher->signo = $signo; $watcher->uvHandle = \uv_signal_init($this->loop); if (empty($watcher->keepAlive)) { \uv_unref($watcher->uvHandle); } if ($watcher->isEnabled) { \uv_signal_start($watcher->uvHandle, $watcher->callback, $watcher->signo); } $this->watchers[$watcherId] = $watcher; return $watcherId; }