summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/shm.cc
diff options
context:
space:
mode:
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;
}