Example #1
0
DirectResult
fusion_shm_attach_unattached( FusionWorld *world )
{
     int              i;
     DirectResult     ret;
     FusionSHM       *shm;
     FusionSHMShared *shared;

     D_MAGIC_ASSERT( world, FusionWorld );
     D_MAGIC_ASSERT( world->shared, FusionWorldShared );

     shm    = &world->shm;
     shared = &world->shared->shm;

     D_MAGIC_ASSERT( shm, FusionSHM );
     D_MAGIC_ASSERT( shared, FusionSHMShared );

     ret = fusion_skirmish_prevail( &shared->lock );
     if (ret)
          return ret;

     for (i=0; i<FUSION_SHM_MAX_POOLS; i++) {
          if (!shared->pools[i].active)
               continue;

          D_MAGIC_ASSERT( &shared->pools[i], FusionSHMPoolShared );

          if (!shm->pools[i].attached) {
               ret = fusion_shm_pool_attach( shm, &shared->pools[i] );
               if (ret)
                    D_DERROR( ret, "fusion_shm_pool_attach( '%s' ) failed!\n", shared->pools[i].name );
          }
          else
               D_MAGIC_ASSERT( &shm->pools[i], FusionSHMPool );
     }

     fusion_skirmish_dismiss( &shared->lock );

     return DR_OK;
}
Example #2
0
DirectResult
fusion_shm_init( FusionWorld *world )
{
    int              i;
    int              num;
    DirectResult     ret;
    FusionSHM       *shm;
    FusionSHMShared *shared;

    D_MAGIC_ASSERT( world, FusionWorld );
    D_MAGIC_ASSERT( world->shared, FusionWorldShared );

    shm    = &world->shm;
    shared = &world->shared->shm;

    /* Initialize local data. */
    memset( shm, 0, sizeof(FusionSHM) );

    shm->world  = world;
    shm->shared = shared;

    /* Initialize shared data. */
    if (fusion_master( world )) {
        memset( shared, 0, sizeof(FusionSHMShared) );

        if (fusion_config->tmpfs) {
            direct_snputs( shared->tmpfs, fusion_config->tmpfs, FUSION_SHM_TMPFS_PATH_NAME_LEN );
        }
        else if (!fusion_find_tmpfs( shared->tmpfs, FUSION_SHM_TMPFS_PATH_NAME_LEN )) {
            D_ERROR( "Fusion/SHM: Could not find tmpfs mount point, falling back to /dev/shm!\n" );
            direct_snputs( shared->tmpfs, "/dev/shm", FUSION_SHM_TMPFS_PATH_NAME_LEN );
        }

        shared->world = world->shared;

        /* Initialize shared lock. */
        ret = fusion_skirmish_init2( &shared->lock, "Fusion SHM", world, fusion_config->secure_fusion );
        if (ret) {
            D_DERROR( ret, "Fusion/SHM: Failed to create skirmish!\n" );
            return ret;
        }

        /* Initialize static pool array. */
        for (i=0; i<FUSION_SHM_MAX_POOLS; i++)
            shared->pools[i].index = i;

        D_MAGIC_SET( shm, FusionSHM );
        D_MAGIC_SET( shared, FusionSHMShared );
    }
    else {
        D_MAGIC_ASSERT( shared, FusionSHMShared );

        D_MAGIC_SET( shm, FusionSHM );

        for (i=0, num=0; i<FUSION_SHM_MAX_POOLS; i++) {
            if (shared->pools[i].active) {
                D_MAGIC_ASSERT( &shared->pools[i], FusionSHMPoolShared );

                ret = fusion_shm_pool_attach( shm, &shared->pools[i] );
                if (ret) {
                    for (--i; i>=0; i--) {
                        if (shared->pools[i].active)
                            fusion_shm_pool_detach( shm, &shared->pools[i] );
                    }

                    D_MAGIC_CLEAR( shm );

                    return ret;
                }

                num++;
            }
        }

        D_ASSERT( num == shared->num_pools );
    }

    return DR_OK;
}