home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / kaffe-0.5p4-src.tgz / tar.out / contrib / kaffe / kaffevm / gc-incremental.h < prev    next >
C/C++ Source or Header  |  1996-09-28  |  2KB  |  99 lines

  1. /*
  2.  * gc-incremental.h
  3.  * The garbage collector.
  4.  *
  5.  * WORK IN PROGRESS - DO NOT USE !!
  6.  *
  7.  * Copyright (c) 1996 Systems Architecture Research Centre,
  8.  *           City University, London, UK.
  9.  *
  10.  * See the file "license.terms" for information on usage and redistribution
  11.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  12.  *
  13.  * Written by Tim Wilkinson <tim@sarc.city.ac.uk>, August 1996.
  14.  */
  15.  
  16. #ifndef __gc_h
  17. #define __gc_h
  18.  
  19. /* This is the incremental garbage collector */
  20. #define    GC_INCREMENTAL
  21.  
  22. /* The default poolsize */
  23. #define    DEFAULT_POOLSIZE    (2 * 1024 * 1024)
  24.  
  25. /* The maximum poolsize log2 */
  26. #define    MAX_POOLSIZE        31
  27.  
  28. /* Map entry */
  29. typedef struct _mapEntry {
  30.     uint8            flags;
  31. } mapEntry;
  32.  
  33. /* Data size covered by a single map entry - currently 64 bytes */
  34. #define    MAP_UNIT_SHIFT        6
  35. #define    MAP_UNIT_SIZE        (1 << MAP_UNIT_SHIFT)
  36.  
  37. /* Map flags & macros */
  38. #define    MAP_FREE        0x00
  39. #define    MAP_ALLOC        0x40
  40. #define    MAP_TOUCHED        0x80
  41. #define    MAP_USED        0xFF    /* Set by mutator */
  42.  
  43. #define    MAP_INT_TOUCHED        0x80808080
  44.  
  45. #define    MAP2ADDR(_e)                            \
  46.     (allocBase + (((_e) - mapBase) << MAP_UNIT_SHIFT))
  47. #define    ADDR2MAP(_a)                            \
  48.     (mapBase + (((void*)(_a) - allocBase) >> MAP_UNIT_SHIFT))
  49.  
  50. #define    VALID_HEAPADDR(_a)                        \
  51.     ((uintp)((_a) - allocBase) < allocSize)
  52. #define    VALID_OBJECT(_a)                        \
  53.     (ADDR2MAP(_a)->flags & MAP_ALLOC)
  54.  
  55.  
  56. /* Freelist pool */
  57. typedef struct _poolEntry {
  58.     struct _poolEntry*    next;
  59. } poolEntry;
  60.  
  61. typedef struct _freePool {
  62.     poolEntry*        first;
  63.     uint32            size;
  64. } freePool;
  65.  
  66. #define    NR_FREELISTS        (MAX_POOLSIZE - MAP_UNIT_SHIFT)
  67.  
  68. /* GC structure */
  69. typedef struct _gcHead {
  70.     int        colour;
  71.     int        size;
  72.     struct _gcHead*    nextGrey;
  73.     struct _gcHead*    nextRoot;
  74. } gcHead;
  75.  
  76. #define    INITGC(_o)    (_o).gc.colour = 0;                \
  77.             (_o).gc.nextGrey = 0;                \
  78.             (_o).gc.nextRoot = 0
  79.  
  80. /* Grey object lists */
  81.  
  82. #define    COLOUR_WHITE    0
  83. #define    COLOUR_GREY    1
  84. #define    COLOUR_BLACK    2
  85.  
  86. #define    GREYOBJECT(_a)                            \
  87.     ((gcHead*)(_a))->colour = COLOUR_GREY;                \
  88.     greyTail->nextGrey = (gcHead*)(_a);                \
  89.     greyTail = ((gcHead*)(_a))
  90.  
  91. #define    IS_WHITEOBJECT(_a)                        \
  92.     (((gcHead*)(_a))->colour == COLOUR_WHITE)
  93.  
  94. struct _classes;
  95. void*    newObject(int, struct _classes*, int, bool);
  96. void    invokeGarbageCollector(void);
  97.  
  98. #endif
  99.