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

系统编程

开发平台:

Unix_Linux

  1. #define DEBUG       /* Some run-time consistency checks */
  2. #undef DEBUG
  3. #define VERBOSE
  4. #undef VERBOSE
  5. #include <stdio.h>
  6. #include <signal.h>
  7. #include "runtime.h"
  8. int dont_gc = 0;
  9. extern long mem_found;
  10. # ifdef MERGE_SIZES
  11. #   if MAXOBJSZ == MAXAOBJSZ
  12. #       define MAXSZ MAXOBJSZ
  13. #   else
  14. --> causes problems here, since we cant map any size to a
  15.     size that doesn't have a free list.  Either initialization
  16.     needs to be cleverer, or we need separate maps for atomic
  17.     and composite objects.
  18. #   endif
  19.     long size_map[MAXSZ+1];
  20.     /* Set things up so that size_map[i] >= i, but not too much bigger */
  21.     /* and so that size_map contains relatively few distinct entries   */
  22.     void init_size_map()
  23.     {
  24. register int i;
  25. register int i_rounded_up = 0;
  26. for (i = 1; i < 8; i++) {
  27.     size_map[i] = i;
  28. }
  29. for (i = 8; i <= MAXSZ; i++) {
  30.     if (i_rounded_up < i) {
  31. i_rounded_up = i + (i >> 1);
  32. if (i_rounded_up > MAXSZ) {
  33.     i_rounded_up = MAXSZ;
  34. }
  35.     }
  36.     size_map[i] = i_rounded_up;
  37. }
  38.     }
  39. # endif
  40. /* allocate lb bytes of atomic data */
  41. struct obj * gc_malloc_atomic(lb)
  42. int lb;
  43. {
  44. register struct obj *op;
  45. register struct obj **opp;
  46. register int lw = BYTES_TO_WORDS(lb + (sizeof (word)) -1);
  47. #   ifdef VERBOSE
  48. printf("Here we are in gc_malloc_atomic(%d)n",lw);
  49. #   endif
  50.     if( lw <= MAXAOBJSZ ) {
  51. #       ifdef MERGE_SIZES
  52.   lw = size_map[lw];
  53. #       endif
  54. opp = &(aobjfreelist[lw]);
  55.         if( (op = *opp) == ((struct obj *)0) ) {
  56.             op = allocaobj(lw);
  57.         }
  58. #       ifdef DEBUG
  59.     if ((op -> obj_link != ((struct obj *) 0)
  60. && (((unsigned)(op -> obj_link)) > ((unsigned) HEAPLIM)
  61.    || ((unsigned)(op -> obj_link)) < ((unsigned) HEAPSTART)))) {
  62. fprintf(stderr, "Bad free list in gc_malloc_atomicn");
  63. abort(op);
  64.             }
  65. #       endif
  66.         *opp = op->obj_link;
  67.         op->obj_link = (struct obj *)0;
  68.     } else {
  69. register struct hblk * h;
  70. if (!sufficient_hb(-lw) && !dont_gc) {
  71.             gcollect();
  72. }
  73. #       ifdef VERBOSE
  74.     printf("gc_malloc_atomic calling allochblk(%x)n",lw);
  75. # endif
  76. h = allochblk(-lw);
  77. add_hblklist(h);
  78. op = (struct obj *) (h -> hb_body);
  79.     }
  80.     return(op);
  81. }
  82. /* allocate lw bytes of possibly composite data */
  83. struct obj * gc_malloc(lb)
  84. int lb;
  85. {
  86. register struct obj *op;
  87. register struct obj **opp;
  88. register int lw = BYTES_TO_WORDS(lb + (sizeof (word)) -1);
  89.     if( lw <= MAXOBJSZ ) {
  90. #       ifdef MERGE_SIZES
  91.   lw = size_map[lw];
  92. #       endif
  93. opp = &(objfreelist[lw]);
  94.         if( (op = *opp) == ((struct obj *)0) ) {
  95.     op = allocobj(lw);
  96.         }
  97. #       ifdef DEBUG
  98.     if ((op -> obj_link != ((struct obj *) 0)
  99. && (((unsigned)(op -> obj_link)) > ((unsigned) HEAPLIM)
  100.    || ((unsigned)(op -> obj_link)) < ((unsigned) HEAPSTART)))) {
  101. fprintf(stderr, "Bad free list in gc_mallocn");
  102. abort(op);
  103.             }
  104. #       endif
  105.         *opp = op->obj_link;
  106.         op->obj_link = (struct obj *)0;
  107.     } else {
  108. register struct hblk * h;
  109. if (!sufficient_hb(lw) && !dont_gc) {
  110.             gcollect();
  111. }
  112. #       ifdef VERBOSE
  113.     printf("ralloc_comp calling allochblk(%x)n",lw);
  114. # endif
  115. h = allochblk(lw);
  116. add_hblklist(h);
  117. op = (struct obj *) (h -> hb_body);
  118.     }
  119.     return(op);
  120. }
  121. /* Explicitly deallocate an object p */
  122. gc_free(p)
  123. struct obj *p;
  124. {
  125.     register struct hblk *h;
  126.     register int sz;
  127.     register word * i;
  128.     register word * limit;
  129.     h = HBLKPTR(p);
  130.     sz = h -> hb_sz;
  131.     if (sz < 0) {
  132.         sz = -sz;
  133.         if (sz > MAXAOBJSZ) {
  134.     h -> hb_uninit = 1;
  135.     del_hblklist(h);
  136.     freehblk(h);
  137. } else {
  138.     p -> obj_link = aobjfreelist[sz];
  139.     aobjfreelist[sz] = p;
  140. }
  141.     } else {
  142. /* Clear the object, other than link field */
  143.     limit = &(p -> obj_component[sz]);
  144.     for (i = &(p -> obj_component[1]); i < limit; i++) {
  145. *i = 0;
  146.     }
  147. if (sz > MAXOBJSZ) {
  148.     p -> obj_link = 0;
  149.     h -> hb_uninit = 0;
  150.     del_hblklist(h);
  151.     freehblk(h);
  152. } else {
  153.     p -> obj_link = objfreelist[sz];
  154.     objfreelist[sz] = p;
  155. }
  156.     }
  157.     /* Add it to mem_found to prevent anomalous heap expansion */
  158.     /* in the event of repeated explicit frees of objects of   */
  159.     /* varying sizes.                                          */
  160.         mem_found += sz;
  161. }
  162. /*
  163.  * Disable non-urgent signals
  164.  */
  165. int holdsigs()
  166. {
  167.     unsigned mask = 0xffffffff;
  168.     mask &= ~(1<<(SIGSEGV-1));
  169.     mask &= ~(1<<(SIGILL-1));
  170.     mask &= ~(1<<(SIGBUS-1));
  171.     mask &= ~(1<<(SIGIOT-1));
  172.     mask &= ~(1<<(SIGEMT-1));
  173.     mask &= ~(1<<(SIGTRAP-1));
  174.     mask &= ~(1<<(SIGQUIT-1));
  175.     return(sigsetmask(mask));
  176. }
  177. void gc_init()
  178. {
  179.     heaplim = (char *) (sbrk(0));
  180. #   ifdef HBLK_MAP
  181. heapstart = (char *) (HBLKPTR(((unsigned)sbrk(0))+HBLKSIZE-1 ));
  182. #   endif
  183.     hincr = HINCR;
  184.     expand_hp(hincr);
  185.     init_hblklist();
  186. #   ifdef MERGE_SIZES
  187.       init_size_map();
  188. #   endif
  189. }
  190. # ifdef MIPS
  191.     /* There doesn't appear a reasonable way to do this under SysV.3 */
  192.     sigsetmask() { return(0); }
  193. # endif