/************************************************************************* * * * YAP Prolog %W% %G% * * * * Yap Prolog was developed at NCCUP - Universidade do Porto * * * * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 * * * ************************************************************************** * * * File: alloc.h * * Last rev: * * mods: * * comments: allocating space * * * *************************************************************************/ /* Space Organization: The data areas is divided in the following way: Lower Addresses HeapBase \ | Atom and code space HeapTop-1 / HeapTop \ | Free Space AuxSp \ | Auxiliary stack AuxTop / GlobalBase-1/ GlobalBase \ | Global Stack H / ASP \ | Local stack LocalBase / TRBase / TR \ | Trail Higher Adresses */ /* definitions required by saver/restorer and memory manager */ typedef CELL YAP_SEG_SIZE; typedef struct FREEB { YAP_SEG_SIZE b_size; struct FREEB *b_next; struct FREEB *b_next_size; } BlockHeader; #define MinBlockSize (sizeof(BlockHeader)+sizeof(YAP_SEG_SIZE)) #define MaxBlockSize 0xffffff #define InUseFlag 0x1000000 /* the following defines are machine dependant and are used to enforce the correct alignment for allocated blocks */ #if SIZEOF_INT_P==4 #define YAP_ALIGN 3 #define YAP_ALIGNMASK 0xfffffffc #else #define YAP_ALIGN 7 #define YAP_ALIGNMASK 0xfffffff8L #endif /* ALIGN_LONGS */ #define AdjustSize(X) ((X+YAP_ALIGN) & YAP_ALIGNMASK) #define ALIGN_YAPTYPE(X,TYPE) (((CELL)(X)+(sizeof(TYPE)-1)) & ~(sizeof(TYPE)-1)) /* I'll assume page size is always a power of two */ #define AdjustPageSize(X) ((X) & (page_size-1) ? \ ((X) + page_size) & (~(page_size-1)) : \ (X) ) #define BlockTrailer(b) ((YAP_SEG_SIZE *)b)[((BlockHeader *) b)->b_size] #define FreeBlocks heap_regs->free_blocks /* Operating system and architecture dependent page size */ extern int page_size; void STD_PROTO(YAP_InitHeap, (void *)); #if USE_MMAP #include #include #elif USE_SHM #elif USE_SBRK #ifdef __svr4__ #include #elif sun #include #include void *sbrk(caddr_t); typedef unsigned size_t; MALLOC_T malloc(size_t); void free(MALLOC_T); MALLOC_T realloc(MALLOC_T,size_t); MALLOC_T calloc(size_t,size_t); #endif #else #endif #if defined(YAPOR) || defined(THREADS) #define HEAPTOP_OWNER(worker_id) ((worker_id) == HeapTopOwner) #define HEAPTOP_OWN(worker_id) (HeapTopOwner = (worker_id)) #define HEAPTOP_DISOWN(worker_id) (HeapTopOwner = -1) #else #define HEAPTOP_OWNER(worker_id) (FALSE) #define HEAPTOP_OWN(worker_id) #define HEAPTOP_DISOWN(worker_id) #endif