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

📄 shm_internal.h

📁 DirectFB-1.0.1可用于linux的嵌入式GUI
💻 H
字号:
/*   (c) Copyright 2001-2007  The DirectFB Organization (directfb.org)   (c) Copyright 2000-2004  Convergence (integrated media) GmbH   All rights reserved.   Written by Denis Oliver Kropp <dok@directfb.org>,              Andreas Hundt <andi@fischlustig.de>,              Sven Neumann <neo@directfb.org>,              Ville Syrjälä <syrjala@sci.fi> and              Claudio Ciccani <klan@users.sf.net>.   This library is free software; you can redistribute it and/or   modify it under the terms of the GNU Lesser General Public   License as published by the Free Software Foundation; either   version 2 of the License, or (at your option) any later version.   This library is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU   Lesser General Public License for more details.   You should have received a copy of the GNU Lesser General Public   License along with this library; if not, write to the   Free Software Foundation, Inc., 59 Temple Place - Suite 330,   Boston, MA 02111-1307, USA.*/#ifndef __FUSION__SHM__SHM_INTERNAL_H__#define __FUSION__SHM__SHM_INTERNAL_H__#include <limits.h>#include <direct/list.h>#include <fusion/build.h>#include <fusion/lock.h>#define FUSION_SHM_MAX_POOLS                  4#define FUSION_SHM_TMPFS_PATH_NAME_LEN       64typedef struct __shmalloc_heap shmalloc_heap;/* * Local pool data. */struct __Fusion_FusionSHMPool {     int                  magic;     bool                 attached;     /* Indicates usage of this entry in the static pool array. */     FusionSHM           *shm;          /* Back pointer to local SHM data. */     FusionSHMPoolShared *shared;       /* Pointer to shared pool data. */     int                  pool_id;      /* The pool's ID within the world. */     int                  fd;           /* File descriptor of shared memory file. */     char                *filename;     /* Name of the shared memory file. */};/* * Shared pool data. */struct __Fusion_FusionSHMPoolShared {     int                  magic;     bool                 debug;        /* Debug allocations in this pool? */     int                  index;        /* Index within the static pool array. */     bool                 active;       /* Indicates usage of this entry in the static pool array. */     FusionSHMShared     *shm;          /* Back pointer to shared SHM data. */     int                  max_size;     /* Maximum possible size of the shared memory. */     int                  pool_id;      /* The pool's ID within the world. */     void                *addr_base;    /* Virtual starting address of shared memory. */     FusionSkirmish       lock;         /* Lock for this pool. */     shmalloc_heap       *heap;         /* The actual heap information ported from libc5. */     char                *name;         /* Name of the pool (allocated in the pool). */     DirectLink          *allocs;       /* Used for debugging. */};/* * Local SHM data. */struct __Fusion_FusionSHM {     int                  magic;     FusionWorld         *world;        /* Back pointer to local world data. */     FusionSHMShared     *shared;       /* Pointer to shared SHM data. */     FusionSHMPool        pools[FUSION_SHM_MAX_POOLS]; /* Local data of all pools. */     DirectSignalHandler *signal_handler;};/* * Shared SHM data. */struct __Fusion_FusionSHMShared {     int                  magic;     FusionWorldShared   *world;        /* Back pointer to shared world data. */     FusionSkirmish       lock;         /* Lock for list of pools. */     int                  num_pools;    /* Number of active pools. */     FusionSHMPoolShared  pools[FUSION_SHM_MAX_POOLS]; /* Shared data of all pools. */     char                 tmpfs[FUSION_SHM_TMPFS_PATH_NAME_LEN];};/* The allocator divides the heap into blocks of fixed size; large   requests receive one or more whole blocks, and small requests   receive a fragment of a block.  Fragment sizes are powers of two,   and all fragments of a block are the same size.  When all the   fragments in a block have been freed, the block itself is freed.  */#define INT_BIT          (CHAR_BIT * sizeof(int))#define BLOCKLOG         (INT_BIT > 16 ? 12 : 9)#define BLOCKSIZE        (1 << BLOCKLOG)#define BLOCKIFY(SIZE)   (((SIZE) + BLOCKSIZE - 1) / BLOCKSIZE)#define BLOCKALIGN(SIZE) (((SIZE) + BLOCKSIZE - 1) & ~(BLOCKSIZE - 1))/* Number of contiguous free blocks allowed to build up at the end of   memory before they will be returned to the system.  */#define FINAL_FREE_BLOCKS       8/* Address to block number and vice versa.  */#define BLOCK(A)        (((char *) (A) - heap->heapbase) / BLOCKSIZE + 1)#define ADDRESS(B)      ((void *) (((B) - 1) * BLOCKSIZE + heap->heapbase))/* Data structure giving per-block information.  */typedef union {     /* Heap information for a busy block.  */     struct {          /* Zero for a large block, or positive giving the             logarithm to the base two of the fragment size.  */          int type;          union {               struct {                    size_t nfree;   /* Free fragments in a fragmented block.  */                    size_t first;   /* First free fragment of the block.  */               } frag;               /* Size (in blocks) of a large cluster.  */               size_t size;          } info;     } busy;     /* Heap information for a free block        (that may be the first of a free cluster).  */     struct {          size_t size;                /* Size (in blocks) of a free cluster.  */          size_t next;                /* Index of next free cluster.  */          size_t prev;                /* Index of previous free cluster.  */     } free;} shmalloc_info;/* Doubly linked lists of free fragments.  */struct list {     struct list *next;     struct list *prev;};#define SHMEMDESC_FUNC_NAME_LENGTH 48#define SHMEMDESC_FILE_NAME_LENGTH 24/* Used for debugging. */typedef struct {     DirectLink    link;     const void   *mem;     size_t        bytes;     char          func[SHMEMDESC_FUNC_NAME_LENGTH];     char          file[SHMEMDESC_FILE_NAME_LENGTH];     unsigned int  line;     FusionID      fid;} SHMemDesc;struct __shmalloc_heap {     int magic;     /* Pointer to first block of the heap.  */     char *heapbase;     /* Block information table indexed by block number giving per-block information. */     shmalloc_info *heapinfo;     /* Number of info entries.  */     size_t heapsize;     /* Current search index for the heap table.  */     size_t heapindex;     /* Limit of valid info table indices.  */     size_t heaplimit;#if 1   /* Adapted from Mike */     /* Count of large blocks allocated for each fragment size. */     int fragblocks[BLOCKLOG];#endif     /* Free list headers for each fragment size.  */     struct list fraghead[BLOCKLOG];     /* Instrumentation.  */     size_t chunks_used;     size_t bytes_used;     size_t chunks_free;     size_t bytes_free;     /* Total size of heap in bytes. */     int size;     /* Back pointer to shared memory pool. */     FusionSHMPoolShared *pool;};void *_fusion_shmalloc (shmalloc_heap *heap, size_t __size);void *_fusion_shrealloc (shmalloc_heap *heap, void *__ptr, size_t __size);void  _fusion_shfree (shmalloc_heap *heap, void *__ptr);DirectResult __shmalloc_init_heap( FusionSHM     *shm,                                   const char    *filename,                                   void          *addr_base,                                   int            space,                                   int           *ret_fd,                                   int           *ret_size );DirectResult __shmalloc_join_heap( FusionSHM     *shm,                                   const char    *filename,                                   void          *addr_base,                                   int            size,                                   int           *ret_fd );void        *__shmalloc_brk      ( shmalloc_heap *heap,                                   int            increment );#endif

⌨️ 快捷键说明

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