/* arena-id.h * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. * * Definitions for the arena IDs and for mapping from addresses to arena IDs. * * An arena ID (aid_t) is an unsigned 16-bit value, with the following layout: * * bits 0-7: heap block ID (0xFF for unmapped objects) * bits 8-11: object class: * 0000 = new-space objects * 1111 = unmapped objects * bits 12-15: generation number (0 for new space, 1-14 for older generations, * and 15 for non-heap memory) * * Heap pages in allocation space have the arena ID 0x0000, and unmapped heap * pages have the arena ID 0xffff. The ID format is designed so that a * from-space page can be detected by having a generation field less than or * equal to the maximum generation being collected. */ #ifndef _ARENA_ID_ #define _ARENA_ID_ #ifndef _ML_BASE_ #include "ml-base.h" #endif #ifndef _BIBOP_ #include "bibop.h" #endif /* The indices of the different object arenas. WIth four bits for the * object class, we have up to 7 regular objects and up to 7 big-object * arenas. */ /* The different classes of objects; each class lives in a different arena */ #define RECORD_INDX 0 #define PAIR_INDX 1 #define STRING_INDX 2 #define ARRAY_INDX 3 #define NUM_ARENAS 4 /* the different classes of big-objects, which live in big-object regions */ #define CODE_INDX 0 #define NUM_BIGOBJ_KINDS 1 #define NUM_OBJ_KINDS (NUM_ARENAS+NUM_BIGOBJ_KINDS) /* arena IDs */ typedef page_id_t aid_t; /* The number of bits in the arena ID fields. The number of bits should add * up to sizeof(aid_t)*8. */ #define HBLK_BITS 8 #define OBJC_BITS 4 #define GEN_BITS 4 #define HBLK_new 0 #define MAX_HBLK 0xff #define HBLK_MASK ((1<> OBJC_SHIFT)&OBJC_MASK) #define EXTRACT_GEN(AID) ((AID) >> GEN_SHIFT) #define IS_FROM_SPACE(AID,MAX_AID) \ ((AID) <= (MAX_AID)) /* the arena IDs for new-space and unmapped heap pages, and for free big-objects */ #define AID_NEW MAKE_AID(ALLOC_GEN,OBJC_new,HBLK_new) #define AID_UNMAPPED PAGEID_unmapped #define AID_MAX MAKE_MAX_AID(MAX_NUM_GENS) #ifdef TOSPACE_ID /* for debugging */ #define TOSPACE_AID(OBJC,BLK) MAKE_AID(0xf,(OBJC),BLK) #define TOSPACE_GEN(AID) EXTRACT_OBJC(AID) #define IS_TOSPACE_AID(AID) (((AID) != AID_UNMAPPED) && (EXTRACT_GEN(AID) == 0xf)) #endif /* AIds for big-object regions. These are always marked as from-space, since * both from-space and two-space objects of different generations can occupy * the same big-object region. */ #define AID_BIGOBJ(GEN) MAKE_AID(GEN,OBJC_bigobj,HBLK_bigobj) #define AID_BIGOBJ_HDR(GEN) MAKE_AID(GEN,OBJC_bigobj,HBLK_bigobjhdr) /* return true if the AID is a AID_BIGOBJ_HDR (we assume that it is * either an AID_BIGOBJ or an AID_BIGOBJ_HDR id). */ #define BO_IS_HDR(AID) (EXTRACT_HBLK(AID) == HBLK_bigobjhdr) /* return true, if AID is a big-object AID */ #define IS_BIGOBJ_AID(ID) (EXTRACT_OBJC(ID) == OBJC_bigobj) #endif /* !_ARENA_ID_ */