ID: 39987
User updated by: wojtekm86 at konto dot pl
Reported By: wojtekm86 at konto dot pl
Status: Open
Bug Type: Semaphore related
Operating System: Linux
PHP Version: 5.2.0
New Comment:
I will try to tell about my sugestion.
I assume that I have a function my_sem_remove($sem_id):
function my_sem_remove($id) {
if(Semaphore $id isn't acquired and its FIFO is empty)
sem_remove($id);
}
None of instructions in this function can be interrupted.
So, now the problem is simple to resolve:
$id = sem_get(ID);
sem_acquire($id);
CRITICAL REGION
sem_release($id);
my_sem_remove($id);
But now, two instructions: sem_release and my_sem_remove are not
needed. It's simple to replace them by one function my_sem_release:
function my_sem_release($id) {
sem_release($id);
my_sem_remove($id);
}
For reasons which about I will write later those instructions can't be
interrupted.
So, my example look like this:
$id = sem_get(ID);
sem_acquire($id);
CRITICAL REGION
my_sem_release($id);
But let's imagine two concurrent processes executing code above:
PROC1: $id = sem_get(ID);
<--- interrupt
PROC2: $id = sem_get(ID);
sem_acquire($id);
CRITICAL REGION
my_sem_release($id);
<--- interrupt
PROC1: sem_acquire($id); <--- Uuups!! Error: semaphore doesn't exists,
PROC2 has removed it.
My solution:
Instructions sem_get and sem_acquire can't be interrupted.
So, I assume that there is a function my_sem_acquire:
function my_sem_acquire($key, $max_acquire = 1, $perm = 0666,
$auto_release = true) {
$id = sem_get($key, $max_acquire, $perm, $auto_release);
sem_acquire();
return $id;
}
None of instructions in function above can be interrupted.
And finally correct example:
$id = my_sem_acquire(SEMKEY);
CRITICAL REGION
my_sem_release($id);
It's the best solutions without danger of operating on not existing
semaphores. Also, unused semaphores are automaticcally removed. The
problem is, that functions my_sem_acquire and my_sem_release can't be
witten in PHP so it must be done in C inside source of PHP.
Previous Comments:
------------------------------------------------------------------------
[2006-12-31 08:26:11] wojtekm86 at konto dot pl
I'm changing the status to Open
------------------------------------------------------------------------
[2006-12-31 08:24:09] wojtekm86 at konto dot pl
I think you don't understand me.
I know that sem_release doesn't remove the semaphore but I think it
should because it's the one and only way to do it correct, of course if
current process, which releases a semaphore, is the last one which
acquired it.
Please, read one more time bug's description.
I think you didn't understand my intention.
------------------------------------------------------------------------
[2006-12-30 23:19:34] [EMAIL PROTECTED]
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.
------------------------------------------------------------------------
[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.
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
http://bugs.php.net/39987
--
Edit this bug report at http://bugs.php.net/?id=39987&edit=1