summaryrefslogtreecommitdiff
path: root/ext/sysvsem/tests/nowait.phpt
blob: 0a6fdf4a5067350319f2b1803963f0b3708a0665 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
--TEST--
sem_acquire with nowait
--SKIPIF--
<?php // vim600: ts=4 sw=4 syn=php fdm=marker
if(!extension_loaded('sysvsem') || !extension_loaded('pcntl')) {
	die("skip sysvsem and pcntl required");
}
?>
--FILE--
<?php
$SEMKEY	= ftok(__FILE__, 'P');  //  Semaphore key

$pid = pcntl_fork();

if ($pid) {
	echo "Parent.\n";

	pcntl_signal(SIGCHLD, SIG_IGN);

	// Get semaphore
	$sem_id = sem_get($SEMKEY, 1);
	if ($sem_id === FALSE) {
		echo "P: fail to get semaphore";
		exit;
	}
	echo "P: got semaphore $sem_id.\n";

	register_shutdown_function(function () use ($sem_id) {
		echo "P: cleanup.\n";
		sem_remove($sem_id);
	});
  
	// Acquire semaphore
	if (! sem_acquire($sem_id)) {
		echo "P: fail to acquire semaphore $sem_id.\n";
		sem_remove($sem_id);
		exit;
	}
	echo "P: success acquire semaphore $sem_id.\n";

	usleep(20000);

	echo "P: releases.\n";
	sem_release($sem_id);

	usleep(5000);

	// Acquire semaphore
	if (! sem_acquire($sem_id)) {
		echo "P: fail to acquire semaphore $sem_id.\n";
		sem_remove($sem_id);
		exit;
	}
	echo "P: success acquire semaphore $sem_id.\n";

	$status = null;
	pcntl_waitpid($pid, $status);

} else {
	usleep(10000);
	echo "Child.\n";

	// Get semaphore
	$sem_id = sem_get($SEMKEY, 1);
	if ($sem_id === FALSE) {
		echo "C: fail to get semaphore";
		exit;
	}
	echo "C: got semaphore $sem_id.\n";
  
	// Acquire semaphore
	if (! sem_acquire($sem_id)) {
		echo "C: fail to acquire semaphore $sem_id.\n";
		exit;
	}
	echo "C: success acquire semaphore $sem_id.\n";

	echo "C: releases.\n";
	sem_release($sem_id);

	usleep(10000);

	// Acquire semaphore
	if (! sem_acquire($sem_id, true)) {
		echo "C: fail to acquire semaphore $sem_id.\n";
		exit;
	}
	echo "C: success acquire semaphore $sem_id.\n";
}

?>
--EXPECTF--
Parent.
P: got semaphore Resource id #%i.
P: success acquire semaphore Resource id #%i.
Child.
C: got semaphore Resource id #%i.
P: releases.
C: success acquire semaphore Resource id #%i.
C: releases.
P: success acquire semaphore Resource id #%i.
C: fail to acquire semaphore Resource id #%i.
P: cleanup.