mirror of
https://github.com/php/php-src.git
synced 2024-09-24 03:17:26 +00:00
104 lines
2.0 KiB
PHP
104 lines
2.0 KiB
PHP
--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.
|