@@ -16,14 +16,24 @@ final class Loop
16
16
*/
17
17
private static $ driver = null ;
18
18
19
+ /**
20
+ * @var bool
21
+ */
22
+ private static $ running = false ;
23
+
19
24
/**
20
25
* Set the factory to be used to create a driver if none is passed to
21
- * self::execute. A default driver will be created if none exists yet
26
+ * self::execute. A default driver will be created if none is running
22
27
* to support synchronous waits in traditional applications.
23
28
*/
24
- public static function setFactory (LoopDriverFactory $ factory = null ) {
29
+ public static function setFactory (LoopDriverFactory $ factory = null )
30
+ {
25
31
self ::$ factory = $ factory ;
26
- self ::$ driver = self ::$ driver ?: self ::createDriver ();
32
+
33
+ if (!self ::$ running ) {
34
+ self ::$ driver = self ::createDriver ();
35
+ self ::$ registry = [];
36
+ }
27
37
}
28
38
29
39
/**
@@ -36,12 +46,14 @@ public static function setFactory(LoopDriverFactory $factory = null) {
36
46
*/
37
47
public static function execute (callable $ callback , LoopDriver $ driver = null )
38
48
{
39
- $ driver = $ driver ?: self ::createDriver ();
40
49
$ previousRegistry = self ::$ registry ;
41
-
42
50
$ previousDriver = self ::$ driver ;
51
+
52
+ $ driver = $ driver ?: self ::createDriver ();
53
+
43
54
self ::$ driver = $ driver ;
44
55
self ::$ registry = [];
56
+ self ::$ running = true ;
45
57
46
58
try {
47
59
$ callback ();
@@ -50,6 +62,7 @@ public static function execute(callable $callback, LoopDriver $driver = null)
50
62
} finally {
51
63
self ::$ driver = $ previousDriver ;
52
64
self ::$ registry = $ previousRegistry ;
65
+ self ::$ running = false ;
53
66
}
54
67
}
55
68
@@ -67,7 +80,8 @@ private static function createDriver()
67
80
$ driver = self ::$ factory ->create ();
68
81
69
82
if (!$ driver instanceof LoopDriver) {
70
- throw new \LogicException ("LoopDriverFactory didn't return a LoopDriver. " );
83
+ $ type = is_object ($ driver ) ? "an instance of " . get_class ($ driver ) : gettype ($ driver );
84
+ throw new \LogicException ("Factory returned {$ type }, but must return an instance of LoopDriver. " );
71
85
}
72
86
73
87
return $ driver ;
@@ -81,7 +95,7 @@ private static function createDriver()
81
95
public static function get ()
82
96
{
83
97
if (null === self ::$ driver ) {
84
- throw new \RuntimeException ('Not within the scope of an event loop driver ' );
98
+ throw new \RuntimeException ('Missing driver; Neither in Loop::execute nor factory set. ' );
85
99
}
86
100
87
101
return self ::$ driver ;
@@ -268,12 +282,16 @@ public static function setErrorHandler(callable $callback = null)
268
282
*
269
283
* @return bool
270
284
*/
271
- public static function supports ($ feature ) {
285
+ public static function supports ($ feature )
286
+ {
272
287
return self ::get ()->supports ($ feature );
273
288
}
274
289
275
290
/**
276
291
* Disable construction as this is a static class.
277
292
*/
278
- private function __construct () {}
293
+ private function __construct ()
294
+ {
295
+ // intentionally left blank
296
+ }
279
297
}
0 commit comments