136 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			136 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*************************************************************************
							 | 
						||
| 
								 | 
							
								*									 *
							 | 
						||
| 
								 | 
							
								*	 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 <sys/types.h>
							 | 
						||
| 
								 | 
							
								#include <sys/mman.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#elif USE_SHM
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#elif USE_SBRK
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __svr4__
							 | 
						||
| 
								 | 
							
								#include <unistd.h>
							 | 
						||
| 
								 | 
							
								#elif sun
							 | 
						||
| 
								 | 
							
								#include <sys/types.h>
							 | 
						||
| 
								 | 
							
								#include <malloc.h>
							 | 
						||
| 
								 | 
							
								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
							 |