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; }
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; }