diff options
author | Robert Collins <rbtcollins@hotmail.com> | 2002-03-04 08:12:53 +0000 |
---|---|---|
committer | Robert Collins <rbtcollins@hotmail.com> | 2002-03-04 08:12:53 +0000 |
commit | 038c71f10c12a60698a801a95321e874e30e50d4 (patch) | |
tree | cc34df2ac6fad79f87d10c7e126a2401db4c57df /winsup/cygwin/shm.cc | |
parent | 67be0adb710ef4e53bd494ad1d19c15db6eb500d (diff) | |
download | cygnal-038c71f10c12a60698a801a95321e874e30e50d4.tar.gz cygnal-038c71f10c12a60698a801a95321e874e30e50d4.tar.bz2 cygnal-038c71f10c12a60698a801a95321e874e30e50d4.zip |
2002-03-04 Robert Collins <rbtcollins@hotmail.com>
* cygserver_shm.cc (client_request_shm::serve): Implement SHM_DETACH.
* shm.cc (shmdt): Implement.
Diffstat (limited to 'winsup/cygwin/shm.cc')
-rw-r--r-- | winsup/cygwin/shm.cc | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/winsup/cygwin/shm.cc b/winsup/cygwin/shm.cc index 530539569..883c15074 100644 --- a/winsup/cygwin/shm.cc +++ b/winsup/cygwin/shm.cc @@ -305,8 +305,37 @@ shmdt (const void *shmaddr) /* this should be "rare" so a hefty search is ok. If this is common, then we * should alter the data structs to allow more optimisation */ - set_errno (ENOTSUP); - return -1; + shmnode *tempnode = shm_head; + _shmattach *attachnode; + while (tempnode) + { + // FIXME: Race potential + attachnode = tempnode->attachhead; + while (attachnode && attachnode->data != shmaddr) + attachnode = attachnode->next; + if (attachnode) + break; + tempnode = tempnode->next; + } + if (!tempnode) + { + // dt cannot be called by an app that hasn't alreadu at'd + set_errno (EINVAL); + return -1; + } + + UnmapViewOfFile (attachnode->data); + /* tell the daemon we have attached */ + client_request_shm *req = + new client_request_shm (SHM_DETACH, tempnode->shm_id); + int rc; + if ((rc = cygserver_request (req))) + { + debug_printf ("failed to tell deaemon that we have detached\n"); + } + delete req; + + return 0; } //FIXME: who is allowed to perform STAT? |