Skip to content

Commit 6e7ad68

Browse files
committed
+ tests for Revolt
1 parent 5e9d05b commit 6e7ad68

File tree

2 files changed

+120
-0
lines changed

2 files changed

+120
-0
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
--TEST--
2+
Fiber GC during another fiber start (Revolt scenario)
3+
--FILE--
4+
<?php
5+
6+
use function Async\spawn;
7+
use function Async\await;
8+
9+
echo "Test: Fiber GC during start\n";
10+
11+
class FiberHolder {
12+
private $fiber;
13+
14+
public function __construct() {
15+
echo "FiberHolder created\n";
16+
$this->fiber = new Fiber(function() {
17+
echo "Temp fiber\n";
18+
});
19+
}
20+
21+
public function __destruct() {
22+
echo "FiberHolder destroyed\n";
23+
}
24+
}
25+
26+
$c = spawn(function() {
27+
// Create a temporary fiber holder (like Revolt's temporary driver)
28+
$temp = new FiberHolder();
29+
30+
// Create the main fiber (like Revolt's actual driver)
31+
$mainFiber = new Fiber(function() {
32+
echo "Main fiber started\n";
33+
});
34+
35+
// Unset temp to make it eligible for GC
36+
unset($temp);
37+
38+
// Starting main fiber might trigger GC, which destroys temp
39+
// This simulates what happens in Revolt when EventLoop::setDriver creates
40+
// a temporary driver, then the real driver, and GC happens on fiber->start()
41+
$mainFiber->start();
42+
43+
return "done";
44+
});
45+
46+
await($c);
47+
echo "Test completed\n";
48+
?>
49+
--EXPECT--
50+
Test: Fiber GC during start
51+
FiberHolder created
52+
FiberHolder destroyed
53+
Main fiber started
54+
Test completed
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
--TEST--
2+
Multiple fibers GC during start (Revolt driver scenario)
3+
--FILE--
4+
<?php
5+
6+
use function Async\spawn;
7+
use function Async\await;
8+
9+
echo "Test: Multiple fibers GC on start\n";
10+
11+
class Driver {
12+
private $loopFiber;
13+
private $callbackFiber;
14+
15+
public function __construct() {
16+
echo "Driver created\n";
17+
// Simulate Revolt's loop fiber and callback fiber
18+
$this->loopFiber = new Fiber(function() {
19+
echo "Loop fiber\n";
20+
});
21+
22+
$this->callbackFiber = new Fiber(function() {
23+
echo "Callback fiber\n";
24+
});
25+
}
26+
27+
public function __destruct() {
28+
echo "Driver destroyed\n";
29+
}
30+
}
31+
32+
$c = spawn(function() {
33+
// Create temporary driver (like Revolt's GC protection driver)
34+
$tempDriver = new Driver();
35+
36+
// Create actual driver
37+
$actualDriver = new Driver();
38+
39+
// Replace temp with actual (simulates setDriver)
40+
$tempDriver = null;
41+
42+
// Now create and start a fiber (simulates run())
43+
// This should trigger GC which destroys the temp driver
44+
$runFiber = new Fiber(function() {
45+
echo "Run fiber started\n";
46+
});
47+
48+
echo "About to start run fiber\n";
49+
$runFiber->start();
50+
echo "Run fiber completed\n";
51+
52+
return "done";
53+
});
54+
55+
await($c);
56+
echo "Test completed\n";
57+
?>
58+
--EXPECT--
59+
Test: Multiple fibers GC on start
60+
Driver created
61+
Driver created
62+
About to start run fiber
63+
Driver destroyed
64+
Run fiber started
65+
Run fiber completed
66+
Test completed

0 commit comments

Comments
 (0)