diff options
Diffstat (limited to 'winsup/cygwin/shm.cc')
-rw-r--r-- | winsup/cygwin/shm.cc | 18 |
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; } |