MEMMGT.C
上传用户:hlzzc88
上传日期:2007-01-06
资源大小:220k
文件大小:5k
源码类别:

编译器/解释器

开发平台:

Others

  1. /*
  2.  * 68K/386 32-bit C compiler.
  3.  *
  4.  * copyright (c) 1997, David Lindauer
  5.  * 
  6.  * This compiler is intended for educational use.  It may not be used
  7.  * for profit without the express written consent of the author.
  8.  *
  9.  * It may be freely redistributed, as long as this notice remains intact
  10.  * and either the original sources or derived sources 
  11.  * are distributed along with any executables derived from the originals.
  12.  *
  13.  * The author is not responsible for any damages that may arise from use
  14.  * of this software, either idirect or consequential.
  15.  *
  16.  * v1.35 March 1997
  17.  * David Lindauer, gclind01@starbase.spd.louisville.edu
  18.  *
  19.  * Credits to Mathew Brandt for original K&R C compiler
  20.  *
  21.  */
  22. /*
  23.  *memmgt.c
  24.  *
  25.  * memory management
  26.  */
  27. #include        <stdio.h>
  28. #include <malloc.h>
  29. void release_local(void);
  30. void release_global(void);
  31. void release_opt(void);
  32. void release_oc(void);
  33. void mem_summary(void);
  34. typedef struct _blk_ {
  35.         struct _blk_      *next;
  36. long blksize;
  37.         char            m[1];           /* memory area */
  38.         } BLK;
  39. int global_flag;
  40. static int      glbsize = 0,    /* size left in current global block */
  41.                 locsize = 0,    /* size left in current local block */
  42.                 glbindx = 0,    /* global index */
  43.                 locindx = 0;    /* local index */
  44. static BLK       *locblk = 0,    /* pointer to local block */
  45.                         *glbblk = 0;    /* pointer to global block */
  46. static int optsize,optindx,ocsize,ocindx;
  47. static BLK *optblk,*ocblk;
  48. static long maxopt,maxglb,maxloc,maxoc;
  49. void memini(void)
  50. {
  51.   global_flag = 1;
  52. glbsize = 0;
  53. locsize = 0;
  54. glbindx = 0;
  55. locindx = 0;
  56. locblk = 0;
  57. glbblk = 0;
  58. optsize = 0;
  59. optblk = 0;
  60. optindx = 0;
  61.   maxopt = maxglb = maxloc = 0;
  62. }
  63. static char *palloc(int *sizepos,int size,int *indxpos,BLK **blk)
  64. /*
  65.  * main allocation routine
  66.  */
  67. {
  68.   BLK      *bp;
  69.   char            *rv;
  70. if( size & 1 ) /* if odd size */
  71. size += 1; /* make it even */
  72. /* if anything left, try to allocate from it */
  73.   if( *sizepos >= size ) {
  74.     rv = &((*blk)->m[*indxpos]);
  75.     *sizepos -= size;
  76.     *indxpos += size;
  77.     return rv;
  78.   }
  79.   else    {
  80. long allocsize;
  81. /* else check for size > normal blcok size */
  82. if (size > 2048) {
  83. /* this is going to fragment memory!!! I'd fix it except
  84.  * the fragmentation is partially dependent on the calloc 
  85.  * implementation 
  86.  */
  87. allocsize = size - 1;
  88. *sizepos = 0;
  89. }
  90. else {
  91. /* as long as we stick to normal blocks, fragmentation
  92.  * won't be an issue because as long as all blocks are the
  93.  * same size calloc is guaranteed to find one if there are any
  94.  */
  95. allocsize = 2047;
  96. *sizepos = 2048 - size;
  97. }
  98. /* allocate mem */
  99.     bp = calloc(1,sizeof(BLK) + allocsize);
  100. if( bp == NULL ) {
  101. release_global();
  102. release_local();
  103. release_opt();
  104. release_oc();
  105. mem_summary();
  106. fatal(" not enough memory.");
  107. }
  108. bp->blksize = allocsize;
  109. /* link the block and return the base */
  110.     bp->next = *blk;
  111.     *blk = bp;
  112.     *indxpos = size;
  113.     return (*blk)->m;
  114. }
  115. }
  116. char    *xalloc(int siz)
  117. /*
  118.  * user-level allocation.  Global symbols are never deallocated; local
  119.  * symbols are deallocated all at once by deallocating the local symbol
  120.  * blocks
  121.  */
  122. {
  123.         if( global_flag ) 
  124. return palloc(&glbsize,siz,&glbindx,&glbblk);
  125. else
  126. return palloc(&locsize,siz,&locindx,&locblk);
  127. }
  128. char    *oalloc(int siz)
  129. /*
  130.  * allocation for optimizer temps
  131.  */
  132. {
  133. /* return xalloc(siz); */
  134. return palloc(&optsize,siz,&optindx,&optblk);
  135. }
  136. char *ocalloc(int siz)
  137. /*
  138.  * Allocation for binary code gen
  139.  */
  140. {
  141. return palloc(&ocsize,siz,&ocindx,&ocblk);
  142. }
  143. static long release(int *sizepos, BLK ** blk)
  144. /*
  145.  * msin memory free routine
  146.  * frees all blocks from a list at once
  147.  *
  148.  * This memory management scheme reduces fragmentation, however
  149.  * temps hang around for a while...
  150.  *
  151.  */
  152. {       BLK      *bp1, *bp2;
  153. long blkcnt = 0;
  154.         bp1 = *blk;
  155.         while( bp1 != 0 ) {
  156. blkcnt+=bp1->blksize;
  157.                 bp2 = bp1->next;
  158.                 free( bp1 );
  159.                 bp1 = bp2;
  160.                 }
  161.         *blk = 0;
  162.         *sizepos = 0;
  163. return blkcnt;
  164. }
  165. void release_local(void )
  166. /*
  167.  * release all local allocations
  168.  */
  169. {
  170. long temp = release(&locsize,&locblk);       
  171. if (temp > maxloc)
  172. maxloc = temp;
  173. }
  174. void release_global(void)
  175. /*
  176.  * release all global allocations
  177.  */
  178. long temp = release(&glbsize,&glbblk);       
  179. if (temp > maxglb)
  180. maxglb = temp;
  181. }
  182. void release_opt(void)
  183. /*
  184.  * release optimizer temps
  185.  */
  186. {
  187. long temp = release(&optsize,&optblk);       
  188. if (temp > maxopt)
  189. maxopt = temp;
  190. }
  191. void release_oc(void)
  192. /*
  193.  * release all binary codegen allocations
  194.  */
  195. long temp = release(&ocsize,&ocblk);       
  196. if (temp > maxoc)
  197. maxoc = temp;
  198. }
  199. void mem_summary(void)
  200. {
  201. printf("Memory usage:n");
  202. if (maxglb)
  203. printf("  Globals:        %ldn",maxglb);
  204. if (maxloc)
  205. printf("  Local peak:     %ldn",maxloc);
  206. if (maxopt)
  207. printf("  Optimizer peak: %ldn",maxopt);
  208. if (maxoc)
  209. printf("  Binary code peak: %ldn",maxopt);
  210. }