From 3804dea23c42ed6b9241fccb0823ef423177a2b6 Mon Sep 17 00:00:00 2001 From: rbcollins Date: Mon, 4 Mar 2002 08:45:39 +0000 Subject: [PATCH] 2002-03-04 Robert Collins * cygserver_shm.cc (delete_shmnode): New function. (client_request_shm::serve): Use it. --- winsup/cygserver/shm.cc | 37 +++++++++++++++++++++++++++++++++++++ winsup/cygwin/ChangeLog | 5 +++++ winsup/cygwin/cygserver_shm.cc | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+) diff --git a/winsup/cygserver/shm.cc b/winsup/cygserver/shm.cc index 50ca42e0ea..97f05f9d96 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); diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 4b3436f612..a76a1b97e3 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,5 +1,10 @@ 2002-03-04 Robert Collins + * cygserver_shm.cc (delete_shmnode): New function. + (client_request_shm::serve): Use it. + +2002-03-04 Robert Collins + * cygserver_shm.cc (client_request_shm::serve): Implement SHM_DETACH. * shm.cc (shmdt): Implement. diff --git a/winsup/cygwin/cygserver_shm.cc b/winsup/cygwin/cygserver_shm.cc index 50ca42e0ea..97f05f9d96 100755 --- a/winsup/cygwin/cygserver_shm.cc +++ b/winsup/cygwin/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); -- 2.11.0