ID: 33011 User updated by: joe at bs0 dot com Reported By: joe at bs0 dot com -Status: Feedback +Status: Open Bug Type: Semaphore related Operating System: windows xp PHP Version: 4.3.11, 5.0.4 New Comment:
you are testing this under windows? Previous Comments: ------------------------------------------------------------------------ [2005-05-16 12:24:09] [EMAIL PROTECTED] This code outputs for me: shared memory block marked for deletion. block closed. PHP Warning: shmop_open(): unable to attach or create shared memory segment in /www/index.php on line 27 Warning: shmop_open(): unable to attach or create shared memory segment in /www/index.php on line 27 Could not open previously deleted block. ------------------------------------------------------------------------ [2005-05-15 02:34:02] joe at bs0 dot com as short as I can make it: <?php $toWrite = 'test string'; $shm_len = strlen($toWrite); $shm_id = shmop_open(0xff3, "c", 0644, $shm_len); shmop_write($shm_id, $toWrite, 0); shmop_close($shm_id); $shm_id = shmop_open(0xff3, "a", 0, 0); $data = shmop_read($shm_id, 0, $shm_len); shmop_close($shm_id); $shm_id = shmop_open(0xff3, "w", 0, 0); if (!shmop_delete($shm_id)) { echo "Couldn't mark shared memory block for deletion.<br/>"; } else { echo "shared memory block marked for deletion.<br/>"; } shmop_close($shm_id); echo 'block closed.<br/>'; $shm_id = shmop_open(0xff3, "a", 0, 0); if($shm_id) { $data = shmop_read($shm_id, 0, $shm_len); shmop_close($shm_id); echo 'ERROR: Previously deleted block able to be opened.<br/>'; echo 'Data read : "' . $data . '"'; } else { echo 'Could not open previously deleted block.<br/>'; } ?> ------------------------------------------------------------------------ [2005-05-15 02:00:15] [EMAIL PROTECTED] Provide a *short* and *readable* reproduce script without any "actions" and cases. Just a plain script that runs and shows wrong behaviour. ------------------------------------------------------------------------ [2005-05-14 21:03:26] joe at bs0 dot com I realize this, please see the linked to test case, shmop_close is being called, so shm_nattch is zero. (there are no other processes using this memory. There are a couple problems in tsrm_win32.c: when shmop_delete is called, the block is correctly flagged as needing to be deleted(descriptor->shm_perm.key = -1), however nothing is done with this again. The call to shmdt should call UnmapViewOfFile and CloseHandle on the appropriate handles. After this, the shm_pair needs to be removed from the global array held. The only time the files are unmapped/handles closed is in the destructor. This is the wrong place to do it since the destructor is only called when the sapi module is unloaded. I've changed the code to take care of these problems, just need to do a bit more testing. I'll try to submit a patch later in the day. ------------------------------------------------------------------------ [2005-05-14 19:34:15] [EMAIL PROTECTED] "The segment will only actually be destroyed after the last process detaches it (i.e., when the shm_nattch member of the associated structure shmid_ds is zero)." (c) man shmctl Also read user notes here: http://php.net/shmop_delete ------------------------------------------------------------------------ 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/33011 -- Edit this bug report at http://bugs.php.net/?id=33011&edit=1