Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/winsup
diff options
context:
space:
mode:
authorRobert Collins <rbtcollins@hotmail.com>2002-03-04 11:45:40 +0300
committerRobert Collins <rbtcollins@hotmail.com>2002-03-04 11:45:40 +0300
commit7c3617cc0a471bbd484538ea7d2b8a8f1e123e42 (patch)
tree14e9696a79c42bbadc4adfa47f7c46b6304feb4b /winsup
parent038c71f10c12a60698a801a95321e874e30e50d4 (diff)
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')
-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 50ca42e0e..97f05f9d9 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 4b3436f61..a76a1b97e 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 50ca42e0e..97f05f9d9 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);