⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pool.c

📁 DirectFB1.1.1 技术研究类型软件
💻 C
📖 第 1 页 / 共 2 页
字号:
          return DFB_FUSION;     }     /* Generate filename. */     snprintf( buf, sizeof(buf), "%s/fusion.%d.%d", shm->shared->tmpfs,               fusion_world_index( shm->world ), pool_new.pool_id );     /* Initialize the heap. */     ret = __shmalloc_init_heap( shm, buf, pool_new.addr_base, max_size, &fd, &size );     if (ret) {          while (ioctl( world->fusion_fd, FUSION_SHMPOOL_DESTROY, &shared->pool_id )) {               if (errno != EINTR) {                    D_PERROR( "Fusion/SHM: FUSION_SHMPOOL_DESTROY failed!\n" );                    break;               }          }          return ret;     }     /* Initialize local data. */     pool->attached = true;     pool->shm      = shm;     pool->shared   = shared;     pool->pool_id  = pool_new.pool_id;     pool->fd       = fd;     pool->filename = D_STRDUP( buf );     /* Initialize shared data. */     shared->active     = true;     shared->debug      = debug;     shared->shm        = shm->shared;     shared->max_size   = pool_new.max_size;     shared->pool_id    = pool_new.pool_id;     shared->addr_base  = pool_new.addr_base;     shared->heap       = pool_new.addr_base;     shared->heap->pool = shared;     fusion_skirmish_init( &shared->lock, name, world );     D_MAGIC_SET( pool, FusionSHMPool );     D_MAGIC_SET( shared, FusionSHMPoolShared );     shared->name = SHSTRDUP( shared, name );     return DFB_OK;}static DirectResultjoin_pool( FusionSHM           *shm,           FusionSHMPool       *pool,           FusionSHMPoolShared *shared ){     DirectResult         ret;     int                  fd;     FusionWorld         *world;     FusionSHMPoolAttach  pool_attach = {0};     char                 buf[FUSION_SHM_TMPFS_PATH_NAME_LEN + 32];     D_DEBUG_AT( Fusion_SHMPool, "%s( %p, %p, %p )\n", __FUNCTION__, shm, pool, shared );     D_MAGIC_ASSERT( shm, FusionSHM );     D_MAGIC_ASSERT( shm->shared, FusionSHMShared );     D_MAGIC_ASSERT( shared, FusionSHMPoolShared );#if !DIRECT_BUILD_DEBUGS     if (shared->debug) {          D_ERROR( "Fusion/SHM: Can't join debug enabled pool with pure-release library!\n" );          return DFB_UNSUPPORTED;     }#endif     world = shm->world;     D_MAGIC_ASSERT( world, FusionWorld );     /* Set pool to attach to. */     pool_attach.pool_id = shared->pool_id;     /* Attach to the pool. */     while (ioctl( world->fusion_fd, FUSION_SHMPOOL_ATTACH, &pool_attach )) {          if (errno == EINTR)               continue;          D_PERROR( "Fusion/SHM: FUSION_SHMPOOL_ATTACH failed!\n" );          return DFB_FUSION;     }     /* Generate filename. */     snprintf( buf, sizeof(buf), "%s/fusion.%d.%d", shm->shared->tmpfs,               fusion_world_index( shm->world ), shared->pool_id );     /* Join the heap. */     ret = __shmalloc_join_heap( shm, buf, pool_attach.addr_base, shared->max_size, &fd );     if (ret) {          while (ioctl( world->fusion_fd, FUSION_SHMPOOL_DETACH, &shared->pool_id )) {               if (errno != EINTR) {                    D_PERROR( "Fusion/SHM: FUSION_SHMPOOL_DETACH failed!\n" );                    break;               }          }          return ret;     }     /* Initialize local data. */     pool->attached = true;     pool->shm      = shm;     pool->shared   = shared;     pool->pool_id  = shared->pool_id;     pool->fd       = fd;     pool->filename = D_STRDUP( buf );     D_MAGIC_SET( pool, FusionSHMPool );     return DFB_OK;}static voidleave_pool( FusionSHM           *shm,            FusionSHMPool       *pool,            FusionSHMPoolShared *shared ){     FusionWorld *world;     D_DEBUG_AT( Fusion_SHMPool, "%s( %p, %p, %p )\n", __FUNCTION__, shm, pool, shared );     D_MAGIC_ASSERT( shm, FusionSHM );     D_MAGIC_ASSERT( pool, FusionSHMPool );     D_MAGIC_ASSERT( shared, FusionSHMPoolShared );     world = shm->world;     D_MAGIC_ASSERT( world, FusionWorld );     while (ioctl( world->fusion_fd, FUSION_SHMPOOL_DETACH, &shared->pool_id )) {          if (errno != EINTR) {               D_PERROR( "Fusion/SHM: FUSION_SHMPOOL_DETACH failed!\n" );               break;          }     }     if (munmap( shared->addr_base, shared->max_size ))          D_PERROR( "Fusion/SHM: Could not munmap shared memory file '%s'!\n", pool->filename );     if (pool->fd != -1 && close( pool->fd ))          D_PERROR( "Fusion/SHM: Could not close shared memory file '%s'!\n", pool->filename );     pool->attached = false;     D_FREE( pool->filename );     D_MAGIC_CLEAR( pool );}static voidshutdown_pool( FusionSHM           *shm,               FusionSHMPool       *pool,               FusionSHMPoolShared *shared ){     FusionWorld *world;     D_DEBUG_AT( Fusion_SHMPool, "%s( %p, %p, %p )\n", __FUNCTION__, shm, pool, shared );     D_MAGIC_ASSERT( shm, FusionSHM );     D_MAGIC_ASSERT( pool, FusionSHMPool );     D_MAGIC_ASSERT( shared, FusionSHMPoolShared );     world = shm->world;     D_MAGIC_ASSERT( world, FusionWorld );     SHFREE( shared, shared->name );     fusion_dbg_print_memleaks( shared );     while (ioctl( world->fusion_fd, FUSION_SHMPOOL_DESTROY, &shared->pool_id )) {          if (errno != EINTR) {               D_PERROR( "Fusion/SHM: FUSION_SHMPOOL_DESTROY failed!\n" );               break;          }     }     if (munmap( shared->addr_base, shared->max_size ))          D_PERROR( "Fusion/SHM: Could not munmap shared memory file '%s'!\n", pool->filename );     if (pool->fd != -1 && close( pool->fd ))          D_PERROR( "Fusion/SHM: Could not close shared memory file '%s'!\n", pool->filename );     if (unlink( pool->filename ))          D_PERROR( "Fusion/SHM: Could not unlink shared memory file '%s'!\n", pool->filename );     shared->active = false;     pool->attached = false;     D_FREE( pool->filename );     D_MAGIC_CLEAR( pool );     fusion_skirmish_destroy( &shared->lock );     D_MAGIC_CLEAR( shared );}#else /* FUSION_BUILD_KERNEL */static DirectResultinit_pool( FusionSHM           *shm,           FusionSHMPool       *pool,           FusionSHMPoolShared *shared,           const char          *name,           unsigned int         max_size,           bool                 debug ){     DirectResult   ret;     int            fd;     int            size;     long           page_size;     int            pool_id;     unsigned int   pool_max_size;     void          *pool_addr_base = NULL;     FusionWorld   *world;     char           buf[FUSION_SHM_TMPFS_PATH_NAME_LEN + 32];     D_DEBUG_AT( Fusion_SHMPool, "%s( %p, %p, %p, '%s', %d, %sdebug )\n",                 __FUNCTION__, shm, pool, shared, name, max_size, debug ? "" : "non-" );     D_MAGIC_ASSERT( shm, FusionSHM );     D_MAGIC_ASSERT( shm->shared, FusionSHMShared );     D_ASSERT( name != NULL );     D_ASSERT( max_size > sizeof(shmalloc_heap) );     world = shm->world;     D_MAGIC_ASSERT( world, FusionWorld );     D_ASSERT( pool != NULL );     D_ASSERT( shared != NULL );     page_size = direct_pagesize();     pool_id = ++world->shared->pool_ids;     pool_max_size = max_size + BLOCKALIGN(sizeof(shmalloc_heap)) +                                BLOCKALIGN( (max_size + BLOCKSIZE-1) / BLOCKSIZE * sizeof(shmalloc_info) );     pool_addr_base = world->shared->pool_base;     world->shared->pool_base += ((pool_max_size + page_size - 1) & ~(page_size - 1)) + page_size;     /* Exceeded limit? */     if (world->shared->pool_base > world->shared->pool_max)          return DFB_NOSHAREDMEMORY;     /* Generate filename. */     snprintf( buf, sizeof(buf), "%s/fusion.%d.%d", shm->shared->tmpfs,               fusion_world_index( world ), pool_id );     /* Initialize the heap. */     ret = __shmalloc_init_heap( shm, buf, pool_addr_base, max_size, &fd, &size );     if (ret)          return ret;     /* Initialize local data. */     pool->attached = true;     pool->shm      = shm;     pool->shared   = shared;     pool->pool_id  = pool_id;     pool->fd       = fd;     pool->filename = D_STRDUP( buf );     /* Initialize shared data. */     shared->active     = true;     shared->debug      = debug;     shared->shm        = shm->shared;     shared->max_size   = pool_max_size;     shared->pool_id    = pool_id;     shared->addr_base  = pool_addr_base;     shared->heap       = pool_addr_base;     shared->heap->pool = shared;     fusion_skirmish_init( &shared->lock, name, world );     D_MAGIC_SET( pool, FusionSHMPool );     D_MAGIC_SET( shared, FusionSHMPoolShared );     shared->name = SHSTRDUP( shared, name );     return DFB_OK;}static DirectResultjoin_pool( FusionSHM           *shm,           FusionSHMPool       *pool,           FusionSHMPoolShared *shared ){     DirectResult  ret;     int           fd;     FusionWorld  *world;     char          buf[FUSION_SHM_TMPFS_PATH_NAME_LEN + 32];     D_DEBUG_AT( Fusion_SHMPool, "%s( %p, %p, %p )\n", __FUNCTION__, shm, pool, shared );     D_MAGIC_ASSERT( shm, FusionSHM );     D_MAGIC_ASSERT( shm->shared, FusionSHMShared );     D_MAGIC_ASSERT( shared, FusionSHMPoolShared );#if !DIRECT_BUILD_DEBUGS     if (shared->debug) {          D_ERROR( "Fusion/SHM: Can't join debug enabled pool with pure-release library!\n" );          return DFB_UNSUPPORTED;     }#endif     world = shm->world;     D_MAGIC_ASSERT( world, FusionWorld );     /* Generate filename. */     snprintf( buf, sizeof(buf), "%s/fusion.%d.%d", shm->shared->tmpfs,               fusion_world_index( shm->world ), shared->pool_id );     /* Join the heap. */     ret = __shmalloc_join_heap( shm, buf, shared->addr_base, shared->max_size, &fd );     if (ret)          return ret;     /* Initialize local data. */     pool->attached = true;     pool->shm      = shm;     pool->shared   = shared;     pool->pool_id  = shared->pool_id;     pool->fd       = fd;     pool->filename = D_STRDUP( buf );     D_MAGIC_SET( pool, FusionSHMPool );     return DFB_OK;}static voidleave_pool( FusionSHM           *shm,            FusionSHMPool       *pool,            FusionSHMPoolShared *shared ){     FusionWorld *world;     D_DEBUG_AT( Fusion_SHMPool, "%s( %p, %p, %p )\n", __FUNCTION__, shm, pool, shared );     D_MAGIC_ASSERT( shm, FusionSHM );     D_MAGIC_ASSERT( pool, FusionSHMPool );     D_MAGIC_ASSERT( shared, FusionSHMPoolShared );     world = shm->world;     D_MAGIC_ASSERT( world, FusionWorld );     if (munmap( shared->addr_base, shared->max_size ))          D_PERROR( "Fusion/SHM: Could not munmap shared memory file '%s'!\n", pool->filename );     if (pool->fd != -1 && close( pool->fd ))          D_PERROR( "Fusion/SHM: Could not close shared memory file '%s'!\n", pool->filename );     pool->attached = false;     D_FREE( pool->filename );     D_MAGIC_CLEAR( pool );}static voidshutdown_pool( FusionSHM           *shm,               FusionSHMPool       *pool,               FusionSHMPoolShared *shared ){     FusionWorld *world;     D_DEBUG_AT( Fusion_SHMPool, "%s( %p, %p, %p )\n", __FUNCTION__, shm, pool, shared );     D_MAGIC_ASSERT( shm, FusionSHM );     D_MAGIC_ASSERT( pool, FusionSHMPool );     D_MAGIC_ASSERT( shared, FusionSHMPoolShared );     world = shm->world;     D_MAGIC_ASSERT( world, FusionWorld );     SHFREE( shared, shared->name );     fusion_dbg_print_memleaks( shared );     if (munmap( shared->addr_base, shared->max_size ))          D_PERROR( "Fusion/SHM: Could not munmap shared memory file '%s'!\n", pool->filename );     if (pool->fd != -1 && close( pool->fd ))          D_PERROR( "Fusion/SHM: Could not close shared memory file '%s'!\n", pool->filename );     if (unlink( pool->filename ))          D_PERROR( "Fusion/SHM: Could not unlink shared memory file '%s'!\n", pool->filename );     shared->active = false;     pool->attached = false;     D_FREE( pool->filename );     D_MAGIC_CLEAR( pool );     fusion_skirmish_destroy( &shared->lock );     D_MAGIC_CLEAR( shared );}#endif /* FUSION_BUILD_KERNEL *//**********************************************************************************************************************/#if FUSION_BUILD_KERNELvoid_fusion_shmpool_process( FusionWorld          *world,                         int                   pool_id,                         FusionSHMPoolMessage *msg ){     int              i;     DirectResult     ret;     FusionSHM       *shm;     FusionSHMShared *shared;     D_DEBUG_AT( Fusion_SHMPool, "%s( %p, %d, %p )\n", __FUNCTION__, world, pool_id, msg );     D_MAGIC_ASSERT( world, FusionWorld );     shm = &world->shm;     D_MAGIC_ASSERT( shm, FusionSHM );     shared = shm->shared;     D_MAGIC_ASSERT( shared, FusionSHMShared );     ret = fusion_skirmish_prevail( &shared->lock );     if (ret)          return;     for (i=0; i<FUSION_SHM_MAX_POOLS; i++) {          if (shm->pools[i].attached) {               D_MAGIC_ASSERT( &shm->pools[i], FusionSHMPool );               if (shm->pools[i].pool_id == pool_id) {                    switch (msg->type) {                         case FSMT_REMAP:                              break;                         case FSMT_UNMAP:                              D_UNIMPLEMENTED();                              break;                    }                    break;               }          }     }     fusion_skirmish_dismiss( &shared->lock );}#endif /* FUSION_BUILD_KERNEL */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -