memsys.c
上传用户:lengbin
上传日期:2010-03-31
资源大小:121k
文件大小:3k
开发平台:

C/C++

  1. /*----------------------------------------------------------------------
  2.   File    : memsys.c
  3.   Contents: memory management system for equally sized (small) objects
  4.   Author  : Christian Borgelt
  5.   History : 10.12.2004 file created from fpgrowth.c
  6. ----------------------------------------------------------------------*/
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <assert.h>
  10. #include "memsys.h"
  11. #ifdef STORAGE
  12. #include "storage.h"
  13. #endif
  14. /*----------------------------------------------------------------------
  15.   Main Functions
  16. ----------------------------------------------------------------------*/
  17. MEMSYS* ms_create (int size, int cnt)
  18. {                               /* --- create a memory system */
  19.   MEMSYS *ms;                   /* created memory system */
  20.   assert((cnt > 0)              /* check the function arguments */
  21.       && (size > 0) && (size % sizeof(void*) == 0));
  22.   ms = malloc(sizeof(MEMSYS));  /* create a memory management system */
  23.   if (!ms) return NULL;         /* with no free objects and */
  24.   ms->cnt   = cnt;              /* initialize the variables */
  25.   ms->size  = size /sizeof(void*);
  26.   ms->blksz = sizeof(MSBLOCK) +ms->cnt *size;
  27.   ms->free  = ms->blocks = NULL;
  28.   return ms;                    /* return the created memory system */
  29. }  /* ms_create() */
  30. /*--------------------------------------------------------------------*/
  31. void ms_delete (MEMSYS *ms)
  32. {                               /* --- delete a memory system */
  33.   MSBLOCK *block;               /* to traverse the memory blocks */
  34.   assert(ms);                   /* check the function argument */
  35.   while (ms->blocks) {          /* while there is another block */
  36.     block = ms->blocks;         /* note the memory block and */
  37.     ms->blocks = block->succ;   /* remove it from the block list */
  38.     free(block);                /* delete the memory block */
  39.   }
  40.   free(ms);                     /* delete the base structure */
  41. }  /* ms_delete() */
  42. /*--------------------------------------------------------------------*/
  43. void* ms_alloc (MEMSYS *ms)
  44. {                               /* --- allocate an object */
  45.   int     i;                    /* loop variable */
  46.   void    **obj, **tmp;         /* allocated object, buffer */
  47.   MSBLOCK *block;               /* new block */
  48.   assert(ms);                   /* check the function argument */
  49.   obj = ms->free;               /* get the head of the free list */
  50.   if (!obj) {                   /* if there is no free node, */
  51.     block = (MSBLOCK*)malloc(ms->blksz);
  52.     if (!block) return NULL;    /* allocate a new memory block */
  53.     block->succ = ms->blocks;   /* and add it at the head */
  54.     ms->blocks  = block;        /* of the block list */
  55.     ms->free    = obj = (void*)(block +1);
  56.     for (i = ms->cnt; --i > 0; ) {
  57.       tmp = obj; *tmp = obj += ms->size; }
  58.     *obj = NULL;                /* traverse the object vector */
  59.     obj  = ms->free;            /* and link the objects together, */
  60.   }                             /* then get the next free object */
  61.   ms->free = *obj;              /* remove object from the free list */
  62.   return (void*)obj;            /* and return the retrieved object */
  63. }  /* ms_alloc() */
  64. /*--------------------------------------------------------------------*/
  65. void ms_free (MEMSYS *ms, void *obj)
  66. {                              /* --- deallocate an f.p. tree node */
  67.   assert(ms && obj);           /* check the function arguments */
  68.   *(void**)obj = ms->free;     /* insert the freed object */
  69.   ms->free     = obj;          /* at the head of the free list */
  70. }  /* ms_free() */