Print this page
OS-5223 removed shm segment is no longer available
Reviewed by: Bryan Cantrill <bryan@joyent.com>
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
        
*** 18,27 ****
--- 18,28 ----
   *
   * CDDL HEADER END
   */
  /*
   * Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved.
+  * Copyright 2016 Joyent, Inc.
   */
  
  /*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T         */
  /*      All Rights Reserved                                     */
  
*** 1215,1225 ****
--- 1216,1243 ----
          IPC_ZONE_USAGE(perm, service) -= 1;
          ASSERT(service->ipcs_count || ((IPC_PROJ_USAGE(perm, service) == 0) &&
              (IPC_ZONE_USAGE(perm, service) == 0)));
  }
  
+ /*
+  * Perform actual IPC_RMID, either via ipc_rmid or due to a delayed *_RMID.
+  */
+ void
+ ipc_rmsvc(ipc_service_t *service, kipc_perm_t *perm)
+ {
+         ASSERT(service->ipcs_count > 0);
+         ASSERT(MUTEX_HELD(&service->ipcs_lock));
  
+         ipc_remove(service, perm);
+         mutex_exit(&service->ipcs_lock);
+ 
+         /* perform any per-service removal actions */
+         service->ipcs_rmid(perm);
+ 
+         ipc_rele(service, perm);
+ }
+ 
  /*
   * Common code to perform an IPC_RMID.  Returns an errno value on
   * failure, 0 on success.
   */
  int
*** 1245,1262 ****
          }
  
          /*
           * Nothing can fail from this point on.
           */
!         ipc_remove(service, perm);
!         mutex_exit(&service->ipcs_lock);
  
-         /* perform any per-service removal actions */
-         service->ipcs_rmid(perm);
- 
-         ipc_rele(service, perm);
- 
          return (0);
  }
  
  /*
   * Implementation for shmids, semids, and msgids.  buf is the address
--- 1263,1274 ----
          }
  
          /*
           * Nothing can fail from this point on.
           */
!         ipc_rmsvc(service, perm);
  
          return (0);
  }
  
  /*
   * Implementation for shmids, semids, and msgids.  buf is the address