DirectFB采用了主从模型(Master/Slave)。Fusion即融合,多个应用程序在不同的进程空间,通过这个内核模块通信,在这里,一切都溶为一体了。Master应用程序负责初始化一个称为竞技场的东西,其它Slave应用程序可以加入或者退出竞技场。当Master退出时,则其它所有Slave都必须退出。 我们先实现fusion master,文件名为fusionee_master.c. 该程序将创建一个功能较简单的进程。这个进程将负责初始化竞技场(即arena),分配共享内存,并通过该竞技场发布一个指针。这些步骤是非常直接了当的: (1 )初始化fusion world; ( 2 ) 初始化共享内存池。 ( 3 )初始化一个新的竞技场。 (4)在共享内存池里为我们的数据分配空间; ( 5 )填充数据到上述分配的内存空间; (6)在这个全新的竞技场里发布一个指针; 关闭竞技场时,我们按照如下步骤来进行: (1)获取指向共享内存的一个指针; (2)释放内存; (3)退出竞技场; (4)释放共享内存池; (5)退出fusion world. Fusionee_master.c
| #include<stdio.h> #include <unistd.h> #include <stdbool.h> #include <linux/fusion.h> #include <fusion/fusion.h> #include <fusion/shmalloc.h> #include <fusion/call.h> #include <fusion/arena.h> // ABI version for sanity check #define DFB_ABI 70 enum { NEW_WORLD = -1, EXISTING_WORLD } FusionWorldType; // Shared memory pool size #define SHM_POOL_SIZE 0x1000000 FusionWorld *world; FusionSHMPoolShared *pool; /* * Callback function called from fusion_arena_enter() * Add here all variables that live in shared memory */ int initialize(FusionArena*arena,void*ctx){ char *str=NULL; printf("\t\t\tAllocate SHM for field in Arena (%s)\n",__FUNCTION__); str = (char*)SHMALLOC(pool, 1024);// (4)在共享内存池里为我们的数据分配空间; sprintf(str,"String in Arena!!!");//(5)填充数据到上述分配的内存空间; fusion_arena_add_shared_field(arena,"string1",(void*)str);//(6)在这个全新的竞技场里发布一个指针; printf("\t\t\tThe string is shared? "); fusion_is_shared(world, str)?printf("Yes"):printf("No"); printf(" (%s)\n",__FUNCTION__); return 0; } /* * Callback function called from fusion_arena_exit() */ int shutdown(FusionArena*arena,void*ctx,bool emergency){ char *str=NULL; fusion_arena_get_shared_field(arena,"string1",(void*)&str); printf("\n\t\t\tFree shared memory (%s)\n\n",__FUNCTION__); SHFREE(pool, str); return 0; } int main (){ int ret; char c; void *ctx; FusionArena *arena; printf("Creating Fusion world (%s)\n",__FUNCTION__); fusion_enter(NEW_WORLD, DFB_ABI, FER_MASTER,&world);//--(1)创建一个fusion world. printf("Fusion world created with index %d (%s)\n", fusion_world_index(world),__FUNCTION__); printf("Is this the master? "); fusion_master(world)?printf("Yes"):printf("No"); printf(" (%s)\n",__FUNCTION__); printf("\tCreating SHM pool (%s)\n",__FUNCTION__); fusion_shm_pool_create(world,"WM SHM pool", SHM_POOL_SIZE, 0,&pool);// ( 2 ) 初始化共享内存池。 printf("\t\tCreating Arena (%s)\n",__FUNCTION__); fusion_arena_enter(world,"WM Arena", initialize,NULL,&ctx,&arena,&ret);// ( 3 )初始化一个新的竞技场。 printf("\n\t\tPress enter to exit (%s)\n",__FUNCTION__); read(1,&c, 1); printf("\t\tShutting down Arena (%s)\n",__FUNCTION__); fusion_arena_exit(arena,shutdown,NULL,&ctx, 0,&ret); printf("\tDestroying SHM pool (%s)\n",__FUNCTION__); fusion_shm_pool_destroy(world, pool); printf("Exiting Fusion world (%s)\n",__FUNCTION__); fusion_exit(world, 0); return 0; } |