/************************************************************************* * * * 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 HeapMax / 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 0x80000000 /* 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)) /* SIZE should be a power of 2 */ #define ALIGN_SIZE(X,SIZE) (((CELL)(X)+((SIZE)-1)) & ~((SIZE)-1)) /* I'll assume page size is always a power of two */ #if _WIN32 /* in WIN32 VirtualAlloc works in multiples of 64K */ #define ALLOC_SIZE (64*1024) #define AdjustPageSize(X) (((X)+ (ALLOC_SIZE-1))/ALLOC_SIZE)*ALLOC_SIZE; #else #define AdjustPageSize(X) ((X) & (Yap_page_size-1) ? \ ((X) + Yap_page_size) & (~(Yap_page_size-1)) : \ (X) ) #endif #define BlockTrailer(b) ((YAP_SEG_SIZE *)b)[((BlockHeader *) b)->b_size] /* Operating system and architecture dependent page size */ extern int Yap_page_size; void STD_PROTO(Yap_InitHeap, (void *)); UInt STD_PROTO(Yap_ExtendWorkSpaceThroughHole, (UInt)); void STD_PROTO(Yap_AllocHole, (UInt, UInt)); #if USE_MMAP #include #include #elif USE_SHM #elif USE_SBRK #if (defined(__svr4__) || defined(__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 USE_DL_MALLOC void Yap_add_memory_hole(ADDR, ADDR); #else #define Yap_add_memory_hole(Start, End) #endif #define SCRATCH_START_SIZE (64*1024L) #define SCRATCH_INC_SIZE (64*1024L)