ID: 39987 Updated by: [EMAIL PROTECTED] Reported By: wojtekm86 at konto dot pl -Status: Open +Status: Bogus Bug Type: Semaphore related Operating System: Linux PHP Version: 5.2.0 New Comment:
Thank you for taking the time to write to us, but this is not a bug. Please double-check the documentation available at http://www.php.net/manual/ and the instructions on how to report a bug at http://bugs.php.net/how-to-report.php if you want to remove the semaphore you need to call the sem_remove() function. Closing the semaphore won't remove it no more so then closing a file will remove it from disk. Previous Comments: ------------------------------------------------------------------------ [2006-12-30 10:54:20] wojtekm86 at konto dot pl I think that there is also a problem with parameter max_acquire because value in column nsems always equals 3 ------------------------------------------------------------------------ [2006-12-29 17:45:15] wojtekm86 at konto dot pl Next code. I have a test script with code as follows: <?php $id = sem_get(10); sem_acquire($id); for($ind = 0; $ind < 10000; $ind++) { } sem_release($id); ?> I run it only once. The result I get after execute command ipcs -s on the server: ------ Semaphore Arrays -------- key semid owner perms nsems 0x0000000a 131075 www_php-a 666 3 It seems that there is a problem with semaphores' removal after release. ------------------------------------------------------------------------ [2006-12-29 17:33:32] wojtekm86 at konto dot pl I think it doesn't. In my script I have class Semaphore. There are methods like acquire() and release(). After each sem_acquire instruction I wrote: echo('I\'ve acquired semaphore key: ' . $this->key . '<br>'); After each sem_release instruction I wrote: echo('I\'ve released semaphore key: ' . $this->key . '<br>'); I have executed script only once. The result I saw is: I've acquired semaphore key: 1376159737 I've released semaphore key: 1376159737 I've acquired semaphore key: 1376159747 I've released semaphore key: 1376159747 I've acquired semaphore key: 1376159737 I've released semaphore key: 1376159737 I've acquired semaphore key: 1376159748 I've released semaphore key: 1376159748 I've acquired semaphore key: 1376159737 I've released semaphore key: 1376159737 I've acquired semaphore key: 1376159749 I've released semaphore key: 1376159749 As you can see each semaphore is released. But when I run command ipcs -s on my server I get: ------ Semaphore Arrays -------- key semid owner perms nsems 0x520687e6 131075 www_php-a 600 3 0x520687f9 163844 www_php-a 600 3 0x520687fa 196613 www_php-a 600 3 0x520687fc 229382 www_php-a 600 3 0x520687e9 262151 www_php-a 600 3 0x520687fd 294920 www_php-a 600 3 0x520687fe 327689 www_php-a 600 3 0x520687ff 360458 www_php-a 600 3 0x52068800 393227 www_php-a 600 3 0x52068801 425996 www_php-a 600 3 0x52068802 458765 www_php-a 600 3 0x52068803 491534 www_php-a 600 3 0x52068804 524303 www_php-a 600 3 0x52068805 557072 www_php-a 600 3 You can see that there are not removed semaphores. ------------------------------------------------------------------------ [2006-12-29 17:14:48] [EMAIL PROTECTED] Cannot reproduce. sem_release() DOES remove the semaphor if no other process uses it. ------------------------------------------------------------------------ [2006-12-29 17:01:23] wojtekm86 at konto dot pl Description: ------------ It's impossible to correct remove semaphores with sem_remove function when I use them to provide execution of concurrent processes. When the last process releases the semaphore I should be able to remove it. But I don't know if another process haven't acquired the semaphore. For safety reasons I don't remove released semaphores from system. Now, If I get 128 semaphores and I execute sem_get one more time I will get warning. So, I can't remove semaphores (because I don't know if another process is using it) and I can't get next semaphore. Reproduce code: --------------- $id = sem_get(SOME_ID); sem_acquire($id); HERE IS CRITICAL REGION sem_release($id); Expected result: ---------------- Expected result (and correct, I think) is removal of unused semaphore in sem_release function if another process didn't acquire it and isn't waiting for doing this. Release and Removal of semaphore should be one chain of instructions without possibility of separation (e.g. by interruption). Actual result: -------------- System reaches the maximum number of semaphores and warning is reported. The warning is: Warning: sem_get() [function.sem-get]: failed for key 0x5202e59f: No space left on device in /home/cicik/ftp/php-art/klasy/semafor.php on line 8 ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=39987&edit=1