From: Andre Noll <maan@systemlinux.org>
Date: Tue, 3 Feb 2009 20:41:08 +0000 (+0100)
Subject: Call shm(destroy) on the mmd shared memory area right after creating it.
X-Git-Tag: v0.3.4~71
X-Git-Url: https://git.tuebingen.mpg.de/?a=commitdiff_plain;h=df51fc92275195f2cbcf95fff2cb2b0fb21433f4;p=paraslash.git

Call shm(destroy) on the mmd shared memory area right after creating it.

It will only be destroyed when the last reference is gone, which
is when para_server exits. This allows to get rid of a global
variable. Moreover, the shared memory area will be destroyed even
in case para_server crashes.
---

diff --git a/server.c b/server.c
index 5823cb28..9187b63f 100644
--- a/server.c
+++ b/server.c
@@ -115,7 +115,6 @@ int mmd_mutex;
 
 /** The file containing user information (public key, permissions). */
 static char *user_list_file = NULL;
-static int mmd_shm_id;
 
 
 /** The task responsible for server command handling. */
@@ -162,16 +161,16 @@ static void init_colors_or_die(void)
 static void init_ipc_or_die(void)
 {
 	void *shm;
-	int ret = shm_new(sizeof(struct misc_meta_data));
+	int shmid, ret = shm_new(sizeof(struct misc_meta_data));
 
 	if (ret < 0)
 		goto err_out;
-
-	ret = shm_attach(ret, ATTACH_RW, &shm);
+	shmid = ret;
+	ret = shm_attach(shmid, ATTACH_RW, &shm);
+	shm_destroy(shmid);
 	if (ret < 0)
 		goto err_out;
 	mmd = shm;
-	mmd_shm_id = ret;
 
 	ret = mutex_new();
 	if (ret < 0)
@@ -303,8 +302,6 @@ genocide:
 		kill(0, SIGTERM);
 		mutex_destroy(mmd_mutex);
 		shm_detach(mmd);
-		shm_destroy(mmd_shm_id);
-
 		exit(EXIT_FAILURE);
 	}
 }