Skip to content

Commit b4459af

Browse files
mhagstrandkrakjoe
authored andcommitted
Fix nowait.phpt to no longer depend on sleeping
In Travis CI the nowait.phpt test sometimes fails because of the usleep() not being long enough ensure proper execution order. Instead of depending on sleeping the test now uses two semaphores to guarantee execution order.
1 parent 876b7b1 commit b4459af

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)