aboutsummaryrefslogtreecommitdiff
path: root/winsup/cygserver
diff options
context:
space:
mode:
authorRobert Collins <rbtcollins@hotmail.com>2002-03-04 08:45:40 +0000
committerRobert Collins <rbtcollins@hotmail.com>2002-03-04 08:45:40 +0000
commit7c3617cc0a471bbd484538ea7d2b8a8f1e123e42 (patch)
tree14e9696a79c42bbadc4adfa47f7c46b6304feb4b /winsup/cygserver
parent038c71f10c12a60698a801a95321e874e30e50d4 (diff)
downloadnewlib-7c3617cc0a471bbd484538ea7d2b8a8f1e123e42.zip
newlib-7c3617cc0a471bbd484538ea7d2b8a8f1e123e42.tar.gz
newlib-7c3617cc0a471bbd484538ea7d2b8a8f1e123e42.tar.bz2
2002-03-04 Robert Collins <rbtcollins@hotmail.com>
* cygserver_shm.cc (delete_shmnode): New function. (client_request_shm::serve): Use it.
Diffstat (limited to 'winsup/cygserver')
-rw-r--r--winsup/cygserver/shm.cc37
1 files changed, 37 insertions, 0 deletions
diff --git a/winsup/cygserver/shm.cc b/winsup/cygserver/shm.cc
index 50ca42e..97f05f9 100644
--- a/winsup/cygserver/shm.cc
+++ b/winsup/cygserver/shm.cc
@@ -170,6 +170,35 @@ static long
new_private_key =
0;
+static void
+delete_shmnode (shmnode **nodeptr)
+{
+ shmnode *node = *nodeptr;
+
+ // remove from the list
+ if (node == shm_head)
+ shm_head = shm_head->next;
+ else
+ {
+ shmnode *tempnode = shm_head;
+ while (tempnode && tempnode->next != node)
+ tempnode = tempnode->next;
+ if (tempnode)
+ tempnode->next = node->next;
+ // else log the unexpected !
+ }
+
+ // release the shared data view
+ UnmapViewOfFile (node->shmds->mapptr);
+ delete node->shmds;
+ CloseHandle (node->filemap);
+ CloseHandle (node->attachmap);
+
+ // free the memory
+ delete node;
+ nodeptr = NULL;
+}
+
void
client_request_shm::serve (transport_layer_base * conn, process_cache * cache)
{
@@ -326,6 +355,14 @@ client_request_shm::serve (transport_layer_base * conn, process_cache * cache)
deleted_head = temp2;
// FIXME: when/where do we delete the handles?
+ if (temp2->shmds->shm_nattch)
+ {
+ // FIXME: add to a pending queue?
+ }
+ else
+ {
+ delete_shmnode (&temp2);
+ }
header.error_code = 0;
CloseHandle (token_handle);