reclaim.c
上传用户:nthfjj
上传日期:2007-01-07
资源大小:37k
文件大小:5k
源码类别:

系统编程

开发平台:

Unix_Linux

  1. #include <stdio.h>
  2. #include "runtime.h"
  3. #define DEBUG
  4. #undef DEBUG
  5. #ifdef PRINTSTATS
  6. #  define GATHERSTATS
  7. #endif
  8. long mem_found = 0;     /* Number of longwords of memory reclaimed     */
  9. long composite_in_use;  /* Number of longwords in accessible composite */
  10. /* objects.                                    */
  11. long atomic_in_use;     /* Number of longwords in accessible atomic */
  12. /* objects.                                 */
  13. /*
  14.  * reclaim phase
  15.  *
  16.  */
  17. reclaim()
  18. {
  19. register struct hblk *hbp; /* ptr to current heap block */
  20. register int word_no; /* Number of word in block */
  21. register long i;
  22. register word *p; /* pointer to current word in block */
  23. register int mb; /* mark bit of current word */
  24. int sz; /* size of objects in current block */
  25. word *plim;
  26. struct hblk **nexthbp; /* ptr to ptr to current heap block */
  27. int nonempty; /* nonempty ^ done with block => block empty*/
  28. struct obj *list; /* used to build list of free words in block*/
  29. register int is_atomic;         /* => current block contains atomic objs */
  30. #   ifdef DEBUG
  31.         printf("clearing all between %x and %x, %x and %xn",
  32.                objfreelist, &objfreelist[MAXOBJSZ+1],
  33.                aobjfreelist,&aobjfreelist[MAXAOBJSZ+1]);
  34. #   endif
  35.     { register struct obj **fop;
  36. for( fop = objfreelist; fop < &objfreelist[MAXOBJSZ+1]; fop++ ) {
  37.     *fop = (struct obj *)0;
  38. }
  39. for( fop = aobjfreelist; fop < &aobjfreelist[MAXAOBJSZ+1]; fop++ ) {
  40.     *fop = (struct obj *)0;
  41. }
  42.     }
  43.     
  44.     atomic_in_use = 0;
  45.     composite_in_use = 0;
  46. #   ifdef PRINTBLOCKS
  47.         printf("reclaim: current block sizes:n");
  48. #   endif
  49.   /* go through all heap blocks (in hblklist) and reclaim unmarked objects */
  50. # ifdef HBLK_MAP
  51.     hbp = (struct hblk *) heapstart;
  52.     for (; ((char *)hbp) < heaplim; hbp++) if (is_hblk(hbp)) {
  53. /* fprintf(stderr, "Reclaiming in 0x%Xn", hbp); */
  54. # else
  55.     nexthbp = hblklist;
  56.     while( nexthbp < last_hblk ) {
  57. hbp = *nexthbp++;
  58. # endif
  59. nonempty = FALSE;
  60. sz = hbp -> hb_sz;
  61. is_atomic = 0;
  62. if (sz < 0) {
  63.     sz = -sz;
  64.     is_atomic = 1; /* this block contains atomic objs */
  65. }
  66. # ifdef PRINTBLOCKS
  67.             printf("%d(%c",sz, (is_atomic)? 'a' : 'c');
  68. # endif
  69. if( sz > (is_atomic? MAXAOBJSZ : MAXOBJSZ) ) {  /* 1 big object */
  70.     mb = mark_bit(hbp, (hbp -> hb_body) - ((word *)(hbp)));
  71.     if( mb ) {
  72. #               ifdef GATHERSTATS
  73.     if (is_atomic) {
  74. atomic_in_use += sz;
  75.     } else {
  76. composite_in_use += sz;
  77.     }
  78. #               endif
  79. nonempty = TRUE;
  80.     } else {
  81. mem_found += sz;
  82.     }
  83. } else { /* group of smaller objects */
  84.     p = (word *)(hbp->hb_body);
  85.     word_no = ((word *)p) - ((word *)hbp);
  86.     plim = (word *)((((unsigned)hbp) + HBLKSIZE)
  87.        - WORDS_TO_BYTES(sz));
  88.     list = (is_atomic) ? aobjfreelist[sz] : objfreelist[sz];
  89.   /* go through all words in block */
  90.     while( p <= plim )  {
  91. mb = mark_bit(hbp, word_no);
  92. if( mb ) {
  93. #                   ifdef GATHERSTATS
  94. if (is_atomic) atomic_in_use += sz;
  95. else           composite_in_use += sz;
  96. #                   endif
  97. #                   ifdef DEBUG
  98.                         printf("found a reachable objn");
  99. #     endif
  100.     nonempty = TRUE;
  101.     p += sz;
  102. } else {
  103.   mem_found += sz;
  104.   /* word is available - put on list */
  105.     ((struct obj *)p)->obj_link = list;
  106.     list = ((struct obj *)p);
  107.   if (is_atomic) {
  108.     p += sz;
  109.   } else {
  110.     /* Clear object, advance p to next object in the process */
  111. i = (long)(p + sz);
  112.                         p++; /* Skip link field */
  113.                         while (p < (word *)i) {
  114.     *p++ = 0;
  115. }
  116.   }
  117. }
  118. word_no += sz;
  119.     }
  120.   /*
  121.    * if block has reachable words in it, we can't reclaim the
  122.    * whole thing so put list of free words in block back on
  123.    * free list for this size.
  124.    */
  125.     if( nonempty ) {
  126. if ( is_atomic ) aobjfreelist[sz] = list;
  127. else objfreelist[sz] = list;
  128.     }
  129. # ifdef PRINTBLOCKS
  130.             printf("%c),", nonempty ? 'n' : 'e' );
  131. # endif
  132. if (!nonempty) {
  133.             if (!is_atomic && sz <= MAXOBJSZ) {
  134.                 /* Clear words at beginning of objects */
  135.                 /* Since most of it is already cleared */
  136.   p = (word *)(hbp->hb_body);
  137.   plim = (word *)((((unsigned)hbp) + HBLKSIZE)
  138.  - WORDS_TO_BYTES(sz));
  139.   while (p <= plim) {
  140.     *p = 0;
  141.     p += sz;
  142.   }
  143. hbp -> hb_uninit = 0;
  144.     } else {
  145. /* Mark it as being uninitialized */
  146. hbp -> hb_uninit = 1;
  147.     }
  148.   /* remove this block from list of active blocks */
  149.     del_hblklist(hbp);
  150. #           ifndef HBLKMAP
  151.       /* This entry in hblklist just got replaced; look at it again  */
  152.       /* This admittedly depends on the internals of del_hblklist... */
  153.       nexthbp--;
  154. #           endif
  155.     freehblk(hbp);
  156. }  /* end if (one big object...) */
  157.     } /* end while (nexthbp ...) */
  158. #   ifdef PRINTBLOCKS
  159.         printf("n");
  160. #   endif
  161. }