@@ -55,30 +55,7 @@ public function __construct()
5555 $ this ->eventBase = event_base_new ();
5656 $ this ->futureTickQueue = new FutureTickQueue ();
5757 $ this ->timerEvents = new SplObjectStorage ();
58-
59- $ this ->signals = new SignalsHandler (
60- $ this ,
61- function ($ signal ) {
62- $ this ->signalEvents [$ signal ] = event_new ();
63- event_set ($ this ->signalEvents [$ signal ], $ signal , EV_PERSIST | EV_SIGNAL , $ f = function () use ($ signal , &$ f ) {
64- $ this ->signals ->call ($ signal );
65- // Ensure there are two copies of the callable around until it has been executed.
66- // For more information see: https://bugs.php.net/bug.php?id=62452
67- // Only an issue for PHP 5, this hack can be removed once PHP 5 support has been dropped.
68- $ g = $ f ;
69- $ f = $ g ;
70- });
71- event_base_set ($ this ->signalEvents [$ signal ], $ this ->eventBase );
72- event_add ($ this ->signalEvents [$ signal ]);
73- },
74- function ($ signal ) {
75- if ($ this ->signals ->count ($ signal ) === 0 ) {
76- event_del ($ this ->signalEvents [$ signal ]);
77- event_free ($ this ->signalEvents [$ signal ]);
78- unset($ this ->signalEvents [$ signal ]);
79- }
80- }
81- );
58+ $ this ->signals = new SignalsHandler ();
8259
8360 $ this ->createTimerCallback ();
8461 $ this ->createStreamCallback ();
@@ -185,11 +162,24 @@ public function futureTick($listener)
185162 public function addSignal ($ signal , $ listener )
186163 {
187164 $ this ->signals ->add ($ signal , $ listener );
165+
166+ if (!isset ($ this ->signalEvents [$ signal ])) {
167+ $ this ->signalEvents [$ signal ] = event_new ();
168+ event_set ($ this ->signalEvents [$ signal ], $ signal , EV_PERSIST | EV_SIGNAL , array ($ this ->signals , 'call ' ));
169+ event_base_set ($ this ->signalEvents [$ signal ], $ this ->eventBase );
170+ event_add ($ this ->signalEvents [$ signal ]);
171+ }
188172 }
189173
190174 public function removeSignal ($ signal , $ listener )
191175 {
192176 $ this ->signals ->remove ($ signal , $ listener );
177+
178+ if (isset ($ this ->signalEvents [$ signal ]) && $ this ->signals ->count ($ signal ) === 0 ) {
179+ event_del ($ this ->signalEvents [$ signal ]);
180+ event_free ($ this ->signalEvents [$ signal ]);
181+ unset($ this ->signalEvents [$ signal ]);
182+ }
193183 }
194184
195185 public function run ()
@@ -202,7 +192,7 @@ public function run()
202192 $ flags = EVLOOP_ONCE ;
203193 if (!$ this ->running || !$ this ->futureTickQueue ->isEmpty ()) {
204194 $ flags |= EVLOOP_NONBLOCK ;
205- } elseif (!$ this ->readEvents && !$ this ->writeEvents && !$ this ->timerEvents ->count ()) {
195+ } elseif (!$ this ->readEvents && !$ this ->writeEvents && !$ this ->timerEvents ->count () && $ this -> signals -> isEmpty () ) {
206196 break ;
207197 }
208198
0 commit comments