Skip to content

Commit 44d127a

Browse files
committed
hook array functions only in coroutines
1 parent ed77b8b commit 44d127a

26 files changed

+615
-571
lines changed

swoole_runtime.cc

+12-8
Original file line numberDiff line numberDiff line change
@@ -939,6 +939,16 @@ static php_stream *socket_create(
939939
return stream;
940940
}
941941

942+
static void init_function()
943+
{
944+
if (function_table)
945+
{
946+
return;
947+
}
948+
function_table = (zend_array*) emalloc(sizeof(zend_array));
949+
zend_hash_init(function_table, 8, NULL, NULL, 0);
950+
}
951+
942952
bool PHPCoroutine::enable_hook(int flags)
943953
{
944954
if (unlikely(enable_strict_mode))
@@ -960,7 +970,7 @@ bool PHPCoroutine::enable_hook(int flags)
960970
// file
961971
memcpy((void*) &ori_php_plain_files_wrapper, &php_plain_files_wrapper, sizeof(php_plain_files_wrapper));
962972

963-
inject_function();
973+
init_function();
964974

965975
hook_init = true;
966976
}
@@ -1193,13 +1203,7 @@ bool PHPCoroutine::enable_hook(int flags)
11931203

11941204
bool PHPCoroutine::inject_function()
11951205
{
1196-
if (function_table)
1197-
{
1198-
return false;
1199-
}
1200-
1201-
function_table = (zend_array*) emalloc(sizeof(zend_array));
1202-
zend_hash_init(function_table, 8, NULL, NULL, 0);
1206+
init_function();
12031207
/**
12041208
* array_walk, array_walk_recursive can not work in coroutine
12051209
* replace them with the php swoole library

tests/swoole_library/array/walk/array_walk.phpt

+12-8
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,25 @@ function foo($v1, $v2, $v3)
1515
var_dump($v3);
1616
}
1717

18-
$var = [1, 2];
19-
var_dump(array_walk($var, "foo", "data"));
2018

2119
function foo2($v1, $v2, $v3)
2220
{
2321
throw new Exception($v3);
2422
}
2523

26-
try {
27-
var_dump(array_walk($var, "foo2", "data"));
28-
} catch (Exception $e) {
29-
var_dump($e->getMessage());
30-
}
24+
go(function(){
25+
$var = [1, 2];
26+
var_dump(array_walk($var, "foo", "data"));
27+
28+
try {
29+
var_dump(array_walk($var, "foo2", "data"));
30+
} catch (Exception $e) {
31+
var_dump($e->getMessage());
32+
}
33+
34+
echo "Done\n";
35+
});
3136

32-
echo "Done\n";
3337
?>
3438
--EXPECTF--
3539
int(1)

tests/swoole_library/array/walk/array_walk_basic1.phpt

+12-12
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,6 @@ Swoole\Runtime::enableCoroutine();
1313
* Source code: ext/standard/array.c
1414
*/
1515

16-
echo "*** Testing array_walk() : basic functionality ***\n";
17-
18-
// regular array
19-
$fruits = ["lemon", "orange", "banana", "apple"];
20-
2116
/* Prototype : test_print(mixed $item, mixed $key)
2217
* Parameters : item - item in key/item pair
2318
* key - key in key/item pair
@@ -42,13 +37,18 @@ function with_userdata($item, $key, $user_data)
4237
echo "\n"; // new line to separate the output between each element
4338
}
4439

45-
echo "-- Using array_walk() with default parameters to show array contents --\n";
46-
var_dump(array_walk($fruits, 'test_print'));
47-
48-
echo "-- Using array_walk() with all parameters --\n";
49-
var_dump(array_walk($fruits, 'with_userdata', "Added"));
50-
51-
echo "Done";
40+
echo "*** Testing array_walk() : basic functionality ***\n";
41+
go(function(){
42+
// regular array
43+
$fruits = ["lemon", "orange", "banana", "apple"];
44+
echo "-- Using array_walk() with default parameters to show array contents --\n";
45+
var_dump(array_walk($fruits, 'test_print'));
46+
47+
echo "-- Using array_walk() with all parameters --\n";
48+
var_dump(array_walk($fruits, 'with_userdata', "Added"));
49+
50+
echo "Done";
51+
});
5252
?>
5353
--EXPECT--
5454
*** Testing array_walk() : basic functionality ***

tests/swoole_library/array/walk/array_walk_basic2.phpt

+14-13
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@ Swoole\Runtime::enableCoroutine();
1515

1616
echo "*** Testing array_walk() : basic functionality ***\n";
1717

18-
// associative array
19-
$fruits = ["d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple"];
2018

2119
// User defined callback functions
2220
/* Prototype : test_alter(mixed $item, mixed $key, string $prefix)
@@ -48,17 +46,20 @@ function test_print($item, $key)
4846
var_dump($key); // key
4947
echo "\n"; // new line to separate the output between each element
5048
}
51-
52-
echo "-- Using array_walk with default parameters to show array contents --\n";
53-
var_dump(array_walk($fruits, 'test_print'));
54-
55-
echo "-- Using array_walk with one optional parameter to modify contents --\n";
56-
var_dump(array_walk($fruits, 'test_alter', 'fruit'));
57-
58-
echo "-- Using array_walk with default parameters to show modified array contents --\n";
59-
var_dump(array_walk($fruits, 'test_print'));
60-
61-
echo "Done";
49+
go(function(){
50+
// associative array
51+
$fruits = ["d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple"];
52+
echo "-- Using array_walk with default parameters to show array contents --\n";
53+
var_dump(array_walk($fruits, 'test_print'));
54+
55+
echo "-- Using array_walk with one optional parameter to modify contents --\n";
56+
var_dump(array_walk($fruits, 'test_alter', 'fruit'));
57+
58+
echo "-- Using array_walk with default parameters to show modified array contents --\n";
59+
var_dump(array_walk($fruits, 'test_print'));
60+
61+
echo "Done";
62+
});
6263
?>
6364
--EXPECT--
6465
*** Testing array_walk() : basic functionality ***

tests/swoole_library/array/walk/array_walk_closure.phpt

+84-83
Original file line numberDiff line numberDiff line change
@@ -7,89 +7,90 @@ swoole_library/array/walk: array_walk_closure.phptarray_walk() closure tests
77
require __DIR__ . '/../../../include/bootstrap.php';
88

99
Swoole\Runtime::enableCoroutine();
10-
11-
$ar = ["one" => 1, "two" => 2, "three" => 3];
12-
var_dump(array_walk($ar, function () { var_dump(func_get_args()); }));
13-
14-
echo "\nclosure with array\n";
15-
$ar = ["one" => 1, "two" => 2, "three" => 3];
16-
$user_data = ["sum" => 42];
17-
$func = function ($value, $key, &$udata) {
18-
var_dump($udata);
19-
$udata["sum"] += $value;
20-
};
21-
22-
var_dump(array_walk($ar, $func, $user_data));
23-
echo "End result:";
24-
var_dump($user_data["sum"]);
25-
26-
echo "\nclosure with use\n";
27-
$ar = ["one" => 1, "two" => 2, "three" => 3];
28-
$user_data = ["sum" => 42];
29-
$func = function ($value, $key) use (&$user_data) {
30-
var_dump($user_data);
31-
$user_data["sum"] += $value;
32-
};
33-
34-
var_dump(array_walk($ar, $func, $user_data));
35-
echo "End result:";
36-
var_dump($user_data["sum"]);
37-
38-
39-
echo "\nclosure with object\n";
40-
$ar = ["one" => 1, "two" => 2, "three" => 3];
41-
$user_data = (object)["sum" => 42];
42-
$func = function ($value, $key, &$udata) {
43-
var_dump($udata);
44-
$udata->sum += $value;
45-
};
46-
47-
var_dump(array_walk($ar, $func, $user_data));
48-
echo "End result:";
49-
var_dump($user_data->sum);
50-
51-
52-
echo "\nfunction with object\n";
53-
function sum_it_up_object($value, $key, $udata)
54-
{
55-
var_dump($udata);
56-
$udata->sum += $value;
57-
}
58-
59-
$ar = ["one" => 1, "two" => 2, "three" => 3];
60-
$user_data = (object)["sum" => 42];
61-
62-
var_dump(array_walk($ar, "sum_it_up_object", $user_data));
63-
echo "End result:";
64-
var_dump($user_data->sum);
65-
66-
67-
echo "\nfunction with array\n";
68-
function sum_it_up_array($value, $key, $udata)
69-
{
70-
var_dump($udata);
71-
$udata['sum'] += $value;
72-
}
73-
74-
$ar = ["one" => 1, "two" => 2, "three" => 3];
75-
$user_data = ["sum" => 42];
76-
77-
var_dump(array_walk($ar, "sum_it_up_array", $user_data));
78-
echo "End result:";
79-
var_dump($user_data['sum']);
80-
81-
echo "closure and exception\n";
82-
$ar = ["one" => 1, "two" => 2, "three" => 3];
83-
Assert::throws(function () {
84-
var_dump(array_walk($ar, function ($v, $k) {
85-
if ($v == 2) {
86-
throw new Exception;
87-
}
88-
}));
89-
}, TypeError::class);
90-
91-
92-
echo "Done\n";
10+
go(function(){
11+
$ar = ["one" => 1, "two" => 2, "three" => 3];
12+
var_dump(array_walk($ar, function () { var_dump(func_get_args()); }));
13+
14+
echo "\nclosure with array\n";
15+
$ar = ["one" => 1, "two" => 2, "three" => 3];
16+
$user_data = ["sum" => 42];
17+
$func = function ($value, $key, &$udata) {
18+
var_dump($udata);
19+
$udata["sum"] += $value;
20+
};
21+
22+
var_dump(array_walk($ar, $func, $user_data));
23+
echo "End result:";
24+
var_dump($user_data["sum"]);
25+
26+
echo "\nclosure with use\n";
27+
$ar = ["one" => 1, "two" => 2, "three" => 3];
28+
$user_data = ["sum" => 42];
29+
$func = function ($value, $key) use (&$user_data) {
30+
var_dump($user_data);
31+
$user_data["sum"] += $value;
32+
};
33+
34+
var_dump(array_walk($ar, $func, $user_data));
35+
echo "End result:";
36+
var_dump($user_data["sum"]);
37+
38+
39+
echo "\nclosure with object\n";
40+
$ar = ["one" => 1, "two" => 2, "three" => 3];
41+
$user_data = (object)["sum" => 42];
42+
$func = function ($value, $key, &$udata) {
43+
var_dump($udata);
44+
$udata->sum += $value;
45+
};
46+
47+
var_dump(array_walk($ar, $func, $user_data));
48+
echo "End result:";
49+
var_dump($user_data->sum);
50+
51+
52+
echo "\nfunction with object\n";
53+
function sum_it_up_object($value, $key, $udata)
54+
{
55+
var_dump($udata);
56+
$udata->sum += $value;
57+
}
58+
59+
$ar = ["one" => 1, "two" => 2, "three" => 3];
60+
$user_data = (object)["sum" => 42];
61+
62+
var_dump(array_walk($ar, "sum_it_up_object", $user_data));
63+
echo "End result:";
64+
var_dump($user_data->sum);
65+
66+
67+
echo "\nfunction with array\n";
68+
function sum_it_up_array($value, $key, $udata)
69+
{
70+
var_dump($udata);
71+
$udata['sum'] += $value;
72+
}
73+
74+
$ar = ["one" => 1, "two" => 2, "three" => 3];
75+
$user_data = ["sum" => 42];
76+
77+
var_dump(array_walk($ar, "sum_it_up_array", $user_data));
78+
echo "End result:";
79+
var_dump($user_data['sum']);
80+
81+
echo "closure and exception\n";
82+
$ar = ["one" => 1, "two" => 2, "three" => 3];
83+
Assert::throws(function () {
84+
var_dump(array_walk($ar, function ($v, $k) {
85+
if ($v == 2) {
86+
throw new Exception;
87+
}
88+
}));
89+
}, TypeError::class);
90+
91+
92+
echo "Done\n";
93+
});
9394
?>
9495
--EXPECTF--
9596
array(2) {

0 commit comments

Comments
 (0)