OSDN Git Service

2002-03-04 Robert Collins <rbtcollins@hotmail.com>
authorrbcollins <rbcollins>
Mon, 4 Mar 2002 08:12:52 +0000 (08:12 +0000)
committerrbcollins <rbcollins>
Mon, 4 Mar 2002 08:12:52 +0000 (08:12 +0000)
        * cygserver_shm.cc (client_request_shm::serve): Implement SHM_DETACH.
        * shm.cc (shmdt): Implement.

winsup/cygserver/shm.cc
winsup/cygwin/ChangeLog
winsup/cygwin/cygserver_shm.cc
winsup/cygwin/shm.cc

index de3e61e..50ca42e 100644 (file)
@@ -290,6 +290,26 @@ client_request_shm::serve (transport_layer_base * conn, process_cache * cache)
       return;
     }
 
+  /* Someone detached */
+  if (parameters.in.type == SHM_DETACH)
+    {
+      shmnode *tempnode = shm_head;
+      while (tempnode)
+       {
+         if (tempnode->shm_id == parameters.in.shm_id)
+           {
+             InterlockedDecrement (&tempnode->shmds->shm_nattch);
+             header.error_code = 0;
+             CloseHandle (token_handle);
+             return;
+           }
+         tempnode = tempnode->next;
+       }
+      header.error_code = EINVAL;
+      CloseHandle (token_handle);
+      return;
+    }
+
   /* Someone wants the ID removed. */
   if (parameters.in.type == SHM_DEL)
     {
index 4db3d7f..4b3436f 100644 (file)
@@ -1,5 +1,10 @@
 2002-03-04  Robert Collins  <rbtcollins@hotmail.com>
 
+       * cygserver_shm.cc (client_request_shm::serve): Implement SHM_DETACH.
+       * shm.cc (shmdt): Implement.
+
+2002-03-04  Robert Collins  <rbtcollins@hotmail.com>
+
        * cygserver_shm.cc: Run indent.
        (deleted_head): New global for storing shm id's pending deletion.
        (client_request_shm::serve): Return ENOSYS for invalid request types.
index de3e61e..50ca42e 100755 (executable)
@@ -290,6 +290,26 @@ client_request_shm::serve (transport_layer_base * conn, process_cache * cache)
       return;
     }
 
+  /* Someone detached */
+  if (parameters.in.type == SHM_DETACH)
+    {
+      shmnode *tempnode = shm_head;
+      while (tempnode)
+       {
+         if (tempnode->shm_id == parameters.in.shm_id)
+           {
+             InterlockedDecrement (&tempnode->shmds->shm_nattch);
+             header.error_code = 0;
+             CloseHandle (token_handle);
+             return;
+           }
+         tempnode = tempnode->next;
+       }
+      header.error_code = EINVAL;
+      CloseHandle (token_handle);
+      return;
+    }
+
   /* Someone wants the ID removed. */
   if (parameters.in.type == SHM_DEL)
     {
index 5305395..883c150 100644 (file)
@@ -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?