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.
_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list

Reply via email to