static DFBResult dfb_core_initialize( CoreDFB *core ) { int i; DFBResult ret; CoreDFBShared *shared; D_MAGIC_ASSERT( core, CoreDFB ); shared = core->shared; D_MAGIC_ASSERT( shared, CoreDFBShared ); ret = fusion_shm_pool_create( core->world, "DirectFB Data Pool", 0x1000000, fusion_config->debugshm, &shared->shmpool_data ); if (ret) return ret; shared->layer_context_pool = dfb_layer_context_pool_create( core->world ); shared->layer_region_pool = dfb_layer_region_pool_create( core->world ); shared->palette_pool = dfb_palette_pool_create( core->world ); shared->surface_pool = dfb_surface_pool_create( core->world ); shared->window_pool = dfb_window_pool_create( core->world ); for (i=0; i<D_ARRAY_SIZE(core_parts); i++) { DFBResult ret; if ((ret = dfb_core_part_initialize( core, core_parts[i] ))) { dfb_core_shutdown( core, true ); return ret; } } return DFB_OK; }
static int dfb_core_arena_shutdown( FusionArena *arena, void *ctx, bool emergency) { DFBResult ret; CoreDFB *core = ctx; CoreDFBShared *shared; FusionSHMPoolShared *pool; D_MAGIC_ASSERT( core, CoreDFB ); shared = core->shared; D_MAGIC_ASSERT( shared, CoreDFBShared ); pool = shared->shmpool; D_DEBUG_AT( DirectFB_Core, "Shutting down...\n" ); if (!core->master) { D_WARN( "refusing shutdown in slave" ); return dfb_core_leave( core, emergency ); } CoreDFB_Deinit_Dispatch( &shared->call ); /* Shutdown. */ ret = dfb_core_shutdown( core, emergency ); fusion_skirmish_destroy( &shared->lock ); D_MAGIC_CLEAR( shared ); SHFREE( pool, shared ); fusion_shm_pool_destroy( core->world, pool ); return ret; }