From patchwork Mon Feb 2 22:37:45 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Don Breazeal X-Patchwork-Id: 4890 Received: (qmail 30380 invoked by alias); 2 Feb 2015 22:37:52 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 30371 invoked by uid 89); 2 Feb 2015 22:37:51 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.1 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 02 Feb 2015 22:37:49 +0000 Received: from svr-orw-fem-02x.mgc.mentorg.com ([147.34.96.206] helo=SVR-ORW-FEM-02.mgc.mentorg.com) by relay1.mentorg.com with esmtp id 1YIPco-00056q-Ll from Don_Breazeal@mentor.com for gdb-patches@sourceware.org; Mon, 02 Feb 2015 14:37:46 -0800 Received: from build4-lucid-cs (147.34.91.1) by svr-orw-fem-02.mgc.mentorg.com (147.34.96.168) with Microsoft SMTP Server id 14.3.224.2; Mon, 2 Feb 2015 14:37:46 -0800 Received: by build4-lucid-cs (Postfix, from userid 1905) id 08E1440DD4; Mon, 2 Feb 2015 14:37:45 -0800 (PST) From: Don Breazeal To: Subject: [PATCH v2] gdb.base/info-os.c: Clean up SysV IPC on error. Date: Mon, 2 Feb 2015 14:37:45 -0800 Message-ID: <1422916665-29806-1-git-send-email-donb@codesourcery.com> In-Reply-To: References: MIME-Version: 1.0 X-IsSubscribed: yes On 1/31/2015 3:55 AM, Maciej W. Rozycki wrote: > Use `atexit' to run `ipc_cleanup' automagically instead maybe? This way > you won't have to run the function manually at each exit point and also it > won't be missed on any future updates. Maciej, That makes sense to me. Here is the updated patch. Thanks! --Don We have noticed here that over time some of our test systems accumulate stale System V IPC resources. At least some of this is due to a GDB test program, gdb.base/info-os.c. The program doesn't clean up any allocated IPC objects when an error occurs. System V IPC objects will stay around forever unless they are explicitly removed (or until a reboot). This patch puts the IPC cleanup code into a function and calls atexit so that the function will be called for any exit, not just successful completion. I looked at changing the SysV IPC key for allocating the IPC objects to IPC_PRIVATE. That would prevent a namespace conflict 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. One can clean up stale resources allocated by this test on Linux systems by running 'ipcs' and looking for shared memory objects with keys in the range 0xf55-0x133d, semaphore objects with keys in the range 0x1d04-20ec, and message queue objects in the range 0x14ae-0x1896. Use the 'ipcrm' command to delete the IPC objects. Note that other programs (like vncserver) use System V IPC, so make sure that the object is stale before deleting it. Tested on x86_64 Ubuntu. OK? thanks --Don gdb/testsuite/ 2015-02-02 Don Breazeal * 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/gdb.base/info-os.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/gdb/testsuite/gdb.base/info-os.c b/gdb/testsuite/gdb.base/info-os.c index ae2606a..8ceaaff 100644 --- a/gdb/testsuite/gdb.base/info-os.c +++ b/gdb/testsuite/gdb.base/info-os.c @@ -26,6 +26,22 @@ 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);