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

Zoltan Varga vargaz at gmail.com
Fri Mar 5 13:48:28 EST 2010


Hi,

  Applied to to SVN HEAD/2.6/2.4 branches.

             Zoltan

On Fri, Mar 5, 2010 at 6:21 PM, cpMon <page.cal at gmail.com> wrote:

>
>
> 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 at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/pipermail/mono-devel-list/attachments/20100305/54c2c541/attachment.html 


More information about the Mono-devel-list mailing list