1
1
--TEST--
2
- sem_acquire with nowait
2
+ Test sem_acquire with nowait option
3
3
--SKIPIF--
4
4
<?php // vim600: ts=4 sw=4 syn=php fdm=marker
5
5
if (!extension_loaded ('sysvsem ' ) || !extension_loaded ('pcntl ' )) {
@@ -8,96 +8,123 @@ if(!extension_loaded('sysvsem') || !extension_loaded('pcntl')) {
8
8
?>
9
9
--FILE--
10
10
<?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
12
13
13
- $ pid = pcntl_fork () ;
14
+ echo " P: parent process running. \n" ;
14
15
15
- if ($ pid ) {
16
- echo "Parent. \n" ;
16
+ pcntl_signal (SIGCHLD , SIG_IGN );
17
17
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
+ }
19
24
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" ;
27
26
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
+ }
40
33
41
- usleep (20000 );
42
34
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" ;
45
42
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 ) {
47
54
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" ;
52
67
exit ;
53
68
}
54
- echo "P: success acquire semaphore $ sem_id. \n" ;
55
69
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 );
56
76
$ status = null ;
57
77
pcntl_waitpid ($ pid , $ status );
58
78
59
79
} else {
60
- usleep (10000 );
61
- echo "Child. \n" ;
62
80
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" ;
74
94
exit ;
75
95
}
76
- echo "C: success acquire semaphore $ sem_id. \n" ;
77
96
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" ;
80
99
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
+ }
82
104
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" ;
86
108
exit ;
87
109
}
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 );
89
114
}
90
115
91
116
?>
92
117
--EXPECTF--
93
- Parent .
118
+ P: parent process running .
94
119
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