aboutsummaryrefslogtreecommitdiff
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
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.
-rw-r--r--winsup/cygserver/shm.cc37
-rw-r--r--winsup/cygwin/ChangeLog5
-rwxr-xr-xwinsup/cygwin/cygserver_shm.cc37
3 files changed, 79 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);
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 4b3436f..a76a1b9 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,5 +1,10 @@
2002-03-04 Robert Collins <rbtcollins@hotmail.com>
+ * cygserver_shm.cc (delete_shmnode): New function.
+ (client_request_shm::serve): Use it.
+
+2002-03-04 Robert Collins <rbtcollins@hotmail.com>
+
* 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 50ca42e..97f05f9 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);