diff options
Diffstat (limited to 'ext/sysvsem')
-rw-r--r-- | ext/sysvsem/tests/nowait.phpt | 157 |
1 files changed, 92 insertions, 65 deletions
diff --git a/ext/sysvsem/tests/nowait.phpt b/ext/sysvsem/tests/nowait.phpt index 0a6fdf4a50..8557ce33ee 100644 --- a/ext/sysvsem/tests/nowait.phpt +++ b/ext/sysvsem/tests/nowait.phpt @@ -1,5 +1,5 @@ --TEST-- -sem_acquire with nowait +Test sem_acquire with nowait option --SKIPIF-- <?php // vim600: ts=4 sw=4 syn=php fdm=marker if(!extension_loaded('sysvsem') || !extension_loaded('pcntl')) { @@ -8,96 +8,123 @@ if(!extension_loaded('sysvsem') || !extension_loaded('pcntl')) { ?> --FILE-- <?php -$SEMKEY = ftok(__FILE__, 'P'); // Semaphore key +$P_SEMKEY = ftok(__FILE__, 'P'); // Parent Semaphore key +$C_SEMKEY = ftok(__FILE__, 'C'); // Child Semaphore key -$pid = pcntl_fork(); +echo "P: parent process running.\n"; -if ($pid) { - echo "Parent.\n"; +pcntl_signal(SIGCHLD, SIG_IGN); - pcntl_signal(SIGCHLD, SIG_IGN); +// Get semaphore for parent +$p_sem_id = sem_get($P_SEMKEY, 1); +if ($p_sem_id === FALSE) { + echo "P: failed to parent get semaphore\n"; + exit; +} - // 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"; +echo "P: got semaphore $p_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"; +// Get semaphore for child +$c_sem_id = sem_get($C_SEMKEY, 1); +if ($c_sem_id === FALSE) { + echo "P: failed to child get semaphore\n"; + exit; +} - usleep(20000); - echo "P: releases.\n"; - sem_release($sem_id); +// Acquire semaphore for parent +if (!sem_acquire($p_sem_id)) { + echo "P: fail to acquire semaphore $p_sem_id.\n"; + sem_remove($p_sem_id); + exit; +} +echo "P: acquired semaphore $p_sem_id.\n"; - usleep(5000); +// Acquire semaphore for child +if (!sem_acquire($c_sem_id)) { + echo "P: fail to acquire semaphore $c_sem_id.\n"; + sem_remove($c_sem_id); + exit; +} +echo "P: acquired semaphore $c_sem_id\n"; +// Fork process +$pid = pcntl_fork(); + +if ($pid) { - // Acquire semaphore - if (! sem_acquire($sem_id)) { - echo "P: fail to acquire semaphore $sem_id.\n"; - sem_remove($sem_id); + register_shutdown_function(function () use ($p_sem_id) { + echo "P: removing semaphore $p_sem_id.\n"; + sem_remove($p_sem_id); + }); + + // Release semaphore after 50ms + usleep(50000); + + /* Wait for the child semaphore to be released to + to release the parent semaphore */ + if (!sem_acquire($c_sem_id)) { + echo "P: failed to acquire semaphore $c_sem_id.\n"; exit; } - echo "P: success acquire semaphore $sem_id.\n"; + echo "P: releasing semaphore $p_sem_id.\n"; + if (!sem_release($p_sem_id)) { + echo "P: failed to release semaphore\n"; + } + + sem_release($c_sem_id); $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"; + register_shutdown_function(function () use ($c_sem_id) { + echo "C: removing semaphore $c_sem_id.\n"; + sem_remove($c_sem_id); + }); + + echo "C: child process running.\n"; + + // Have the semaphore after process forked + echo "C: got semaphore $p_sem_id and $c_sem_id.\n"; + + // This should fail to get to the semaphore and not wait + if (sem_acquire($p_sem_id, true)) { + echo "C: test failed, Child was able to acquire semaphore $p_sem_id.\n"; exit; } - echo "C: success acquire semaphore $sem_id.\n"; - echo "C: releases.\n"; - sem_release($sem_id); + // The child process did not wait to acquire the semaphore + echo "C: failed to acquire semaphore $p_sem_id.\n"; - usleep(10000); + echo "C: releasing semaphore $c_sem_id\n"; + if (!sem_release($c_sem_id)) { + echo "C: Failed to release semaphore\n"; + } - // Acquire semaphore - if (! sem_acquire($sem_id, true)) { - echo "C: fail to acquire semaphore $sem_id.\n"; + // Acquire semaphore with waiting + if (!sem_acquire($p_sem_id)) { + echo "C: fail to acquire semaphore $p_sem_id.\n"; exit; } - echo "C: success acquire semaphore $sem_id.\n"; + echo "C: success acquired semaphore $p_sem_id.\n"; + + echo "C: releasing semaphore $p_sem_id.\n"; + sem_release($p_sem_id); } ?> --EXPECTF-- -Parent. +P: parent process running. 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. +P: acquired semaphore Resource id #%i. +P: acquired semaphore Resource id #%i +C: child process running. +C: got semaphore Resource id #%i and Resource id #%i. +C: failed to acquire semaphore Resource id #%i. +C: releasing semaphore Resource id #%i +P: releasing semaphore Resource id #%i. +C: success acquired semaphore Resource id #%i. +C: releasing semaphore Resource id #%i. +C: removing semaphore Resource id #%i. +P: removing semaphore Resource id #%i. |