[Mono-dev] [PATCH] mono/io-layer/shared.c sends non-existant file to ftok for Linux

cpMon page.cal at gmail.com
Fri Mar 5 12:21:52 EST 2010



The shared memory files are created in /dev/shm/... on linux, but the code
tries to find  them in your home account. Since the file doesn't exist, a 0
is returned from ftok. This results in a pileup of shm's and semaphores. Run
ipcs -a after every run to see the probmem.

Cal Page

Here's the patch:
Index: mono/io-layer/shared.c
===================================================================
RCS file: /usr/local/teradyne/cvsroot/mono-2.6.1/mono/io-layer/shared.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -u -8 -p -r1.1 -r1.2
--- mono/io-layer/shared.c	25 Feb 2010 12:36:10 -0000	1.1
+++ mono/io-layer/shared.c	26 Feb 2010 14:26:41 -0000	1.2
@@ -476,16 +476,19 @@ _wapi_shm_attach (_wapi_shm_t type)
 
 static void
 shm_semaphores_init (void)
 {
 	key_t key;
 	key_t oldkey;
 	int thr_ret;
 	struct _WapiHandleSharedLayout *tmp_shared;
+
+	gchar *ftmp;
+        gchar *filename;
 	
 	/*
 	 * Yet more barmy API - this union is a well-defined parameter
 	 * in a syscall, yet I still have to define it here as it
 	 * doesn't appear in a header
 	 */
 	union semun {
 		int val;
@@ -514,18 +517,26 @@ shm_semaphores_init (void)
 	 * after getting the semaphores to avoid a race condition
 	 * where a terminating process can delete the shared files
 	 * between a new process attaching the file and getting access
 	 * to the semaphores (which increments the process count,
 	 * preventing destruction of the shared data...)
 	 */
 	tmp_shared = _wapi_shm_attach (WAPI_SHM_DATA);
 	g_assert (tmp_shared != NULL);
-	
-	key = ftok (_wapi_shm_file (WAPI_SHM_DATA), 'M');
+
+#ifdef USE_SHM
+	filename =
g_build_filename("/dev/shm",(ftmp=_wapi_shm_shm_name(WAPI_SHM_DATA)),NULL);
+	g_assert(filename!=NULL);
+	key = ftok ( filename, 'M');
+	g_free(ftmp);
+	g_free(filename);
+#else
+	key = ftok ( _wapi_shm_file (WAPI_SHM_DATA), 'M');
+#endif
 
 again:
 	retries++;
 	oldkey = tmp_shared->sem_key;
 
 	if (oldkey == 0) {
 		DEBUGLOG ("%s: Creating with new key (0x%x)", __func__, key);

-- 
View this message in context: http://n4.nabble.com/PATCH-mono-io-layer-shared-c-sends-non-existant-file-to-ftok-for-Linux-tp1579884p1579884.html
Sent from the Mono - Dev mailing list archive at Nabble.com.


More information about the Mono-devel-list mailing list