summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/shm.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2007-11-05 15:25:55 +0000
committerCorinna Vinschen <corinna@vinschen.de>2007-11-05 15:25:55 +0000
commit5c8426d50e255a317b9ab4586776f238ad2154ae (patch)
tree82bdfc5b225f0f2317a89c70db007f1959a7f2b8 /winsup/cygwin/shm.cc
parent92beb4638f08452261beab4629d74aee759b1732 (diff)
downloadcygnal-5c8426d50e255a317b9ab4586776f238ad2154ae.tar.gz
cygnal-5c8426d50e255a317b9ab4586776f238ad2154ae.tar.bz2
cygnal-5c8426d50e255a317b9ab4586776f238ad2154ae.zip
* shm.cc (shmctl): On IPC_RMID don't unmap views and don't close handle
if the map is still referenced to emulate Linux and BSD behaviour.
Diffstat (limited to 'winsup/cygwin/shm.cc')
-rw-r--r--winsup/cygwin/shm.cc18
1 files changed, 8 insertions, 10 deletions
diff --git a/winsup/cygwin/shm.cc b/winsup/cygwin/shm.cc
index 27cc9843c..6fb120b6d 100644
--- a/winsup/cygwin/shm.cc
+++ b/winsup/cygwin/shm.cc
@@ -265,22 +265,20 @@ shmctl (int shmid, int cmd, struct shmid_ds *buf)
{
if (ssh_entry->shmid == shmid)
{
- shm_attached_list *sph_entry, *sph_next_entry;
- SLIST_FOREACH_SAFE (sph_entry, &sph_list, sph_next,
- sph_next_entry)
+ bool in_use = false;
+ shm_attached_list *sph_entry;
+ SLIST_FOREACH (sph_entry, &sph_list, sph_next)
{
if (sph_entry->hdl == ssh_entry->hdl)
{
- SLIST_REMOVE (&sph_list, sph_entry, shm_attached_list,
- sph_next);
- /* ...unmap all views for this handle... */
- UnmapViewOfFile (sph_entry->ptr);
- delete sph_entry;
+ in_use = true;
+ break;
}
}
SLIST_REMOVE (&ssh_list, ssh_entry, shm_shmid_list, ssh_next);
- /* ...and close the handle. */
- CloseHandle (ssh_entry->hdl);
+ /* ...and close the handle if it's not in use anymore. */
+ if (!in_use)
+ CloseHandle (ssh_entry->hdl);
delete ssh_entry;
break;
}