Skip to content

Commit 8c5647e

Browse files
committed
Merge branch 'PHP-7.1'
* PHP-7.1: Fix nowait.phpt to no longer depend on sleeping
2 parents 1d6f934 + b4459af commit 8c5647e

File tree

1 file changed

+92
-65
lines changed

1 file changed

+92
-65
lines changed

ext/sysvsem/tests/nowait.phpt

Lines changed: 92 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
--TEST--
2-
sem_acquire with nowait
2+
Test sem_acquire with nowait option
33
--SKIPIF--
44
<?php // vim600: ts=4 sw=4 syn=php fdm=marker
55
if(!extension_loaded('sysvsem') || !extension_loaded('pcntl')) {
@@ -8,96 +8,123 @@ if(!extension_loaded('sysvsem') || !extension_loaded('pcntl')) {
88
?>
99
--FILE--
1010
<?php
11-
$SEMKEY = ftok(__FILE__, 'P'); // Semaphore key
11+
$P_SEMKEY = ftok(__FILE__, 'P'); // Parent Semaphore key
12+
$C_SEMKEY = ftok(__FILE__, 'C'); // Child Semaphore key
1213

13-
$pid = pcntl_fork();
14+
echo "P: parent process running.\n";
1415

15-
if ($pid) {
16-
echo "Parent.\n";
16+
pcntl_signal(SIGCHLD, SIG_IGN);
1717

18-
pcntl_signal(SIGCHLD, SIG_IGN);
18+
// Get semaphore for parent
19+
$p_sem_id = sem_get($P_SEMKEY, 1);
20+
if ($p_sem_id === FALSE) {
21+
echo "P: failed to parent get semaphore\n";
22+
exit;
23+
}
1924

20-
// Get semaphore
21-
$sem_id = sem_get($SEMKEY, 1);
22-
if ($sem_id === FALSE) {
23-
echo "P: fail to get semaphore";
24-
exit;
25-
}
26-
echo "P: got semaphore $sem_id.\n";
25+
echo "P: got semaphore $p_sem_id.\n";
2726

28-
register_shutdown_function(function () use ($sem_id) {
29-
echo "P: cleanup.\n";
30-
sem_remove($sem_id);
31-
});
32-
33-
// Acquire semaphore
34-
if (! sem_acquire($sem_id)) {
35-
echo "P: fail to acquire semaphore $sem_id.\n";
36-
sem_remove($sem_id);
37-
exit;
38-
}
39-
echo "P: success acquire semaphore $sem_id.\n";
27+
// Get semaphore for child
28+
$c_sem_id = sem_get($C_SEMKEY, 1);
29+
if ($c_sem_id === FALSE) {
30+
echo "P: failed to child get semaphore\n";
31+
exit;
32+
}
4033

41-
usleep(20000);
4234

43-
echo "P: releases.\n";
44-
sem_release($sem_id);
35+
// Acquire semaphore for parent
36+
if (!sem_acquire($p_sem_id)) {
37+
echo "P: fail to acquire semaphore $p_sem_id.\n";
38+
sem_remove($p_sem_id);
39+
exit;
40+
}
41+
echo "P: acquired semaphore $p_sem_id.\n";
4542

46-
usleep(5000);
43+
// Acquire semaphore for child
44+
if (!sem_acquire($c_sem_id)) {
45+
echo "P: fail to acquire semaphore $c_sem_id.\n";
46+
sem_remove($c_sem_id);
47+
exit;
48+
}
49+
echo "P: acquired semaphore $c_sem_id\n";
50+
// Fork process
51+
$pid = pcntl_fork();
52+
53+
if ($pid) {
4754

48-
// Acquire semaphore
49-
if (! sem_acquire($sem_id)) {
50-
echo "P: fail to acquire semaphore $sem_id.\n";
51-
sem_remove($sem_id);
55+
register_shutdown_function(function () use ($p_sem_id) {
56+
echo "P: removing semaphore $p_sem_id.\n";
57+
sem_remove($p_sem_id);
58+
});
59+
60+
// Release semaphore after 50ms
61+
usleep(50000);
62+
63+
/* Wait for the child semaphore to be released to
64+
to release the parent semaphore */
65+
if (!sem_acquire($c_sem_id)) {
66+
echo "P: failed to acquire semaphore $c_sem_id.\n";
5267
exit;
5368
}
54-
echo "P: success acquire semaphore $sem_id.\n";
5569

70+
echo "P: releasing semaphore $p_sem_id.\n";
71+
if (!sem_release($p_sem_id)) {
72+
echo "P: failed to release semaphore\n";
73+
}
74+
75+
sem_release($c_sem_id);
5676
$status = null;
5777
pcntl_waitpid($pid, $status);
5878

5979
} else {
60-
usleep(10000);
61-
echo "Child.\n";
6280

63-
// Get semaphore
64-
$sem_id = sem_get($SEMKEY, 1);
65-
if ($sem_id === FALSE) {
66-
echo "C: fail to get semaphore";
67-
exit;
68-
}
69-
echo "C: got semaphore $sem_id.\n";
70-
71-
// Acquire semaphore
72-
if (! sem_acquire($sem_id)) {
73-
echo "C: fail to acquire semaphore $sem_id.\n";
81+
register_shutdown_function(function () use ($c_sem_id) {
82+
echo "C: removing semaphore $c_sem_id.\n";
83+
sem_remove($c_sem_id);
84+
});
85+
86+
echo "C: child process running.\n";
87+
88+
// Have the semaphore after process forked
89+
echo "C: got semaphore $p_sem_id and $c_sem_id.\n";
90+
91+
// This should fail to get to the semaphore and not wait
92+
if (sem_acquire($p_sem_id, true)) {
93+
echo "C: test failed, Child was able to acquire semaphore $p_sem_id.\n";
7494
exit;
7595
}
76-
echo "C: success acquire semaphore $sem_id.\n";
7796

78-
echo "C: releases.\n";
79-
sem_release($sem_id);
97+
// The child process did not wait to acquire the semaphore
98+
echo "C: failed to acquire semaphore $p_sem_id.\n";
8099

81-
usleep(10000);
100+
echo "C: releasing semaphore $c_sem_id\n";
101+
if (!sem_release($c_sem_id)) {
102+
echo "C: Failed to release semaphore\n";
103+
}
82104

83-
// Acquire semaphore
84-
if (! sem_acquire($sem_id, true)) {
85-
echo "C: fail to acquire semaphore $sem_id.\n";
105+
// Acquire semaphore with waiting
106+
if (!sem_acquire($p_sem_id)) {
107+
echo "C: fail to acquire semaphore $p_sem_id.\n";
86108
exit;
87109
}
88-
echo "C: success acquire semaphore $sem_id.\n";
110+
echo "C: success acquired semaphore $p_sem_id.\n";
111+
112+
echo "C: releasing semaphore $p_sem_id.\n";
113+
sem_release($p_sem_id);
89114
}
90115

91116
?>
92117
--EXPECTF--
93-
Parent.
118+
P: parent process running.
94119
P: got semaphore Resource id #%i.
95-
P: success acquire semaphore Resource id #%i.
96-
Child.
97-
C: got semaphore Resource id #%i.
98-
P: releases.
99-
C: success acquire semaphore Resource id #%i.
100-
C: releases.
101-
P: success acquire semaphore Resource id #%i.
102-
C: fail to acquire semaphore Resource id #%i.
103-
P: cleanup.
120+
P: acquired semaphore Resource id #%i.
121+
P: acquired semaphore Resource id #%i
122+
C: child process running.
123+
C: got semaphore Resource id #%i and Resource id #%i.
124+
C: failed to acquire semaphore Resource id #%i.
125+
C: releasing semaphore Resource id #%i
126+
P: releasing semaphore Resource id #%i.
127+
C: success acquired semaphore Resource id #%i.
128+
C: releasing semaphore Resource id #%i.
129+
C: removing semaphore Resource id #%i.
130+
P: removing semaphore Resource id #%i.

0 commit comments

Comments
 (0)