nowait.phpt 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. --TEST--
  2. Test sem_acquire with nowait option
  3. --SKIPIF--
  4. <?php // vim600: ts=4 sw=4 syn=php fdm=marker
  5. if(!extension_loaded('sysvsem') || !extension_loaded('pcntl')) {
  6. die("skip sysvsem and pcntl required");
  7. }
  8. ?>
  9. --FILE--
  10. <?php
  11. $P_SEMKEY = ftok(__FILE__, 'P'); // Parent Semaphore key
  12. $C_SEMKEY = ftok(__FILE__, 'C'); // Child Semaphore key
  13. echo "P: parent process running.\n";
  14. pcntl_signal(SIGCHLD, SIG_IGN);
  15. // Get semaphore for parent
  16. $p_sem_id = sem_get($P_SEMKEY, 1);
  17. if ($p_sem_id === FALSE) {
  18. echo "P: failed to parent get semaphore\n";
  19. exit;
  20. }
  21. echo "P: got semaphore $p_sem_id.\n";
  22. // Get semaphore for child
  23. $c_sem_id = sem_get($C_SEMKEY, 1);
  24. if ($c_sem_id === FALSE) {
  25. echo "P: failed to child get semaphore\n";
  26. exit;
  27. }
  28. // Acquire semaphore for parent
  29. if (!sem_acquire($p_sem_id)) {
  30. echo "P: fail to acquire semaphore $p_sem_id.\n";
  31. sem_remove($p_sem_id);
  32. exit;
  33. }
  34. echo "P: acquired semaphore $p_sem_id.\n";
  35. // Acquire semaphore for child
  36. if (!sem_acquire($c_sem_id)) {
  37. echo "P: fail to acquire semaphore $c_sem_id.\n";
  38. sem_remove($c_sem_id);
  39. exit;
  40. }
  41. echo "P: acquired semaphore $c_sem_id\n";
  42. // Fork process
  43. $pid = pcntl_fork();
  44. if ($pid) {
  45. register_shutdown_function(function () use ($p_sem_id) {
  46. echo "P: removing semaphore $p_sem_id.\n";
  47. sem_remove($p_sem_id);
  48. });
  49. // Release semaphore after 50ms
  50. usleep(50000);
  51. /* Wait for the child semaphore to be released to
  52. to release the parent semaphore */
  53. if (!sem_acquire($c_sem_id)) {
  54. echo "P: failed to acquire semaphore $c_sem_id.\n";
  55. exit;
  56. }
  57. /* Release the child semahpore before releasing
  58. the releasing the parent semaphore and letting
  59. the child continue execution */
  60. sem_release($c_sem_id);
  61. echo "P: releasing semaphore $p_sem_id.\n";
  62. if (!sem_release($p_sem_id)) {
  63. echo "P: failed to release semaphore\n";
  64. }
  65. $status = null;
  66. pcntl_waitpid($pid, $status);
  67. } else {
  68. register_shutdown_function(function () use ($c_sem_id) {
  69. echo "C: removing semaphore $c_sem_id.\n";
  70. sem_remove($c_sem_id);
  71. });
  72. echo "C: child process running.\n";
  73. // Have the semaphore after process forked
  74. echo "C: got semaphore $p_sem_id and $c_sem_id.\n";
  75. // This should fail to get to the semaphore and not wait
  76. if (sem_acquire($p_sem_id, true)) {
  77. echo "C: test failed, Child was able to acquire semaphore $p_sem_id.\n";
  78. exit;
  79. }
  80. // The child process did not wait to acquire the semaphore
  81. echo "C: failed to acquire semaphore $p_sem_id.\n";
  82. echo "C: releasing semaphore $c_sem_id\n";
  83. if (!sem_release($c_sem_id)) {
  84. echo "C: Failed to release semaphore\n";
  85. }
  86. // Acquire semaphore with waiting
  87. if (!sem_acquire($p_sem_id)) {
  88. echo "C: fail to acquire semaphore $p_sem_id.\n";
  89. exit;
  90. }
  91. echo "C: success acquired semaphore $p_sem_id.\n";
  92. echo "C: releasing semaphore $p_sem_id.\n";
  93. sem_release($p_sem_id);
  94. }
  95. ?>
  96. --EXPECTF--
  97. P: parent process running.
  98. P: got semaphore Resource id #%i.
  99. P: acquired semaphore Resource id #%i.
  100. P: acquired semaphore Resource id #%i
  101. C: child process running.
  102. C: got semaphore Resource id #%i and Resource id #%i.
  103. C: failed to acquire semaphore Resource id #%i.
  104. C: releasing semaphore Resource id #%i
  105. P: releasing semaphore Resource id #%i.
  106. C: success acquired semaphore Resource id #%i.
  107. C: releasing semaphore Resource id #%i.
  108. C: removing semaphore Resource id #%i.
  109. P: removing semaphore Resource id #%i.