Clean up System V IPC objects allocated by test.
authorDon Breazeal <donb@codesourcery.com>
Wed, 4 Feb 2015 21:15:06 +0000 (13:15 -0800)
committerDon Breazeal <donb@codesourcery.com>
Wed, 4 Feb 2015 21:24:35 +0000 (13:24 -0800)
This commit modifies the test program gdb.base/info-os.c so that
it cleans up all allocated System V IPC objects when a fatal
error occurs.  Without this, it was possible for the program
to leave IPC objects on the system, and such objects persist
until they are manually deleted or the system reboots.

I looked at changing the SysV IPC key for allocating the IPC objects to
IPC_PRIVATE.  That would prevent errors due to namespace conflicts with the
key.  However, the test needs to read the actual key number from the 'info
os' command output, and IPC_PRIVATE won't work for that.

gdb/testsuite/ChangeLog:
2015-02-04  Don Breazeal  <donb@codesourcery.com>

        * gdb.base/info-os.c (shmid, semid, msqid): Make variables static
        and initialize them.
        (ipc_cleanup): New function.
        (main): Don't declare shmid, semid, and msqid.  Add a call to
        atexit so that we call ipc_cleanup on exit.

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/info-os.c

index fcc16cb15b8fa183e54a0ea3def793ed02d9d34e..6fdaa89ab82480430873e0e52504fcb3d178de5b 100644 (file)
@@ -1,3 +1,11 @@
+2015-02-04  Don Breazeal  <donb@codesourcery.com>
+
+       * gdb.base/info-os.c (shmid, semid, msqid): Make variables static
+       and initialize them.
+       (ipc_cleanup): New function.
+       (main): Don't declare shmid, semid, and msqid.  Add a call to
+       atexit so that we call ipc_cleanup on exit.
+
 2015-02-04  Pedro Alves  <palves@redhat.com>
 
        * boards/native-extended-gdbserver.exp: Remove any target variant
index ae2606a359d03943d5ba5b930351a50fec194b19..8ceaaff42686c90bd55dc36dd15a31f81b0d816d 100644 (file)
 
 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
 
+/* System V IPC identifiers.  */
+static int shmid = -1, semid = -1, msqid = -1;
+
+/* Delete any System V IPC resources that were allocated.  */
+
+static void
+ipc_cleanup (void)
+{
+  if (shmid >= 0)
+    shmctl (shmid, IPC_RMID, NULL);
+  if (semid >= 0)
+    semctl (semid, 0, IPC_RMID, NULL);
+  if (msqid >= 0)
+    msgctl (msqid, IPC_RMID, NULL);
+}
+
 void *
 thread_proc (void *args)
 {
@@ -38,7 +54,6 @@ main (void)
 {
   const int flags = IPC_CREAT | 0666;
   key_t shmkey = 3925, semkey = 7428, msgkey = 5294;
-  int shmid, semid, msqid;
   FILE *fd;
   pthread_t thread;
   struct sockaddr_in sock_addr;
@@ -47,6 +62,8 @@ main (void)
   socklen_t size;
   int status, try, retries = 1000;
 
+  atexit (ipc_cleanup);
+
   for (try = 0; try < retries; ++try)
     {
       shmid = shmget (shmkey, 4096, flags | IPC_EXCL);
@@ -135,9 +152,6 @@ main (void)
 
   /* Set breakpoint here.  */
 
-  shmctl (shmid, IPC_RMID, NULL);
-  semctl (semid, 0, IPC_RMID, NULL);
-  msgctl (msqid, IPC_RMID, NULL);
   fclose (fd);
   close (sock);