| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | /*************************************************************************
 | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | *	 YAP Prolog 							 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | *	Yap Prolog was developed at NCCUP - Universidade do Porto	 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997	 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | ************************************************************************** | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | * File:		init.c							 * | 
					
						
							|  |  |  | * Last rev:								 * | 
					
						
							|  |  |  | * mods:									 * | 
					
						
							|  |  |  | * comments:	initializing a prolog session				 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | *************************************************************************/ | 
					
						
							|  |  |  | #ifdef SCCS
 | 
					
						
							|  |  |  | static char     SccsId[] = "%W% %G%"; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * The code from this file is used to initialize the environment for prolog  | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-30 21:51:44 -05:00
										 |  |  | #include <stdlib.h>
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #include "Yap.h"
 | 
					
						
							| 
									
										
										
										
											2013-11-25 11:22:44 +01:00
										 |  |  | #include "clause.h"
 | 
					
						
							| 
									
										
										
										
											2013-11-15 01:10:25 +00:00
										 |  |  | #include "pl-shared.h"
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #include "yapio.h"
 | 
					
						
							| 
									
										
										
										
											2004-01-23 02:23:51 +00:00
										 |  |  | #include "alloc.h"
 | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | #include "Foreign.h"
 | 
					
						
							| 
									
										
										
										
											2011-10-21 23:06:17 +01:00
										 |  |  | #include "SWI-Prolog.h"
 | 
					
						
							| 
									
										
										
										
											2010-05-03 14:26:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #ifdef LOW_LEVEL_TRACER
 | 
					
						
							|  |  |  | #include "tracer.h"
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #ifdef YAPOR
 | 
					
						
							| 
									
										
										
										
											2011-06-02 17:01:00 +01:00
										 |  |  | #ifdef YAPOR_COW
 | 
					
						
							|  |  |  | #include <signal.h>
 | 
					
						
							|  |  |  | #endif /* YAPOR_COW */
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #include "or.macros.h"
 | 
					
						
							| 
									
										
										
										
											2011-06-02 17:01:00 +01:00
										 |  |  | #endif /* YAPOR */
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #if defined(YAPOR) || defined(TABLING)
 | 
					
						
							|  |  |  | #if HAVE_SYS_TYPES_H
 | 
					
						
							|  |  |  | #include <sys/types.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #if HAVE_SYS_STAT_H
 | 
					
						
							|  |  |  | #include <sys/stat.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #if HAVE_FCNTL_H
 | 
					
						
							|  |  |  | #include <fcntl.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #endif	/* YAPOR || TABLING */
 | 
					
						
							|  |  |  | #if HAVE_STRING_H
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-16 00:27:02 +00:00
										 |  |  | int  Yap_output_msg = FALSE; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-15 18:25:33 +00:00
										 |  |  | #if DEBUG
 | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define	LOGFILE	"logfile"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #ifdef MACC
 | 
					
						
							| 
									
										
										
										
											2013-04-25 17:15:04 -05:00
										 |  |  | static void  InTTYLine(char *); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2013-04-25 17:15:04 -05:00
										 |  |  | static void  SetOp(int, int, char *, Term); | 
					
						
							|  |  |  | static void  InitOps(void); | 
					
						
							|  |  |  | static void  InitDebug(void); | 
					
						
							|  |  |  | static void  CleanBack(PredEntry *, CPredicate, CPredicate, CPredicate); | 
					
						
							|  |  |  | static void  InitStdPreds(void); | 
					
						
							|  |  |  | static void  InitFlags(void); | 
					
						
							|  |  |  | static void  InitCodes(void); | 
					
						
							|  |  |  | static void  InitVersion(void); | 
					
						
							|  |  |  | void  exit(int); | 
					
						
							| 
									
										
										
										
											2011-03-11 19:49:32 +00:00
										 |  |  | static void InitWorker(int wid); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-18 18:52:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | /**************	YAP PROLOG GLOBAL VARIABLES *************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /************* variables related to memory allocation ***************/ | 
					
						
							| 
									
										
										
										
											2009-10-30 23:59:00 +00:00
										 |  |  | ADDR Yap_HeapBase; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | /**************	declarations local to init.c ************************/ | 
					
						
							|  |  |  | static char    *optypes[] = | 
					
						
							|  |  |  | {"", "xfx", "xfy", "yfx", "xf", "yf", "fx", "fy"}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | /* OS page size for memory allocation */ | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | int Yap_page_size; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | #if USE_THREADED_CODE
 | 
					
						
							|  |  |  | /* easy access to instruction opcodes */ | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | void **Yap_ABSMI_OPCODES; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | #if DEBUG
 | 
					
						
							|  |  |  | #if COROUTINING
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | int  Yap_Portray_delays = FALSE; | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | #define	xfx	1
 | 
					
						
							|  |  |  | #define	xfy	2
 | 
					
						
							|  |  |  | #define	yfx	3
 | 
					
						
							|  |  |  | #define	xf	4
 | 
					
						
							|  |  |  | #define	yf	5
 | 
					
						
							|  |  |  | #define	fx	6
 | 
					
						
							|  |  |  | #define	fy	7
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | int | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_IsOpType(char *type) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   for (i = 1; i <= 7; ++i) | 
					
						
							|  |  |  |     if (strcmp(type, optypes[i]) == 0) | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |   return (i <= 7); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | static int  | 
					
						
							| 
									
										
										
										
											2014-05-25 20:46:04 +01:00
										 |  |  | OpDec(int p, const char *type, Atom a, Term m) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   int             i; | 
					
						
							|  |  |  |   AtomEntry      *ae = RepAtom(a); | 
					
						
							|  |  |  |   OpEntry        *info; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-20 00:33:14 +00:00
										 |  |  |   if (m == TermProlog) | 
					
						
							|  |  |  |     m = PROLOG_MODULE; | 
					
						
							| 
									
										
										
										
											2009-11-25 00:38:29 +00:00
										 |  |  |   else if (m == USER_MODULE) | 
					
						
							|  |  |  |     m = PROLOG_MODULE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   for (i = 1; i <= 7; ++i) | 
					
						
							|  |  |  |     if (strcmp(type, optypes[i]) == 0) | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |   if (i > 7) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(DOMAIN_ERROR_OPERATOR_SPECIFIER,MkAtomTerm(Yap_LookupAtom(type)),"op/3"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return(FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (p) { | 
					
						
							|  |  |  |     if (i == 1 || i == 2 || i == 4) | 
					
						
							|  |  |  |       p |= DcrlpFlag; | 
					
						
							|  |  |  |     if (i == 1 || i == 3 || i == 6) | 
					
						
							|  |  |  |       p |= DcrrpFlag; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   WRITE_LOCK(ae->ARWLock); | 
					
						
							| 
									
										
										
										
											2009-11-20 00:33:14 +00:00
										 |  |  |   info = Yap_GetOpPropForAModuleHavingALock(ae, m); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (EndOfPAEntr(info)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     info = (OpEntry *) Yap_AllocAtomSpace(sizeof(OpEntry)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     info->KindOfPE = Ord(OpProperty); | 
					
						
							| 
									
										
										
										
											2005-10-21 16:09:03 +00:00
										 |  |  |     info->OpModule = m; | 
					
						
							| 
									
										
										
										
											2006-04-28 13:23:23 +00:00
										 |  |  |     info->OpName = a; | 
					
						
							|  |  |  |     LOCK(OpListLock); | 
					
						
							|  |  |  |     info->OpNext = OpList; | 
					
						
							|  |  |  |     OpList = info; | 
					
						
							|  |  |  |     UNLOCK(OpListLock); | 
					
						
							| 
									
										
										
										
											2011-08-17 11:16:21 -07:00
										 |  |  |     AddPropToAtom(ae, (PropEntry *)info); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     INIT_RWLOCK(info->OpRWLock); | 
					
						
							|  |  |  |     WRITE_LOCK(info->OpRWLock); | 
					
						
							|  |  |  |     WRITE_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |     info->Prefix = info->Infix = info->Posfix = 0; | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     WRITE_LOCK(info->OpRWLock); | 
					
						
							|  |  |  |     WRITE_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (i <= 3) { | 
					
						
							| 
									
										
										
										
											2013-11-15 15:45:55 +00:00
										 |  |  |     GET_LD | 
					
						
							|  |  |  |     if (truePrologFlag(PLFLAG_ISO) &&  | 
					
						
							| 
									
										
										
										
											2007-02-18 00:26:36 +00:00
										 |  |  | 	info->Posfix != 0) /* there is a posfix operator */ { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       /* ISO dictates */ | 
					
						
							|  |  |  |       WRITE_UNLOCK(info->OpRWLock); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(PERMISSION_ERROR_CREATE_OPERATOR,MkAtomTerm(a),"op/3"); | 
					
						
							| 
									
										
										
										
											2009-11-20 00:33:14 +00:00
										 |  |  |       return FALSE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     info->Infix = p; | 
					
						
							|  |  |  |   } else if (i <= 5) { | 
					
						
							| 
									
										
										
										
											2013-11-15 15:45:55 +00:00
										 |  |  |     GET_LD | 
					
						
							|  |  |  |     if (truePrologFlag(PLFLAG_ISO) &&  | 
					
						
							| 
									
										
										
										
											2007-02-18 00:26:36 +00:00
										 |  |  | 	info->Infix != 0) /* there is an infix operator */ { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       /* ISO dictates */ | 
					
						
							|  |  |  |       WRITE_UNLOCK(info->OpRWLock); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(PERMISSION_ERROR_CREATE_OPERATOR,MkAtomTerm(a),"op/3"); | 
					
						
							| 
									
										
										
										
											2009-11-20 00:33:14 +00:00
										 |  |  |       return FALSE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     info->Posfix = p; | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     info->Prefix = p; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   WRITE_UNLOCK(info->OpRWLock); | 
					
						
							|  |  |  |   return (TRUE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | int  | 
					
						
							| 
									
										
										
										
											2005-10-21 16:09:03 +00:00
										 |  |  | Yap_OpDec(int p, char *type, Atom a, Term m) | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2005-10-21 16:09:03 +00:00
										 |  |  |   return(OpDec(p,type,a,m)); | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | static void  | 
					
						
							| 
									
										
										
										
											2005-10-21 16:09:03 +00:00
										 |  |  | SetOp(int p, int type, char *at, Term m) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-11-15 18:25:33 +00:00
										 |  |  | #if DEBUG
 | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   if (GLOBAL_Option[5]) | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  |     fprintf(stderr,"[setop %d %s %s]\n", p, optypes[type], at); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2005-10-21 16:09:03 +00:00
										 |  |  |   OpDec(p, optypes[type], Yap_LookupAtom(at), m); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Gets the info about an operator in a prop */ | 
					
						
							|  |  |  | Atom  | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_GetOp(OpEntry *pp, int *prio, int fix) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   int             n; | 
					
						
							|  |  |  |   SMALLUNSGN      p; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (fix == 0) { | 
					
						
							|  |  |  |     p = pp->Prefix; | 
					
						
							|  |  |  |     if (p & DcrrpFlag) | 
					
						
							|  |  |  |       n = 6, *prio = (p ^ DcrrpFlag); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       n = 7, *prio = p; | 
					
						
							|  |  |  |   } else if (fix == 1) { | 
					
						
							|  |  |  |     p = pp->Posfix; | 
					
						
							|  |  |  |     if (p & DcrlpFlag) | 
					
						
							|  |  |  |       n = 4, *prio = (p ^ DcrlpFlag); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       n = 5, *prio = p; | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     p = pp->Infix; | 
					
						
							|  |  |  |     if ((p & DcrrpFlag) && (p & DcrlpFlag)) | 
					
						
							|  |  |  |       n = 1, *prio = (p ^ (DcrrpFlag | DcrlpFlag)); | 
					
						
							|  |  |  |     else if (p & DcrrpFlag) | 
					
						
							|  |  |  |       n = 3, *prio = (p ^ DcrrpFlag); | 
					
						
							|  |  |  |     else if (p & DcrlpFlag) | 
					
						
							|  |  |  |       n = 2, *prio = (p ^ DcrlpFlag); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       n = 4, *prio = p; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2008-02-13 10:15:36 +00:00
										 |  |  |   return Yap_LookupAtom(optypes[n]); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct OPSTRUCT { | 
					
						
							|  |  |  | 	char           *opName; | 
					
						
							|  |  |  | 	short int       opType, opPrio; | 
					
						
							|  |  |  | }               Opdef; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static Opdef    Ops[] = { | 
					
						
							|  |  |  |   {":-", xfx, 1200}, | 
					
						
							|  |  |  |   {"-->", xfx, 1200}, | 
					
						
							|  |  |  |   {"?-", fx, 1200}, | 
					
						
							|  |  |  |   {":-", fx, 1200}, | 
					
						
							|  |  |  |   {"dynamic", fx, 1150}, | 
					
						
							| 
									
										
										
										
											2008-02-12 17:03:59 +00:00
										 |  |  |   {"thread_local", fx, 1150}, | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   {"initialization", fx, 1150}, | 
					
						
							| 
									
										
										
										
											2009-12-04 18:24:22 +00:00
										 |  |  |   {"volatile", fx, 1150}, | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   {"mode", fx, 1150}, | 
					
						
							|  |  |  |   {"public", fx, 1150}, | 
					
						
							|  |  |  |   {"multifile", fx, 1150}, | 
					
						
							|  |  |  |   {"meta_predicate", fx, 1150}, | 
					
						
							| 
									
										
										
										
											2008-02-12 17:03:59 +00:00
										 |  |  |   {"module_transparent", fx, 1150}, | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   {"discontiguous", fx, 1150}, | 
					
						
							|  |  |  | #ifdef YAPOR
 | 
					
						
							|  |  |  |   {"sequential", fx, 1150}, | 
					
						
							|  |  |  | #endif /* YAPOR */
 | 
					
						
							|  |  |  | #ifdef TABLING
 | 
					
						
							|  |  |  |   {"table", fx, 1150}, | 
					
						
							|  |  |  | #endif /* TABLING */
 | 
					
						
							| 
									
										
										
										
											2002-10-03 13:54:35 +00:00
										 |  |  | #ifndef UNCUTABLE
 | 
					
						
							|  |  |  |   {"uncutable", fx, 1150}, | 
					
						
							|  |  |  | #endif /*UNCUTABLE ceh:*/
 | 
					
						
							| 
									
										
										
										
											2009-11-27 15:55:46 +00:00
										 |  |  |   {"|", xfy, 1105}, | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   {";", xfy, 1100}, | 
					
						
							|  |  |  |   /*  {";", yf, 1100}, not allowed in ISO */ | 
					
						
							|  |  |  |   {"->", xfy, 1050}, | 
					
						
							| 
									
										
										
										
											2008-02-12 17:03:59 +00:00
										 |  |  |   {"*->", xfy, 1050}, | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   {",", xfy, 1000}, | 
					
						
							|  |  |  |   {".", xfy, 999}, | 
					
						
							|  |  |  |   {"\\+", fy, 900}, | 
					
						
							|  |  |  |   {"not", fy, 900}, | 
					
						
							|  |  |  |   {"=", xfx, 700}, | 
					
						
							|  |  |  |   {"\\=", xfx, 700}, | 
					
						
							|  |  |  |   {"is", xfx, 700}, | 
					
						
							|  |  |  |   {"=..", xfx, 700}, | 
					
						
							|  |  |  |   {"==", xfx, 700}, | 
					
						
							|  |  |  |   {"\\==", xfx, 700}, | 
					
						
							|  |  |  |   {"@<", xfx, 700}, | 
					
						
							|  |  |  |   {"@>", xfx, 700}, | 
					
						
							|  |  |  |   {"@=<", xfx, 700}, | 
					
						
							|  |  |  |   {"@>=", xfx, 700}, | 
					
						
							| 
									
										
										
										
											2008-02-12 17:03:59 +00:00
										 |  |  |   {"=@=", xfx, 700}, | 
					
						
							|  |  |  |   {"\\=@=", xfx, 700}, | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   {"=:=", xfx, 700}, | 
					
						
							|  |  |  |   {"=\\=", xfx, 700}, | 
					
						
							|  |  |  |   {"<", xfx, 700}, | 
					
						
							|  |  |  |   {">", xfx, 700}, | 
					
						
							|  |  |  |   {"=<", xfx, 700}, | 
					
						
							|  |  |  |   {">=", xfx, 700}, | 
					
						
							| 
									
										
										
										
											2007-12-05 12:17:25 +00:00
										 |  |  |   {"as", xfx, 600}, | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   {":", xfy, 600}, | 
					
						
							|  |  |  |   {"+", yfx, 500}, | 
					
						
							|  |  |  |   {"-", yfx, 500}, | 
					
						
							|  |  |  |   {"/\\", yfx, 500}, | 
					
						
							|  |  |  |   {"\\/", yfx, 500}, | 
					
						
							| 
									
										
										
										
											2009-07-23 14:31:04 -05:00
										 |  |  |   {"><", yfx, 500}, | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   {"#", yfx, 500}, | 
					
						
							| 
									
										
										
										
											2008-03-13 17:16:47 +00:00
										 |  |  |   {"rdiv", yfx, 400}, | 
					
						
							| 
									
										
										
										
											2010-08-30 21:51:44 -05:00
										 |  |  |   {"div", yfx, 400}, | 
					
						
							| 
									
										
										
										
											2012-02-13 09:37:16 +00:00
										 |  |  |   {"xor", yfx, 400}, | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   {"*", yfx, 400}, | 
					
						
							|  |  |  |   {"/", yfx, 400}, | 
					
						
							| 
									
										
										
										
											2008-08-24 00:46:20 +01:00
										 |  |  |   {"//", yfx, 400}, | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   {"<<", yfx, 400}, | 
					
						
							|  |  |  |   {">>", yfx, 400}, | 
					
						
							| 
									
										
										
										
											2002-01-02 00:34:44 +00:00
										 |  |  |   {"mod", yfx, 400}, | 
					
						
							|  |  |  |   {"rem", yfx, 400}, | 
					
						
							| 
									
										
										
										
											2010-11-05 11:00:14 +00:00
										 |  |  |   {"+", fy, 200}, | 
					
						
							| 
									
										
										
										
											2009-11-11 10:54:38 +00:00
										 |  |  |   {"-", fy, 200}, | 
					
						
							|  |  |  |   {"\\", fy, 200}, | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   {"//", yfx, 400}, | 
					
						
							|  |  |  |   {"**", xfx, 200}, | 
					
						
							|  |  |  |   {"^", xfy, 200} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void  | 
					
						
							|  |  |  | InitOps(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   unsigned int             i; | 
					
						
							|  |  |  |   for (i = 0; i < sizeof(Ops) / sizeof(*Ops); ++i) | 
					
						
							| 
									
										
										
										
											2005-10-21 16:09:03 +00:00
										 |  |  |     SetOp(Ops[i].opPrio, Ops[i].opType, Ops[i].opName, PROLOG_MODULE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-15 18:25:33 +00:00
										 |  |  | #if DEBUG
 | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | #ifdef HAVE_ISATTY
 | 
					
						
							|  |  |  | #include <unistd.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | static void  | 
					
						
							|  |  |  | InitDebug(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Atom            At; | 
					
						
							| 
									
										
										
										
											2013-11-15 18:25:33 +00:00
										 |  |  | #if DEBUG
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   for (i = 1; i < 20; ++i) | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |     GLOBAL_Option[i] = 0; | 
					
						
							| 
									
										
										
										
											2011-06-20 14:49:24 +01:00
										 |  |  |   if (Yap_output_msg) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     char            ch; | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #if HAVE_ISATTY
 | 
					
						
							|  |  |  |     if (!isatty (0)) { | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     fprintf(stderr,"absmi address:%p\n", FunAdr(Yap_absmi)); | 
					
						
							| 
									
										
										
										
											2001-05-07 19:56:02 +00:00
										 |  |  |     fprintf(stderr,"Set	Trace Options:\n"); | 
					
						
							|  |  |  |     fprintf(stderr,"a getch\t\tb token\t\tc Lookup\td LookupVar\ti Index\n"); | 
					
						
							|  |  |  |     fprintf(stderr,"e SetOp\t\tf compile\tg icode\t\th boot\t\tl log\n"); | 
					
						
							| 
									
										
										
										
											2005-11-16 01:55:03 +00:00
										 |  |  |     fprintf(stderr,"m Machine\t p parser\n"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     while ((ch = YP_putchar(YP_getchar())) != '\n') | 
					
						
							|  |  |  |       if (ch >= 'a' && ch <= 'z') | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  | 	GLOBAL_Option[ch - 'a' + 1] = 1; | 
					
						
							|  |  |  |     if (GLOBAL_Option['l' - 96]) { | 
					
						
							|  |  |  |       GLOBAL_logfile = fopen(LOGFILE, "w"); | 
					
						
							|  |  |  |       if (GLOBAL_logfile == NULL) { | 
					
						
							| 
									
										
										
										
											2001-05-07 19:56:02 +00:00
										 |  |  | 	fprintf(stderr,"can not open %s\n", LOGFILE); | 
					
						
							|  |  |  | 	getchar(); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	exit(0); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2001-05-07 19:56:02 +00:00
										 |  |  |       fprintf(stderr,"logging session to file 'logfile'\n"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #ifdef MAC
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_SetTextFile(LOGFILE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       lp = my_line; | 
					
						
							|  |  |  |       curfile = Nill; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-01-18 04:24:10 +00:00
										 |  |  |   /* Set at full leash */ | 
					
						
							| 
									
										
										
										
											2008-12-23 01:53:52 +00:00
										 |  |  |   At = AtomLeash; | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   Yap_PutValue(At, MkIntTerm(15)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-07 15:06:53 +00:00
										 |  |  | static UInt  | 
					
						
							|  |  |  | update_flags_from_prolog(UInt flags, PredEntry *pe) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   if (pe->PredFlags & MetaPredFlag) | 
					
						
							|  |  |  |     flags |= MetaPredFlag; | 
					
						
							|  |  |  |   if (pe->PredFlags & SourcePredFlag) | 
					
						
							|  |  |  |     flags |= SourcePredFlag; | 
					
						
							|  |  |  |   if (pe->PredFlags & SequentialPredFlag) | 
					
						
							|  |  |  |     flags |= SequentialPredFlag; | 
					
						
							|  |  |  |   if (pe->PredFlags & UDIPredFlag) | 
					
						
							|  |  |  |     flags |= UDIPredFlag; | 
					
						
							|  |  |  |   if (pe->PredFlags & ModuleTransparentPredFlag) | 
					
						
							|  |  |  |     flags |= ModuleTransparentPredFlag; | 
					
						
							|  |  |  |   return flags; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | void  | 
					
						
							| 
									
										
										
										
											2014-05-25 20:46:04 +01:00
										 |  |  | Yap_InitCPred(const char *Name, UInt Arity, CPredicate code, UInt flags) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2008-09-24 00:59:41 +01:00
										 |  |  |   Atom              atom = NIL; | 
					
						
							|  |  |  |   PredEntry        *pe = NULL; | 
					
						
							| 
									
										
										
										
											2004-11-18 22:32:40 +00:00
										 |  |  |   yamop            *p_code; | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |   StaticClause     *cl = NULL; | 
					
						
							| 
									
										
										
										
											2008-10-07 23:52:26 +01:00
										 |  |  |   Functor           f = NULL; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-24 00:59:41 +01:00
										 |  |  |   while (atom == NIL) { | 
					
						
							| 
									
										
										
										
											2011-11-03 07:49:41 +09:00
										 |  |  |     if (flags & UserCPredFlag) | 
					
						
							|  |  |  |       atom = Yap_LookupAtom(Name); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       atom = Yap_FullLookupAtom(Name); | 
					
						
							| 
									
										
										
										
											2008-09-24 00:59:41 +01:00
										 |  |  |     if (atom == NIL && !Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							|  |  |  |       Yap_Error(OUT_OF_HEAP_ERROR,TermNil,"while initialising %s", Name); | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2008-10-07 23:52:26 +01:00
										 |  |  |   if (Arity)  { | 
					
						
							|  |  |  |     while (!f) { | 
					
						
							|  |  |  |       f = Yap_MkFunctor(atom,Arity); | 
					
						
							|  |  |  |       if (!f && !Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							|  |  |  | 	Yap_Error(OUT_OF_HEAP_ERROR,TermNil,"while initialising %s", Name); | 
					
						
							|  |  |  | 	return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2008-09-24 00:59:41 +01:00
										 |  |  |   while (pe == NULL) { | 
					
						
							|  |  |  |     if (Arity) | 
					
						
							| 
									
										
										
										
											2008-10-07 23:52:26 +01:00
										 |  |  |       pe = RepPredProp(PredPropByFunc(f,CurrentModule)); | 
					
						
							| 
									
										
										
										
											2008-09-24 00:59:41 +01:00
										 |  |  |     else | 
					
						
							|  |  |  |       pe = RepPredProp(PredPropByAtom(atom,CurrentModule)); | 
					
						
							|  |  |  |     if (!pe && !Yap_growheap(FALSE, sizeof(PredEntry), NULL)) { | 
					
						
							|  |  |  |       Yap_Error(OUT_OF_HEAP_ERROR,TermNil,"while initialising %s", Name); | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }  | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |   if (pe->PredFlags & CPredFlag) { | 
					
						
							|  |  |  |     /* already exists */ | 
					
						
							| 
									
										
										
										
											2010-12-07 15:06:53 +00:00
										 |  |  |     flags = update_flags_from_prolog(flags, pe); | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |     cl = ClauseCodeToStaticClause(pe->CodeOfPred); | 
					
						
							| 
									
										
										
										
											2010-12-07 15:06:53 +00:00
										 |  |  |     if ((flags | StandardPredFlag | CPredFlag ) != pe->PredFlags) { | 
					
						
							| 
									
										
										
										
											2006-11-06 18:35:05 +00:00
										 |  |  |       Yap_ClauseSpace -= cl->ClSize; | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |       Yap_FreeCodeSpace((ADDR)cl); | 
					
						
							|  |  |  |       cl = NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2004-11-18 22:32:40 +00:00
										 |  |  |   p_code = cl->ClCode; | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |   while (!cl) { | 
					
						
							|  |  |  |     UInt sz; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (flags & SafePredFlag) { | 
					
						
							| 
									
										
										
										
											2008-09-05 05:22:19 +01:00
										 |  |  |       sz = (CELL)NEXTOP(NEXTOP(NEXTOP(p_code,Osbpp),p),l); | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2009-05-04 21:57:08 -05:00
										 |  |  |       sz = (CELL)NEXTOP(NEXTOP(NEXTOP(NEXTOP(NEXTOP(p_code,e),p),Osbpp),p),l); | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     cl = (StaticClause *)Yap_AllocCodeSpace(sz); | 
					
						
							|  |  |  |     if (!cl) { | 
					
						
							|  |  |  |       if (!Yap_growheap(FALSE, sz, NULL)) { | 
					
						
							|  |  |  | 	Yap_Error(OUT_OF_HEAP_ERROR,TermNil,"while initialising %s", Name); | 
					
						
							|  |  |  | 	return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2006-11-06 18:35:05 +00:00
										 |  |  |       Yap_ClauseSpace += sz; | 
					
						
							| 
									
										
										
										
											2005-12-23 00:20:14 +00:00
										 |  |  |       cl->ClFlags = StaticMask; | 
					
						
							|  |  |  |       cl->ClNext = NULL; | 
					
						
							| 
									
										
										
										
											2005-01-28 23:14:41 +00:00
										 |  |  |       cl->ClSize = sz; | 
					
						
							| 
									
										
										
										
											2013-11-05 17:59:19 +00:00
										 |  |  |       cl->usc.ClLine = Yap_source_line_no(); | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |       p_code = cl->ClCode; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2003-11-18 19:16:08 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2002-12-27 16:53:09 +00:00
										 |  |  |   pe->CodeOfPred = p_code; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   pe->PredFlags = flags | StandardPredFlag | CPredFlag; | 
					
						
							| 
									
										
										
										
											2014-02-09 11:00:01 +00:00
										 |  |  |   pe->src.OwnerFile = Yap_ConsultingFile( PASS_REGS1 ); | 
					
						
							| 
									
										
										
										
											2002-12-27 16:53:09 +00:00
										 |  |  |   pe->cs.f_code = code; | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |   if (!(flags & SafePredFlag)) { | 
					
						
							| 
									
										
										
										
											2003-11-18 19:16:08 +00:00
										 |  |  |     p_code->opc = Yap_opcode(_allocate); | 
					
						
							|  |  |  |     p_code = NEXTOP(p_code,e); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |   if (flags & UserCPredFlag) | 
					
						
							| 
									
										
										
										
											2003-11-18 19:16:08 +00:00
										 |  |  |     p_code->opc = Yap_opcode(_call_usercpred); | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |   else | 
					
						
							| 
									
										
										
										
											2003-11-18 19:16:08 +00:00
										 |  |  |     p_code->opc = Yap_opcode(_call_cpred); | 
					
						
							| 
									
										
										
										
											2014-05-30 01:06:09 +01:00
										 |  |  |   p_code->y_u.Osbpp.bmap = NULL; | 
					
						
							|  |  |  |   p_code->y_u.Osbpp.s = -Signed(RealEnvSize); | 
					
						
							|  |  |  |   p_code->y_u.Osbpp.p = | 
					
						
							|  |  |  |     p_code->y_u.Osbpp.p0 = | 
					
						
							| 
									
										
										
										
											2006-12-13 16:10:26 +00:00
										 |  |  |     pe; | 
					
						
							| 
									
										
										
										
											2008-09-05 05:22:19 +01:00
										 |  |  |   p_code = NEXTOP(p_code,Osbpp); | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |   if (!(flags & SafePredFlag)) { | 
					
						
							| 
									
										
										
										
											2003-11-18 19:16:08 +00:00
										 |  |  |     p_code->opc = Yap_opcode(_deallocate); | 
					
						
							| 
									
										
										
										
											2014-05-30 01:06:09 +01:00
										 |  |  |     p_code->y_u.p.p = pe; | 
					
						
							| 
									
										
										
										
											2008-08-30 16:24:44 +01:00
										 |  |  |     p_code = NEXTOP(p_code,p); | 
					
						
							| 
									
										
										
										
											2003-11-18 19:16:08 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   p_code->opc = Yap_opcode(_procceed); | 
					
						
							| 
									
										
										
										
											2014-05-30 01:06:09 +01:00
										 |  |  |   p_code->y_u.p.p = pe; | 
					
						
							| 
									
										
										
										
											2005-12-17 03:25:39 +00:00
										 |  |  |   p_code = NEXTOP(p_code,p); | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |   p_code->opc = Yap_opcode(_Ystop); | 
					
						
							| 
									
										
										
										
											2014-05-30 01:06:09 +01:00
										 |  |  |   p_code->y_u.l.l = cl->ClCode; | 
					
						
							| 
									
										
										
										
											2003-11-18 19:16:08 +00:00
										 |  |  |   pe->OpcodeOfPred = pe->CodeOfPred->opc; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void  | 
					
						
							| 
									
										
										
										
											2014-05-25 20:46:04 +01:00
										 |  |  | Yap_InitCmpPred(const char *Name, UInt Arity, CmpPredicate cmp_code, UInt flags) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2008-09-24 00:59:41 +01:00
										 |  |  |   Atom              atom = NIL; | 
					
						
							|  |  |  |   PredEntry        *pe = NULL; | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |   yamop            *p_code = NULL; | 
					
						
							|  |  |  |   StaticClause     *cl = NULL;  | 
					
						
							| 
									
										
										
										
											2008-10-07 23:52:26 +01:00
										 |  |  |   Functor           f = NULL; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-24 00:59:41 +01:00
										 |  |  |   while (atom == NIL) { | 
					
						
							|  |  |  |     atom = Yap_FullLookupAtom(Name); | 
					
						
							|  |  |  |     if (atom == NIL && !Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							|  |  |  |       Yap_Error(OUT_OF_HEAP_ERROR,TermNil,"while initialising %s", Name); | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2008-10-07 23:52:26 +01:00
										 |  |  |   if (Arity)  { | 
					
						
							|  |  |  |     while (!f) { | 
					
						
							|  |  |  |       f = Yap_MkFunctor(atom,Arity); | 
					
						
							|  |  |  |       if (!f && !Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							|  |  |  | 	Yap_Error(OUT_OF_HEAP_ERROR,TermNil,"while initialising %s", Name); | 
					
						
							|  |  |  | 	return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2008-09-24 00:59:41 +01:00
										 |  |  |   while (pe == NULL) { | 
					
						
							|  |  |  |     if (Arity) | 
					
						
							| 
									
										
										
										
											2008-10-07 23:52:26 +01:00
										 |  |  |       pe = RepPredProp(PredPropByFunc(f,CurrentModule)); | 
					
						
							| 
									
										
										
										
											2008-09-24 00:59:41 +01:00
										 |  |  |     else | 
					
						
							|  |  |  |       pe = RepPredProp(PredPropByAtom(atom,CurrentModule)); | 
					
						
							|  |  |  |     if (!pe && !Yap_growheap(FALSE, sizeof(PredEntry), NULL)) { | 
					
						
							|  |  |  |       Yap_Error(OUT_OF_HEAP_ERROR,TermNil,"while initialising %s", Name); | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }  | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |   if (pe->PredFlags & CPredFlag) { | 
					
						
							| 
									
										
										
										
											2010-12-07 15:06:53 +00:00
										 |  |  |     flags = update_flags_from_prolog(flags, pe); | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |     p_code = pe->CodeOfPred; | 
					
						
							|  |  |  |     /* already exists */ | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     while (!cl) { | 
					
						
							| 
									
										
										
										
											2008-08-21 13:38:25 +01:00
										 |  |  |       UInt sz = sizeof(StaticClause)+(CELL)NEXTOP(NEXTOP(NEXTOP(((yamop *)NULL),plxxs),p),l); | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |       cl = (StaticClause *)Yap_AllocCodeSpace(sz);  | 
					
						
							|  |  |  |       if (!cl) { | 
					
						
							|  |  |  | 	if (!Yap_growheap(FALSE, sz, NULL)) { | 
					
						
							|  |  |  | 	  Yap_Error(OUT_OF_HEAP_ERROR,TermNil,"while initialising %s", Name); | 
					
						
							|  |  |  | 	  return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  |       } else { | 
					
						
							| 
									
										
										
										
											2006-11-06 18:35:05 +00:00
										 |  |  | 	Yap_ClauseSpace += sz; | 
					
						
							| 
									
										
										
										
											2005-12-23 00:20:14 +00:00
										 |  |  | 	cl->ClFlags = StaticMask; | 
					
						
							|  |  |  | 	cl->ClNext = NULL; | 
					
						
							| 
									
										
										
										
											2005-01-28 23:14:41 +00:00
										 |  |  | 	cl->ClSize = sz; | 
					
						
							| 
									
										
										
										
											2013-11-05 17:59:19 +00:00
										 |  |  | 	cl->usc.ClLine = Yap_source_line_no(); | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  | 	p_code = cl->ClCode; | 
					
						
							|  |  |  | 	break; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   pe->PredFlags = flags | StandardPredFlag | CPredFlag; | 
					
						
							| 
									
										
										
										
											2002-12-27 16:53:09 +00:00
										 |  |  |   pe->CodeOfPred = p_code; | 
					
						
							|  |  |  |   pe->cs.d_code = cmp_code; | 
					
						
							| 
									
										
										
										
											2001-11-15 00:01:43 +00:00
										 |  |  |   pe->ModuleOfPred = CurrentModule; | 
					
						
							| 
									
										
										
										
											2003-01-13 14:02:50 +00:00
										 |  |  |   p_code->opc = pe->OpcodeOfPred = Yap_opcode(_call_bfunc_xx); | 
					
						
							| 
									
										
										
										
											2014-05-30 01:06:09 +01:00
										 |  |  |   p_code->y_u.plxxs.p = pe; | 
					
						
							|  |  |  |   p_code->y_u.plxxs.f = FAILCODE; | 
					
						
							|  |  |  |   p_code->y_u.plxxs.x1 = Yap_emit_x(1); | 
					
						
							|  |  |  |   p_code->y_u.plxxs.x2 = Yap_emit_x(2); | 
					
						
							|  |  |  |   p_code->y_u.plxxs.flags = Yap_compile_cmp_flags(pe); | 
					
						
							| 
									
										
										
										
											2008-08-21 13:38:25 +01:00
										 |  |  |   p_code = NEXTOP(p_code,plxxs); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   p_code->opc = Yap_opcode(_procceed); | 
					
						
							| 
									
										
										
										
											2014-05-30 01:06:09 +01:00
										 |  |  |   p_code->y_u.p.p = pe; | 
					
						
							| 
									
										
										
										
											2005-12-17 03:25:39 +00:00
										 |  |  |   p_code = NEXTOP(p_code,p); | 
					
						
							| 
									
										
										
										
											2004-09-20 04:16:33 +00:00
										 |  |  |   p_code->opc = Yap_opcode(_Ystop); | 
					
						
							| 
									
										
										
										
											2014-05-30 01:06:09 +01:00
										 |  |  |   p_code->y_u.l.l = cl->ClCode; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void  | 
					
						
							| 
									
										
										
										
											2014-05-25 20:46:04 +01:00
										 |  |  | Yap_InitAsmPred(const char *Name,  UInt Arity, int code, CPredicate def, UInt flags) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2008-09-24 00:59:41 +01:00
										 |  |  |   Atom            atom = NIL; | 
					
						
							|  |  |  |   PredEntry      *pe = NULL; | 
					
						
							| 
									
										
										
										
											2008-10-07 23:52:26 +01:00
										 |  |  |   Functor           f = NULL; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2008-09-24 00:59:41 +01:00
										 |  |  |   while (atom == NIL) { | 
					
						
							|  |  |  |     atom = Yap_FullLookupAtom(Name); | 
					
						
							|  |  |  |     if (atom == NIL && !Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							|  |  |  |       Yap_Error(OUT_OF_HEAP_ERROR,TermNil,"while initialising %s", Name); | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2008-10-07 23:52:26 +01:00
										 |  |  |   if (Arity)  { | 
					
						
							|  |  |  |     while (!f) { | 
					
						
							|  |  |  |       f = Yap_MkFunctor(atom,Arity); | 
					
						
							|  |  |  |       if (!f && !Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							|  |  |  | 	Yap_Error(OUT_OF_HEAP_ERROR,TermNil,"while initialising %s", Name); | 
					
						
							|  |  |  | 	return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2008-09-24 00:59:41 +01:00
										 |  |  |   while (pe == NULL) { | 
					
						
							|  |  |  |     if (Arity) | 
					
						
							| 
									
										
										
										
											2008-10-07 23:52:26 +01:00
										 |  |  |       pe = RepPredProp(PredPropByFunc(f,CurrentModule)); | 
					
						
							| 
									
										
										
										
											2008-09-24 00:59:41 +01:00
										 |  |  |     else | 
					
						
							|  |  |  |       pe = RepPredProp(PredPropByAtom(atom,CurrentModule)); | 
					
						
							|  |  |  |     if (!pe && !Yap_growheap(FALSE, sizeof(PredEntry), NULL)) { | 
					
						
							|  |  |  |       Yap_Error(OUT_OF_HEAP_ERROR,TermNil,"while initialising %s", Name); | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }  | 
					
						
							| 
									
										
										
										
											2010-12-07 15:06:53 +00:00
										 |  |  |   flags |= AsmPredFlag | StandardPredFlag | (code); | 
					
						
							|  |  |  |   if (pe->PredFlags & AsmPredFlag) { | 
					
						
							|  |  |  |     flags = update_flags_from_prolog(flags, pe); | 
					
						
							|  |  |  |     /* already exists */ | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   pe->PredFlags = flags; | 
					
						
							| 
									
										
										
										
											2002-12-27 16:53:09 +00:00
										 |  |  |   pe->cs.f_code =  def; | 
					
						
							|  |  |  |   pe->ModuleOfPred = CurrentModule; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (def != NULL) { | 
					
						
							| 
									
										
										
										
											2003-04-30 17:46:05 +00:00
										 |  |  |     yamop      *p_code = ((StaticClause *)NULL)->ClCode; | 
					
						
							| 
									
										
										
										
											2008-04-01 14:09:43 +00:00
										 |  |  |     StaticClause     *cl; | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-01 14:09:43 +00:00
										 |  |  |     if (pe->CodeOfPred == (yamop *)(&(pe->OpcodeOfPred))) { | 
					
						
							| 
									
										
										
										
											2009-05-04 21:57:08 -05:00
										 |  |  |       if (flags & SafePredFlag) { | 
					
						
							|  |  |  | 	cl = (StaticClause *)Yap_AllocCodeSpace((CELL)NEXTOP(NEXTOP(NEXTOP(((yamop *)p_code),Osbpp),p),l)); | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  | 	cl = (StaticClause *)Yap_AllocCodeSpace((CELL)NEXTOP(NEXTOP(NEXTOP(NEXTOP(NEXTOP(((yamop *)p_code),e),Osbpp),p),p),l)); | 
					
						
							|  |  |  |       }	 | 
					
						
							| 
									
										
										
										
											2008-04-01 14:09:43 +00:00
										 |  |  |       if (!cl) { | 
					
						
							|  |  |  | 	Yap_Error(OUT_OF_HEAP_ERROR,TermNil,"No Heap Space in InitAsmPred"); | 
					
						
							|  |  |  | 	return; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2008-09-05 05:22:19 +01:00
										 |  |  |       Yap_ClauseSpace += (CELL)NEXTOP(NEXTOP(NEXTOP(((yamop *)p_code),Osbpp),p),l); | 
					
						
							| 
									
										
										
										
											2008-04-01 14:09:43 +00:00
										 |  |  |     } else { | 
					
						
							|  |  |  |       cl = ClauseCodeToStaticClause(pe->CodeOfPred); | 
					
						
							| 
									
										
										
										
											2005-11-23 03:01:33 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-12-23 00:20:14 +00:00
										 |  |  |     cl->ClFlags = StaticMask; | 
					
						
							|  |  |  |     cl->ClNext = NULL; | 
					
						
							| 
									
										
										
										
											2009-05-04 21:57:08 -05:00
										 |  |  |     if (flags & SafePredFlag) { | 
					
						
							|  |  |  |       cl->ClSize = (CELL)NEXTOP(NEXTOP(NEXTOP(((yamop *)p_code),Osbpp),e),e); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       cl->ClSize = (CELL)NEXTOP(NEXTOP(NEXTOP(NEXTOP(NEXTOP(((yamop *)p_code),e),Osbpp),p),e),e); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-11-05 17:59:19 +00:00
										 |  |  |     cl->usc.ClLine = Yap_source_line_no(); | 
					
						
							| 
									
										
										
										
											2002-05-28 16:26:00 +00:00
										 |  |  |     p_code = cl->ClCode; | 
					
						
							| 
									
										
										
										
											2002-12-27 16:53:09 +00:00
										 |  |  |     pe->CodeOfPred = p_code; | 
					
						
							| 
									
										
										
										
											2009-05-04 21:57:08 -05:00
										 |  |  |     if (!(flags & SafePredFlag)) { | 
					
						
							|  |  |  |       p_code->opc = Yap_opcode(_allocate); | 
					
						
							|  |  |  |       p_code = NEXTOP(p_code,e); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2012-05-07 06:53:27 +01:00
										 |  |  |     p_code->opc = Yap_opcode(_call_cpred); | 
					
						
							| 
									
										
										
										
											2014-05-30 01:06:09 +01:00
										 |  |  |     p_code->y_u.Osbpp.bmap = NULL; | 
					
						
							|  |  |  |     p_code->y_u.Osbpp.s = -Signed(RealEnvSize); | 
					
						
							|  |  |  |     p_code->y_u.Osbpp.p = p_code->y_u.Osbpp.p0 = pe; | 
					
						
							| 
									
										
										
										
											2008-09-05 05:22:19 +01:00
										 |  |  |     p_code = NEXTOP(p_code,Osbpp); | 
					
						
							| 
									
										
										
										
											2009-05-04 21:57:08 -05:00
										 |  |  |     if (!(flags & SafePredFlag)) { | 
					
						
							|  |  |  |       p_code->opc = Yap_opcode(_deallocate); | 
					
						
							| 
									
										
										
										
											2014-05-30 01:06:09 +01:00
										 |  |  |       p_code->y_u.p.p = pe; | 
					
						
							| 
									
										
										
										
											2009-05-04 21:57:08 -05:00
										 |  |  |       p_code = NEXTOP(p_code,p); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     p_code->opc = Yap_opcode(_procceed); | 
					
						
							| 
									
										
										
										
											2014-05-30 01:06:09 +01:00
										 |  |  |     p_code->y_u.p.p = pe; | 
					
						
							| 
									
										
										
										
											2005-12-17 03:25:39 +00:00
										 |  |  |     p_code = NEXTOP(p_code,p); | 
					
						
							| 
									
										
										
										
											2004-12-28 22:20:37 +00:00
										 |  |  |     p_code->opc = Yap_opcode(_Ystop); | 
					
						
							| 
									
										
										
										
											2014-05-30 01:06:09 +01:00
										 |  |  |     p_code->y_u.l.l = cl->ClCode; | 
					
						
							| 
									
										
										
										
											2012-05-07 06:53:27 +01:00
										 |  |  |     pe->OpcodeOfPred = pe->CodeOfPred->opc; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     pe->OpcodeOfPred = Yap_opcode(_undef_p); | 
					
						
							| 
									
										
										
										
											2002-12-27 16:53:09 +00:00
										 |  |  |     pe->CodeOfPred =  (yamop *)(&(pe->OpcodeOfPred));  | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void  | 
					
						
							| 
									
										
										
										
											2005-11-18 18:52:41 +00:00
										 |  |  | CleanBack(PredEntry *pe, CPredicate Start, CPredicate Cont, CPredicate Cut) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   yamop   *code; | 
					
						
							| 
									
										
										
										
											2002-12-27 16:53:09 +00:00
										 |  |  |   if (pe->cs.p_code.FirstClause != pe->cs.p_code.LastClause || | 
					
						
							|  |  |  |       pe->cs.p_code.TrueCodeOfPred != pe->cs.p_code.FirstClause || | 
					
						
							|  |  |  |       pe->CodeOfPred != pe->cs.p_code.FirstClause) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(SYSTEM_ERROR,TermNil, | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	  "initiating a C Pred with backtracking"); | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2002-12-27 16:53:09 +00:00
										 |  |  |   code = (yamop *)(pe->cs.p_code.FirstClause); | 
					
						
							| 
									
										
										
										
											2014-05-30 01:06:09 +01:00
										 |  |  |   code->y_u.OtapFs.p = pe; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (pe->PredFlags & UserCPredFlag) | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     code->opc = Yap_opcode(_try_userc); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   else | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     code->opc = Yap_opcode(_try_c); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #ifdef YAPOR
 | 
					
						
							|  |  |  |   INIT_YAMOP_LTT(code, 2); | 
					
						
							|  |  |  |   PUT_YAMOP_SEQ(code); | 
					
						
							|  |  |  | #endif /* YAPOR */
 | 
					
						
							| 
									
										
										
										
											2014-05-30 01:06:09 +01:00
										 |  |  |   code->y_u.OtapFs.f = Start; | 
					
						
							| 
									
										
										
										
											2008-09-05 05:22:19 +01:00
										 |  |  |   code = NEXTOP(code,OtapFs); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (pe->PredFlags & UserCPredFlag) | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     code->opc = Yap_opcode(_retry_userc); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   else | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     code->opc = Yap_opcode(_retry_c); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #ifdef YAPOR
 | 
					
						
							|  |  |  |   INIT_YAMOP_LTT(code, 1); | 
					
						
							|  |  |  |   PUT_YAMOP_SEQ(code); | 
					
						
							|  |  |  | #endif /* YAPOR */
 | 
					
						
							| 
									
										
										
										
											2014-05-30 01:06:09 +01:00
										 |  |  |   code->y_u.OtapFs.f = Cont; | 
					
						
							| 
									
										
										
										
											2008-09-05 05:22:19 +01:00
										 |  |  |   code = NEXTOP(code,OtapFs); | 
					
						
							| 
									
										
										
										
											2005-11-18 18:52:41 +00:00
										 |  |  |   if (pe->PredFlags & UserCPredFlag) | 
					
						
							|  |  |  |     code->opc = Yap_opcode(_cut_c); | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     code->opc = Yap_opcode(_cut_userc); | 
					
						
							| 
									
										
										
										
											2014-05-30 01:06:09 +01:00
										 |  |  |   code->y_u.OtapFs.p = pe; | 
					
						
							|  |  |  |   code->y_u.OtapFs.f = Cut; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void  | 
					
						
							| 
									
										
										
										
											2014-05-25 20:46:04 +01:00
										 |  |  | Yap_InitCPredBack(const char *Name, UInt Arity, | 
					
						
							| 
									
										
										
										
											2005-11-18 18:52:41 +00:00
										 |  |  | 		  unsigned int Extra, CPredicate Start, | 
					
						
							| 
									
										
										
										
											2009-06-01 15:32:07 -05:00
										 |  |  | 		  CPredicate Cont, UInt flags){ | 
					
						
							| 
									
										
										
										
											2005-11-18 18:52:41 +00:00
										 |  |  |   Yap_InitCPredBack_(Name,Arity,Extra,Start,Cont,NULL,flags); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void | 
					
						
							| 
									
										
										
										
											2014-05-25 20:46:04 +01:00
										 |  |  | Yap_InitCPredBackCut(const char *Name, UInt Arity, | 
					
						
							| 
									
										
										
										
											2005-11-18 18:52:41 +00:00
										 |  |  | 		     unsigned int Extra, CPredicate Start, | 
					
						
							| 
									
										
										
										
											2009-06-01 15:32:07 -05:00
										 |  |  | 		     CPredicate Cont,CPredicate Cut, UInt flags){ | 
					
						
							| 
									
										
										
										
											2005-11-18 18:52:41 +00:00
										 |  |  |   Yap_InitCPredBack_(Name,Arity,Extra,Start,Cont,Cut,flags); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void | 
					
						
							| 
									
										
										
										
											2014-05-25 20:46:04 +01:00
										 |  |  | Yap_InitCPredBack_(const char *Name, UInt Arity, | 
					
						
							| 
									
										
										
										
											2005-11-18 18:52:41 +00:00
										 |  |  | 		  unsigned int Extra, CPredicate Start, | 
					
						
							| 
									
										
										
										
											2009-06-01 15:32:07 -05:00
										 |  |  | 		  CPredicate Cont, CPredicate Cut, UInt flags) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2008-09-24 00:59:41 +01:00
										 |  |  |   PredEntry      *pe = NULL; | 
					
						
							|  |  |  |   Atom            atom = NIL; | 
					
						
							| 
									
										
										
										
											2008-10-07 23:52:26 +01:00
										 |  |  |   Functor           f = NULL; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-24 00:59:41 +01:00
										 |  |  |   while (atom == NIL) { | 
					
						
							|  |  |  |     atom = Yap_FullLookupAtom(Name); | 
					
						
							|  |  |  |     if (atom == NIL && !Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							|  |  |  |       Yap_Error(OUT_OF_HEAP_ERROR,TermNil,"while initialising %s", Name); | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2008-10-07 23:52:26 +01:00
										 |  |  |   if (Arity)  { | 
					
						
							|  |  |  |     while (!f) { | 
					
						
							|  |  |  |       f = Yap_MkFunctor(atom,Arity); | 
					
						
							|  |  |  |       if (!f && !Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							|  |  |  | 	Yap_Error(OUT_OF_HEAP_ERROR,TermNil,"while initialising %s", Name); | 
					
						
							|  |  |  | 	return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2008-09-24 00:59:41 +01:00
										 |  |  |   while (pe == NULL) { | 
					
						
							|  |  |  |     if (Arity) | 
					
						
							| 
									
										
										
										
											2008-10-07 23:52:26 +01:00
										 |  |  |       pe = RepPredProp(PredPropByFunc(f,CurrentModule)); | 
					
						
							| 
									
										
										
										
											2008-09-24 00:59:41 +01:00
										 |  |  |     else | 
					
						
							|  |  |  |       pe = RepPredProp(PredPropByAtom(atom,CurrentModule)); | 
					
						
							|  |  |  |     if (!pe && !Yap_growheap(FALSE, sizeof(PredEntry), NULL)) { | 
					
						
							|  |  |  |       Yap_Error(OUT_OF_HEAP_ERROR,TermNil,"while initialising %s", Name); | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }  | 
					
						
							| 
									
										
										
										
											2002-12-27 16:53:09 +00:00
										 |  |  |   if (pe->cs.p_code.FirstClause != NIL) | 
					
						
							| 
									
										
										
										
											2005-11-18 18:52:41 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-12-07 15:06:53 +00:00
										 |  |  |       flags = update_flags_from_prolog(flags, pe);       | 
					
						
							| 
									
										
										
										
											2005-11-18 18:52:41 +00:00
										 |  |  |       CleanBack(pe, Start, Cont, Cut); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   else { | 
					
						
							| 
									
										
										
										
											2003-04-30 17:46:05 +00:00
										 |  |  |     StaticClause *cl; | 
					
						
							|  |  |  |     yamop      *code = ((StaticClause *)NULL)->ClCode; | 
					
						
							| 
									
										
										
										
											2005-11-18 18:52:41 +00:00
										 |  |  |     if (flags &  UserCPredFlag)  | 
					
						
							| 
									
										
										
										
											2011-08-31 13:59:30 -07:00
										 |  |  |       pe->PredFlags = UserCPredFlag | BackCPredFlag| CompiledPredFlag | StandardPredFlag | flags; | 
					
						
							| 
									
										
										
										
											2005-11-18 18:52:41 +00:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2011-08-31 13:59:30 -07:00
										 |  |  |       pe->PredFlags = CompiledPredFlag | StandardPredFlag | BackCPredFlag; | 
					
						
							| 
									
										
										
										
											2005-11-18 18:52:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #ifdef YAPOR
 | 
					
						
							|  |  |  |     pe->PredFlags |= SequentialPredFlag; | 
					
						
							|  |  |  | #endif /* YAPOR */
 | 
					
						
							| 
									
										
										
										
											2005-11-18 18:52:41 +00:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2008-09-05 05:22:19 +01:00
										 |  |  |     cl = (StaticClause *)Yap_AllocCodeSpace((CELL)NEXTOP(NEXTOP(NEXTOP(NEXTOP(code,OtapFs),OtapFs),OtapFs),l)); | 
					
						
							| 
									
										
										
										
											2005-11-18 18:52:41 +00:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2004-11-19 22:08:43 +00:00
										 |  |  |     if (cl == NULL) { | 
					
						
							|  |  |  |       Yap_Error(OUT_OF_HEAP_ERROR,TermNil,"No Heap Space in InitCPredBack"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-12-23 00:20:14 +00:00
										 |  |  |     cl->ClFlags = StaticMask; | 
					
						
							|  |  |  |     cl->ClNext = NULL; | 
					
						
							| 
									
										
										
										
											2008-09-05 05:22:19 +01:00
										 |  |  |     Yap_ClauseSpace += (CELL)NEXTOP(NEXTOP(NEXTOP(NEXTOP(code,OtapFs),OtapFs),OtapFs),l); | 
					
						
							| 
									
										
										
										
											2005-12-17 03:25:39 +00:00
										 |  |  |     cl->ClSize =  | 
					
						
							| 
									
										
										
										
											2008-09-05 05:22:19 +01:00
										 |  |  |       (CELL)NEXTOP(NEXTOP(NEXTOP(NEXTOP(code,OtapFs),OtapFs),OtapFs),e); | 
					
						
							| 
									
										
										
										
											2013-11-05 17:59:19 +00:00
										 |  |  |     cl->usc.ClLine = Yap_source_line_no(); | 
					
						
							| 
									
										
										
										
											2005-12-17 03:25:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     code = cl->ClCode; | 
					
						
							| 
									
										
										
										
											2002-12-27 16:53:09 +00:00
										 |  |  |     pe->cs.p_code.TrueCodeOfPred = pe->CodeOfPred = | 
					
						
							|  |  |  |       pe->cs.p_code.FirstClause = pe->cs.p_code.LastClause = code; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     if (flags & UserCPredFlag) | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       pe->OpcodeOfPred = code->opc = Yap_opcode(_try_userc); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       pe->OpcodeOfPred = code->opc = Yap_opcode(_try_c); | 
					
						
							| 
									
										
										
										
											2014-05-30 01:06:09 +01:00
										 |  |  |     code->y_u.OtapFs.f = Start; | 
					
						
							|  |  |  |     code->y_u.OtapFs.p = pe; | 
					
						
							|  |  |  |     code->y_u.OtapFs.s = Arity; | 
					
						
							|  |  |  |     code->y_u.OtapFs.extra = Extra; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #ifdef YAPOR
 | 
					
						
							|  |  |  |     INIT_YAMOP_LTT(code, 2); | 
					
						
							|  |  |  |     PUT_YAMOP_SEQ(code); | 
					
						
							|  |  |  | #endif /* YAPOR */
 | 
					
						
							| 
									
										
										
										
											2008-09-05 05:22:19 +01:00
										 |  |  |     code = NEXTOP(code,OtapFs); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     if (flags & UserCPredFlag) | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       code->opc = Yap_opcode(_retry_userc); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       code->opc = Yap_opcode(_retry_c); | 
					
						
							| 
									
										
										
										
											2014-05-30 01:06:09 +01:00
										 |  |  |     code->y_u.OtapFs.f = Cont; | 
					
						
							|  |  |  |     code->y_u.OtapFs.p = pe; | 
					
						
							|  |  |  |     code->y_u.OtapFs.s = Arity; | 
					
						
							|  |  |  |     code->y_u.OtapFs.extra = Extra; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #ifdef YAPOR
 | 
					
						
							|  |  |  |     INIT_YAMOP_LTT(code, 1); | 
					
						
							|  |  |  |     PUT_YAMOP_SEQ(code); | 
					
						
							|  |  |  | #endif /* YAPOR */
 | 
					
						
							| 
									
										
										
										
											2008-09-05 05:22:19 +01:00
										 |  |  |     code = NEXTOP(code,OtapFs); | 
					
						
							| 
									
										
										
										
											2005-11-18 18:52:41 +00:00
										 |  |  |     if (flags & UserCPredFlag) | 
					
						
							|  |  |  |       code->opc = Yap_opcode(_cut_userc); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       code->opc = Yap_opcode(_cut_c); | 
					
						
							| 
									
										
										
										
											2014-05-30 01:06:09 +01:00
										 |  |  |     code->y_u.OtapFs.f = Cut; | 
					
						
							|  |  |  |     code->y_u.OtapFs.p = pe; | 
					
						
							|  |  |  |     code->y_u.OtapFs.s = Arity; | 
					
						
							|  |  |  |     code->y_u.OtapFs.extra = Extra; | 
					
						
							| 
									
										
										
										
											2008-09-05 05:22:19 +01:00
										 |  |  |     code = NEXTOP(code,OtapFs); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     code->opc = Yap_opcode(_Ystop); | 
					
						
							| 
									
										
										
										
											2014-05-30 01:06:09 +01:00
										 |  |  |     code->y_u.l.l = cl->ClCode; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void  | 
					
						
							|  |  |  | InitStdPreds(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2013-03-19 21:25:46 -05:00
										 |  |  |   void initIO(void); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   Yap_InitCPreds(); | 
					
						
							|  |  |  |   Yap_InitBackCPreds(); | 
					
						
							| 
									
										
										
										
											2013-01-21 09:36:08 +00:00
										 |  |  |   BACKUP_MACHINE_REGS(); | 
					
						
							|  |  |  |   Yap_InitYaamRegs( 0 ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if HAVE_MPE
 | 
					
						
							|  |  |  |   Yap_InitMPE (); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |   initIO(); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | InitFlags(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2004-12-02 06:06:47 +00:00
										 |  |  |   /* note that Yap_heap_regs must be set first */ | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   yap_flags[LANGUAGE_MODE_FLAG] = 0; | 
					
						
							|  |  |  |   yap_flags[SOURCE_MODE_FLAG] = FALSE; | 
					
						
							|  |  |  |   yap_flags[WRITE_QUOTED_STRING_FLAG] = FALSE; | 
					
						
							| 
									
										
										
										
											2011-04-29 19:29:22 +01:00
										 |  |  |   /* we do not garantee safe assert in parallel mode */ | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   yap_flags[ALLOW_ASSERTING_STATIC_FLAG] = TRUE; | 
					
						
							| 
									
										
										
										
											2003-06-06 11:54:02 +00:00
										 |  |  |   /* current default */ | 
					
						
							|  |  |  |   yap_flags[INDEXING_MODE_FLAG] = INDEX_MODE_MULTI; | 
					
						
							| 
									
										
										
										
											2005-07-06 19:34:12 +00:00
										 |  |  |   yap_flags[TABLING_MODE_FLAG] = 0; | 
					
						
							| 
									
										
										
										
											2008-03-13 18:41:52 +00:00
										 |  |  |   yap_flags[QUIET_MODE_FLAG] = FALSE; | 
					
						
							| 
									
										
										
										
											2012-06-01 13:16:29 +01:00
										 |  |  |   yap_flags[INDEXING_TERM_DEPTH_FLAG] = 0L; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 13:11:35 +00:00
										 |  |  | static void | 
					
						
							|  |  |  | InitPredHash(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   UInt i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   PredHash = (PredEntry **)Yap_AllocAtomSpace(sizeof(PredEntry **) * PredHashInitialSize); | 
					
						
							|  |  |  |   PredHashTableSize = PredHashInitialSize; | 
					
						
							|  |  |  |   if (PredHash == NULL) { | 
					
						
							|  |  |  |     Yap_Error(FATAL_ERROR,MkIntTerm(0),"allocating initial predicate hash table"); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   for (i = 0; i < PredHashTableSize; ++i) { | 
					
						
							|  |  |  |     PredHash[i] = NULL; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   INIT_RWLOCK(PredHashRWLock); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | InitEnvInst(yamop start[2], yamop **instp, op_numbers opc, PredEntry *pred) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   yamop *ipc = start; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* make it look like the instruction is preceeded by a call instruction */ | 
					
						
							|  |  |  |   ipc->opc = Yap_opcode(_call); | 
					
						
							| 
									
										
										
										
											2014-05-30 01:06:09 +01:00
										 |  |  |   ipc->y_u.Osbpp.s = -Signed(RealEnvSize); | 
					
						
							|  |  |  |   ipc->y_u.Osbpp.bmap = NULL; | 
					
						
							|  |  |  |   ipc->y_u.Osbpp.p = pred; | 
					
						
							|  |  |  |   ipc->y_u.Osbpp.p0 = pred; | 
					
						
							| 
									
										
										
										
											2009-10-28 13:11:35 +00:00
										 |  |  |   ipc = NEXTOP(ipc, Osbpp); | 
					
						
							|  |  |  |   ipc->opc = Yap_opcode(opc); | 
					
						
							|  |  |  |   *instp = ipc; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2009-10-30 23:59:00 +00:00
										 |  |  | InitOtaplInst(yamop start[1], OPCODE opc, PredEntry *pe) | 
					
						
							| 
									
										
										
										
											2009-10-28 13:11:35 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   yamop *ipc = start; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* this is a place holder, it should not really be used */ | 
					
						
							|  |  |  |   ipc->opc = Yap_opcode(opc); | 
					
						
							| 
									
										
										
										
											2014-05-30 01:06:09 +01:00
										 |  |  |   ipc->y_u.Otapl.s = 0; | 
					
						
							|  |  |  |   ipc->y_u.Otapl.p = pe; | 
					
						
							|  |  |  |   ipc->y_u.Otapl.d = NULL; | 
					
						
							| 
									
										
										
										
											2009-10-28 13:11:35 +00:00
										 |  |  | #ifdef YAPOR
 | 
					
						
							|  |  |  |   INIT_YAMOP_LTT(ipc, 1); | 
					
						
							|  |  |  | #endif /* YAPOR */
 | 
					
						
							|  |  |  | #ifdef TABLING
 | 
					
						
							| 
									
										
										
										
											2014-05-30 01:06:09 +01:00
										 |  |  |   ipc->y_u.Otapl.te = NULL; | 
					
						
							| 
									
										
										
										
											2009-10-28 13:11:35 +00:00
										 |  |  | #endif /* TABLING */
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 15:53:23 +00:00
										 |  |  | static void  | 
					
						
							|  |  |  | InitDBErasedMarker(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Yap_heap_regs->db_erased_marker = | 
					
						
							|  |  |  |     (DBRef)Yap_AllocCodeSpace(sizeof(DBStruct)); | 
					
						
							|  |  |  |   Yap_LUClauseSpace += sizeof(DBStruct); | 
					
						
							|  |  |  |   Yap_heap_regs->db_erased_marker->id = FunctorDBRef; | 
					
						
							|  |  |  |   Yap_heap_regs->db_erased_marker->Flags = ErasedMask; | 
					
						
							|  |  |  |   Yap_heap_regs->db_erased_marker->Code = NULL; | 
					
						
							|  |  |  |   Yap_heap_regs->db_erased_marker->DBT.DBRefs = NULL; | 
					
						
							|  |  |  |   Yap_heap_regs->db_erased_marker->Parent = NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void  | 
					
						
							|  |  |  | InitLogDBErasedMarker(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Yap_heap_regs->logdb_erased_marker = | 
					
						
							|  |  |  |     (LogUpdClause *)Yap_AllocCodeSpace(sizeof(LogUpdClause)+(UInt)NEXTOP((yamop*)NULL,e)); | 
					
						
							|  |  |  |   Yap_LUClauseSpace += sizeof(LogUpdClause)+(UInt)NEXTOP((yamop*)NULL,e); | 
					
						
							|  |  |  |   Yap_heap_regs->logdb_erased_marker->Id = FunctorDBRef; | 
					
						
							|  |  |  |   Yap_heap_regs->logdb_erased_marker->ClFlags = ErasedMask|LogUpdMask; | 
					
						
							| 
									
										
										
										
											2013-11-05 17:59:19 +00:00
										 |  |  |   Yap_heap_regs->logdb_erased_marker->lusl.ClSource = NULL; | 
					
						
							| 
									
										
										
										
											2009-10-28 15:53:23 +00:00
										 |  |  |   Yap_heap_regs->logdb_erased_marker->ClRefCount = 0; | 
					
						
							|  |  |  |   Yap_heap_regs->logdb_erased_marker->ClExt = NULL; | 
					
						
							|  |  |  |   Yap_heap_regs->logdb_erased_marker->ClPrev = NULL; | 
					
						
							|  |  |  |   Yap_heap_regs->logdb_erased_marker->ClNext = NULL; | 
					
						
							|  |  |  |   Yap_heap_regs->logdb_erased_marker->ClSize = (UInt)NEXTOP(((LogUpdClause *)NULL)->ClCode,e); | 
					
						
							|  |  |  |   Yap_heap_regs->logdb_erased_marker->ClCode->opc = Yap_opcode(_op_fail); | 
					
						
							|  |  |  |   INIT_CLREF_COUNT(Yap_heap_regs->logdb_erased_marker); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-03 14:26:56 +01:00
										 |  |  | static void  | 
					
						
							|  |  |  | InitSWIAtoms(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2013-01-15 16:51:55 +00:00
										 |  |  |   extern atom_t ATOM_; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-08 13:04:30 +01:00
										 |  |  |   int j=0; | 
					
						
							|  |  |  |   MaxAtomTranslations = 2*N_SWI_ATOMS ; | 
					
						
							|  |  |  |   SWI_Atoms = (Atom *)malloc(sizeof(Atom)*MaxAtomTranslations); | 
					
						
							| 
									
										
										
										
											2010-05-03 14:26:56 +01:00
										 |  |  | #include "iswiatoms.h"
 | 
					
						
							|  |  |  |   Yap_InitSWIHash(); | 
					
						
							| 
									
										
										
										
											2013-01-15 16:51:55 +00:00
										 |  |  |   ATOM_ = PL_new_atom(""); | 
					
						
							| 
									
										
										
										
											2010-05-03 14:26:56 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-30 15:23:01 -05:00
										 |  |  | static void  | 
					
						
							|  |  |  | InitEmptyWakeups(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | static void  | 
					
						
							| 
									
										
										
										
											2009-10-30 23:59:00 +00:00
										 |  |  | InitAtoms(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   int i; | 
					
						
							|  |  |  |   AtomHashTableSize = MaxHash; | 
					
						
							|  |  |  |   HashChain = (AtomHashEntry *)Yap_AllocAtomSpace(sizeof(AtomHashEntry) * MaxHash); | 
					
						
							|  |  |  |   if (HashChain == NULL) { | 
					
						
							|  |  |  |     Yap_Error(FATAL_ERROR,MkIntTerm(0),"allocating initial atom table"); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   for (i = 0; i < MaxHash; ++i) { | 
					
						
							|  |  |  |     INIT_RWLOCK(HashChain[i].AERWLock); | 
					
						
							|  |  |  |     HashChain[i].Entry = NIL; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   NOfAtoms = 0; | 
					
						
							|  |  |  | #if THREADS
 | 
					
						
							|  |  |  |   SF_STORE->AtFoundVar = Yap_LookupAtom("**"); | 
					
						
							|  |  |  |   Yap_ReleaseAtom(AtomFoundVar); | 
					
						
							|  |  |  |   SF_STORE->AtFreeTerm = Yap_LookupAtom("?"); | 
					
						
							|  |  |  |   Yap_ReleaseAtom(AtomFreeTerm); | 
					
						
							|  |  |  |   SF_STORE->AtNil = Yap_LookupAtom("[]"); | 
					
						
							|  |  |  |   SF_STORE->AtDot = Yap_LookupAtom("."); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |   Yap_LookupAtomWithAddress("**",&(SF_STORE->AtFoundVar)); | 
					
						
							|  |  |  |   Yap_ReleaseAtom(AtomFoundVar); | 
					
						
							|  |  |  |   Yap_LookupAtomWithAddress("?",&(SF_STORE->AtFreeTerm)); | 
					
						
							|  |  |  |   Yap_ReleaseAtom(AtomFreeTerm); | 
					
						
							|  |  |  |   Yap_LookupAtomWithAddress("[]",&(SF_STORE->AtNil)); | 
					
						
							|  |  |  |   Yap_LookupAtomWithAddress(".",&(SF_STORE->AtDot)); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void  | 
					
						
							|  |  |  | InitWideAtoms(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   WideAtomHashTableSize = MaxWideHash; | 
					
						
							|  |  |  |   WideHashChain = (AtomHashEntry *)Yap_AllocAtomSpace(sizeof(AtomHashEntry) * MaxWideHash); | 
					
						
							|  |  |  |   if (WideHashChain == NULL) { | 
					
						
							|  |  |  |     Yap_Error(FATAL_ERROR,MkIntTerm(0),"allocating wide atom table"); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   for (i = 0; i < MaxWideHash; ++i) { | 
					
						
							|  |  |  |     INIT_RWLOCK(WideHashChain[i].AERWLock); | 
					
						
							|  |  |  |     WideHashChain[i].Entry = NIL; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   NOfWideAtoms = 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void  | 
					
						
							|  |  |  | InitInvisibleAtoms(void) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-03-24 13:27:36 +00:00
										 |  |  |   /* initialise invisible chain */ | 
					
						
							|  |  |  |   Yap_heap_regs->invisiblechain.Entry = NIL; | 
					
						
							|  |  |  |   INIT_RWLOCK(Yap_heap_regs->invisiblechain.AERWLock); | 
					
						
							| 
									
										
										
										
											2009-10-30 23:59:00 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-09 19:36:51 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef YAPOR
 | 
					
						
							| 
									
										
										
										
											2011-06-01 18:51:12 +01:00
										 |  |  | void Yap_init_yapor_workers(void) { | 
					
						
							| 
									
										
										
										
											2011-05-09 19:36:51 +01:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   int proc; | 
					
						
							|  |  |  | #ifdef YAPOR_THREADS
 | 
					
						
							|  |  |  |   return; | 
					
						
							|  |  |  | #endif /* YAPOR_THREADS */
 | 
					
						
							|  |  |  | #ifdef YAPOR_COW
 | 
					
						
							| 
									
										
										
										
											2011-06-02 17:01:00 +01:00
										 |  |  |   GLOBAL_master_worker = getpid(); | 
					
						
							| 
									
										
										
										
											2011-05-10 11:47:18 +01:00
										 |  |  |   if (GLOBAL_number_workers > 1) { | 
					
						
							| 
									
										
										
										
											2011-05-09 19:36:51 +01:00
										 |  |  |     int son; | 
					
						
							|  |  |  |     son = fork(); | 
					
						
							|  |  |  |     if (son == -1) | 
					
						
							| 
									
										
										
										
											2011-06-01 18:51:12 +01:00
										 |  |  |       Yap_Error(FATAL_ERROR, TermNil, "fork error (Yap_init_yapor_workers)"); | 
					
						
							| 
									
										
										
										
											2011-05-09 19:36:51 +01:00
										 |  |  |     if (son > 0) { | 
					
						
							|  |  |  |       /* I am the father, I must stay here and wait for my children to all die */ | 
					
						
							|  |  |  |       struct sigaction sigact; | 
					
						
							|  |  |  |       sigact.sa_handler = SIG_DFL; | 
					
						
							|  |  |  |       sigemptyset(&sigact.sa_mask); | 
					
						
							|  |  |  |       sigact.sa_flags = SA_RESTART; | 
					
						
							|  |  |  |       sigaction(SIGINT, &sigact, NULL); | 
					
						
							|  |  |  |       pause(); | 
					
						
							|  |  |  |       exit(0); | 
					
						
							|  |  |  |     } else | 
					
						
							| 
									
										
										
										
											2011-05-10 11:47:18 +01:00
										 |  |  |       GLOBAL_worker_pid(0) = getpid(); | 
					
						
							| 
									
										
										
										
											2011-05-09 19:36:51 +01:00
										 |  |  |   } | 
					
						
							|  |  |  | #endif /* YAPOR_COW */
 | 
					
						
							| 
									
										
										
										
											2011-05-10 11:47:18 +01:00
										 |  |  |   for (proc = 1; proc < GLOBAL_number_workers; proc++) { | 
					
						
							| 
									
										
										
										
											2011-05-09 19:36:51 +01:00
										 |  |  |     int son; | 
					
						
							|  |  |  |     son = fork(); | 
					
						
							|  |  |  |     if (son == -1) | 
					
						
							| 
									
										
										
										
											2011-06-01 18:51:12 +01:00
										 |  |  |       Yap_Error(FATAL_ERROR, TermNil, "fork error (Yap_init_yapor_workers)"); | 
					
						
							| 
									
										
										
										
											2011-05-09 19:36:51 +01:00
										 |  |  |     if (son == 0) {  | 
					
						
							|  |  |  |       /* new worker */ | 
					
						
							|  |  |  |       worker_id = proc; | 
					
						
							| 
									
										
										
										
											2011-06-02 17:01:00 +01:00
										 |  |  |       Yap_remap_yapor_memory(); | 
					
						
							| 
									
										
										
										
											2011-05-09 19:36:51 +01:00
										 |  |  |       LOCAL = REMOTE(worker_id); | 
					
						
							| 
									
										
										
										
											2011-06-02 17:01:00 +01:00
										 |  |  |       memcpy(REMOTE(worker_id), REMOTE(0), sizeof(struct worker_local)); | 
					
						
							| 
									
										
										
										
											2011-05-09 19:36:51 +01:00
										 |  |  |       InitWorker(worker_id); | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     } else | 
					
						
							| 
									
										
										
										
											2011-05-10 11:47:18 +01:00
										 |  |  |       GLOBAL_worker_pid(proc) = son; | 
					
						
							| 
									
										
										
										
											2011-05-09 19:36:51 +01:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif /* YAPOR */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-23 02:23:51 +00:00
										 |  |  | #ifdef  THREADS
 | 
					
						
							| 
									
										
										
										
											2010-06-19 14:38:04 +01:00
										 |  |  | static void | 
					
						
							|  |  |  | InitThreadHandle(int wid) | 
					
						
							| 
									
										
										
										
											2009-10-30 23:59:00 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-05-09 20:19:49 +01:00
										 |  |  |   REMOTE_ThreadHandle(wid).in_use = FALSE; | 
					
						
							|  |  |  |   REMOTE_ThreadHandle(wid).zombie = FALSE; | 
					
						
							|  |  |  |   REMOTE_ThreadHandle(wid).local_preds = NULL; | 
					
						
							| 
									
										
										
										
											2008-05-10 23:24:13 +00:00
										 |  |  | #ifdef LOW_LEVEL_TRACER
 | 
					
						
							| 
									
										
										
										
											2011-05-09 20:19:49 +01:00
										 |  |  |   REMOTE_ThreadHandle(wid).thread_inst_count = 0LL; | 
					
						
							| 
									
										
										
										
											2008-05-10 23:24:13 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2011-05-09 20:19:49 +01:00
										 |  |  |   pthread_mutex_init(&(REMOTE_ThreadHandle(wid).tlock), NULL);   | 
					
						
							|  |  |  |   pthread_mutex_init(&(REMOTE_ThreadHandle(wid).tlock_status), NULL);   | 
					
						
							|  |  |  |   REMOTE_ThreadHandle(wid).tdetach = (CELL)0; | 
					
						
							|  |  |  |   REMOTE_ThreadHandle(wid).cmod = (CELL)0; | 
					
						
							| 
									
										
										
										
											2009-10-30 23:59:00 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2011-03-11 19:49:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | int | 
					
						
							|  |  |  | Yap_InitThread(int new_id) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   struct worker_local *new_s; | 
					
						
							|  |  |  |   if (new_id) { | 
					
						
							|  |  |  |     if (!(new_s = (struct worker_local *)calloc(sizeof(struct worker_local), 1))) | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							| 
									
										
										
										
											2011-05-09 19:36:51 +01:00
										 |  |  |     Yap_local[new_id] = new_s; | 
					
						
							| 
									
										
										
										
											2013-09-17 00:26:37 +01:00
										 |  |  |     if (!((REGSTORE *)pthread_getspecific(Yap_yaamregs_key))) { | 
					
						
							|  |  |  |       REGSTORE *rs = (REGSTORE *)calloc(sizeof(REGSTORE),1); | 
					
						
							|  |  |  |       pthread_setspecific(Yap_yaamregs_key, (const void *)rs); | 
					
						
							|  |  |  |       REMOTE_ThreadHandle(new_id).default_yaam_regs = rs; | 
					
						
							| 
									
										
										
										
											2013-11-15 01:10:25 +00:00
										 |  |  |       REMOTE_ThreadHandle(new_id).current_yaam_regs = rs; | 
					
						
							| 
									
										
										
										
											2013-09-17 00:26:37 +01:00
										 |  |  |       rs->worker_id_ = new_id; | 
					
						
							|  |  |  |       rs->worker_local_ = REMOTE(new_id); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-03-11 19:49:32 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   InitWorker(new_id); | 
					
						
							|  |  |  |   return TRUE; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-03-25 16:45:53 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2009-10-30 23:59:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-21 22:12:42 +00:00
										 |  |  | static void | 
					
						
							|  |  |  | InitScratchPad(int wid) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-05-09 20:19:49 +01:00
										 |  |  |   REMOTE_ScratchPad(wid).ptr = NULL; | 
					
						
							|  |  |  |   REMOTE_ScratchPad(wid).sz = SCRATCH_START_SIZE; | 
					
						
							|  |  |  |   REMOTE_ScratchPad(wid).msz = SCRATCH_START_SIZE; | 
					
						
							| 
									
										
										
										
											2010-03-21 22:12:42 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | Yap_CloseScratchPad(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   Yap_FreeCodeSpace(LOCAL_ScratchPad.ptr); | 
					
						
							|  |  |  |   LOCAL_ScratchPad.sz = SCRATCH_START_SIZE; | 
					
						
							|  |  |  |   LOCAL_ScratchPad.msz = SCRATCH_START_SIZE; | 
					
						
							| 
									
										
										
										
											2010-03-21 22:12:42 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "iglobals.h"
 | 
					
						
							| 
									
										
										
										
											2011-03-23 16:45:47 +00:00
										 |  |  | #include "ilocals.h"
 | 
					
						
							| 
									
										
										
										
											2010-03-21 22:12:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-30 23:59:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-29 14:59:17 +01:00
										 |  |  | #if defined(YAPOR_COPY) || defined(YAPOR_COW) || defined(YAPOR_SBA)
 | 
					
						
							| 
									
										
										
										
											2011-03-25 18:01:17 +00:00
										 |  |  | struct global_data *Yap_global; | 
					
						
							| 
									
										
										
										
											2011-04-14 19:19:13 +01:00
										 |  |  | long Yap_worker_area_size; | 
					
						
							| 
									
										
										
										
											2010-10-15 02:06:37 +01:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2011-03-25 18:01:17 +00:00
										 |  |  | struct global_data Yap_Global; | 
					
						
							| 
									
										
										
										
											2010-10-15 02:06:37 +01:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-03-21 22:12:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-24 16:47:34 +00:00
										 |  |  | #if defined(THREADS)
 | 
					
						
							| 
									
										
										
										
											2011-05-09 19:36:51 +01:00
										 |  |  | struct worker_local	*Yap_local[MAX_THREADS]; | 
					
						
							| 
									
										
										
										
											2011-03-24 16:47:34 +00:00
										 |  |  | #elif defined(YAPOR)
 | 
					
						
							| 
									
										
										
										
											2011-05-09 19:36:51 +01:00
										 |  |  | struct worker_local	*Yap_local; | 
					
						
							| 
									
										
										
										
											2011-04-28 09:48:42 +01:00
										 |  |  | #else /* !THREADS && !YAPOR */
 | 
					
						
							| 
									
										
										
										
											2011-05-09 19:36:51 +01:00
										 |  |  | struct worker_local	Yap_local; | 
					
						
							| 
									
										
										
										
											2010-03-21 22:12:42 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void  | 
					
						
							|  |  |  | InitCodes(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2011-03-11 19:49:32 +00:00
										 |  |  | #if THREADS
 | 
					
						
							| 
									
										
										
										
											2011-03-21 17:07:58 +00:00
										 |  |  |   int wid; | 
					
						
							| 
									
										
										
										
											2011-03-24 16:17:18 +00:00
										 |  |  |   for (wid = 1; wid < MAX_THREADS; wid++) { | 
					
						
							| 
									
										
										
										
											2011-05-09 19:36:51 +01:00
										 |  |  |     Yap_local[wid] = NULL; | 
					
						
							| 
									
										
										
										
											2011-03-11 19:49:32 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-03-21 22:12:42 +00:00
										 |  |  | #include "ihstruct.h"
 | 
					
						
							| 
									
										
										
										
											2011-03-11 23:21:23 +00:00
										 |  |  | #if THREADS
 | 
					
						
							| 
									
										
										
										
											2011-03-11 19:49:32 +00:00
										 |  |  |   Yap_InitThread(0); | 
					
						
							| 
									
										
										
										
											2011-07-26 15:51:52 +01:00
										 |  |  | #endif /* THREADS */
 | 
					
						
							| 
									
										
										
										
											2010-03-21 22:12:42 +00:00
										 |  |  |   InitGlobal(); | 
					
						
							| 
									
										
										
										
											2011-07-26 15:51:52 +01:00
										 |  |  | #if !THREADS
 | 
					
						
							| 
									
										
										
										
											2011-03-11 19:49:32 +00:00
										 |  |  |   InitWorker(0); | 
					
						
							| 
									
										
										
										
											2011-07-26 15:51:52 +01:00
										 |  |  | #endif /* THREADS */
 | 
					
						
							| 
									
										
										
										
											2013-11-13 10:38:20 +00:00
										 |  |  |   Yap_InitFirstWorkerThreadHandle(); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   /* make sure no one else can use these two atoms */ | 
					
						
							| 
									
										
										
										
											2013-11-13 10:38:20 +00:00
										 |  |  |   LOCAL_SourceModule = CurrentModule = 0; | 
					
						
							| 
									
										
										
										
											2010-03-21 22:12:42 +00:00
										 |  |  |   Yap_ReleaseAtom(AtomOfTerm(TermReFoundVar)); | 
					
						
							| 
									
										
										
										
											2002-03-08 06:31:32 +00:00
										 |  |  |   /* make sure we have undefp defined */ | 
					
						
							| 
									
										
										
										
											2002-05-10 15:04:03 +00:00
										 |  |  |   /* predicates can only be defined after this point */ | 
					
						
							| 
									
										
										
										
											2001-11-15 00:01:43 +00:00
										 |  |  |   { | 
					
						
							|  |  |  |     /* make sure we know about the module predicate */ | 
					
						
							| 
									
										
										
										
											2008-12-23 01:53:52 +00:00
										 |  |  |     PredEntry *modp = RepPredProp(PredPropByFunc(FunctorModule,PROLOG_MODULE)); | 
					
						
							| 
									
										
										
										
											2001-11-15 00:01:43 +00:00
										 |  |  |     modp->PredFlags |= MetaPredFlag; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2002-05-10 15:04:03 +00:00
										 |  |  | #ifdef YAPOR
 | 
					
						
							| 
									
										
										
										
											2014-05-30 01:06:09 +01:00
										 |  |  |   Yap_heap_regs->getwork_code->y_u.Otapl.p = RepPredProp(PredPropByAtom(AtomGetwork, PROLOG_MODULE)); | 
					
						
							|  |  |  |   Yap_heap_regs->getwork_seq_code->y_u.Otapl.p = RepPredProp(PredPropByAtom(AtomGetworkSeq, PROLOG_MODULE)); | 
					
						
							| 
									
										
										
										
											2005-07-06 19:34:12 +00:00
										 |  |  | #endif /* YAPOR */
 | 
					
						
							| 
									
										
										
										
											2009-10-28 15:53:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-06-04 00:46:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | static void  | 
					
						
							|  |  |  | InitVersion(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-23 01:53:52 +00:00
										 |  |  |   Yap_PutValue(AtomVersionNumber, | 
					
						
							| 
									
										
										
										
											2014-02-16 12:57:00 +00:00
										 |  |  | 	       MkAtomTerm(Yap_LookupAtom(YAP_FULL_VERSION))); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void | 
					
						
							| 
									
										
										
										
											2009-03-27 15:15:54 +00:00
										 |  |  | Yap_InitWorkspace(UInt Heap, UInt Stack, UInt Trail, UInt Atts, UInt max_table_size,  | 
					
						
							| 
									
										
										
										
											2005-08-04 15:45:56 +00:00
										 |  |  |                   int n_workers, int sch_loop, int delay_load) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   int             i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* initialise system stuff */ | 
					
						
							|  |  |  | #if PUSH_REGS
 | 
					
						
							| 
									
										
										
										
											2004-01-23 02:23:51 +00:00
										 |  |  | #ifdef THREADS
 | 
					
						
							| 
									
										
										
										
											2011-05-09 19:36:51 +01:00
										 |  |  |   if (!(Yap_local[0] = (struct worker_local *)calloc(sizeof(struct worker_local), 1))) | 
					
						
							| 
									
										
										
										
											2011-03-11 19:49:32 +00:00
										 |  |  |     return; | 
					
						
							| 
									
										
										
										
											2004-02-06 17:22:24 +00:00
										 |  |  |   pthread_key_create(&Yap_yaamregs_key, NULL); | 
					
						
							|  |  |  |   pthread_setspecific(Yap_yaamregs_key, (const void *)&Yap_standard_regs); | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   GLOBAL_master_thread = pthread_self(); | 
					
						
							| 
									
										
										
										
											2004-01-23 02:23:51 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  |   /* In this case we need to initialise the abstract registers */ | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   Yap_regp = &Yap_standard_regs; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   /* the emulator will eventually copy them to its own local
 | 
					
						
							|  |  |  |      register array, but for now they exist */ | 
					
						
							| 
									
										
										
										
											2004-01-23 02:23:51 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #endif /* PUSH_REGS */
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-21 22:14:29 +00:00
										 |  |  | #ifdef THREADS
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   Yap_regp = ((REGSTORE *)pthread_getspecific(Yap_yaamregs_key)); | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   LOCAL = REMOTE(0); | 
					
						
							| 
									
										
										
										
											2011-05-09 19:36:51 +01:00
										 |  |  | #endif /* THREADS */
 | 
					
						
							| 
									
										
										
										
											2011-10-13 15:04:16 +01:00
										 |  |  | #if defined(YAPOR_COPY) || defined(YAPOR_COW) || defined(YAPOR_SBA)
 | 
					
						
							|  |  |  |   LOCAL = REMOTE(0); | 
					
						
							|  |  |  | #endif /* YAPOR_COPY || YAPOR_COW || YAPOR_SBA */
 | 
					
						
							| 
									
										
										
										
											2008-03-25 16:45:53 +00:00
										 |  |  |   if (Heap < MinHeapSpace) | 
					
						
							|  |  |  |     Heap = MinHeapSpace; | 
					
						
							|  |  |  |   Heap = AdjustPageSize(Heap * K); | 
					
						
							| 
									
										
										
										
											2013-03-19 21:25:46 -05:00
										 |  |  |   Heap /= (K); | 
					
						
							| 
									
										
										
										
											2008-03-25 16:45:53 +00:00
										 |  |  |   /* sanity checking for data areas */ | 
					
						
							|  |  |  |   if (Trail < MinTrailSpace) | 
					
						
							|  |  |  |     Trail = MinTrailSpace; | 
					
						
							|  |  |  |   Trail = AdjustPageSize(Trail * K); | 
					
						
							| 
									
										
										
										
											2013-03-19 21:25:46 -05:00
										 |  |  |   Trail /= (K); | 
					
						
							| 
									
										
										
										
											2008-03-25 16:45:53 +00:00
										 |  |  |   if (Stack < MinStackSpace) | 
					
						
							|  |  |  |     Stack = MinStackSpace; | 
					
						
							|  |  |  |   Stack = AdjustPageSize(Stack * K); | 
					
						
							| 
									
										
										
										
											2013-03-19 21:25:46 -05:00
										 |  |  |   Stack /= (K); | 
					
						
							| 
									
										
										
										
											2009-05-01 12:11:52 -05:00
										 |  |  |   if (!Atts) | 
					
						
							|  |  |  |     Atts = 2048*sizeof(CELL); | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     Atts = AdjustPageSize(Atts * K); | 
					
						
							| 
									
										
										
										
											2013-03-19 21:25:46 -05:00
										 |  |  |   Atts /= (K); | 
					
						
							| 
									
										
										
										
											2013-10-04 18:18:57 +01:00
										 |  |  | #if defined(THREADS) || defined(YAPOR)
 | 
					
						
							| 
									
										
										
										
											2005-03-04 20:30:14 +00:00
										 |  |  |   worker_id = 0; | 
					
						
							| 
									
										
										
										
											2011-05-09 19:36:51 +01:00
										 |  |  | #endif /* YAPOR || THREADS */
 | 
					
						
							|  |  |  | #ifdef YAPOR
 | 
					
						
							| 
									
										
										
										
											2005-08-04 15:45:56 +00:00
										 |  |  |   if (n_workers > MAX_WORKERS) | 
					
						
							| 
									
										
										
										
											2011-04-29 14:59:17 +01:00
										 |  |  |     Yap_Error(INTERNAL_ERROR, TermNil, "excessive number of workers"); | 
					
						
							| 
									
										
										
										
											2011-03-30 14:35:10 +01:00
										 |  |  | #ifdef YAPOR_COPY
 | 
					
						
							| 
									
										
										
										
											2005-08-04 15:45:56 +00:00
										 |  |  |   INFORMATION_MESSAGE("YapOr: copy model with %d worker%s", n_workers, n_workers == 1 ? "":"s"); | 
					
						
							| 
									
										
										
										
											2011-03-30 16:39:09 +01:00
										 |  |  | #elif YAPOR_COW
 | 
					
						
							| 
									
										
										
										
											2005-08-04 15:45:56 +00:00
										 |  |  |   INFORMATION_MESSAGE("YapOr: acow model with %d worker%s", n_workers, n_workers == 1 ? "":"s"); | 
					
						
							| 
									
										
										
										
											2011-04-29 14:59:17 +01:00
										 |  |  | #elif YAPOR_SBA
 | 
					
						
							| 
									
										
										
										
											2005-08-04 15:45:56 +00:00
										 |  |  |   INFORMATION_MESSAGE("YapOr: sba model with %d worker%s", n_workers, n_workers == 1 ? "":"s"); | 
					
						
							| 
									
										
										
										
											2011-04-29 14:59:17 +01:00
										 |  |  | #elif YAPOR_THREADS
 | 
					
						
							|  |  |  |   INFORMATION_MESSAGE("YapOr: threads model with %d worker%s", n_workers, n_workers == 1 ? "":"s"); | 
					
						
							|  |  |  | #endif /* YAPOR_COPY - YAPOR_COW - YAPOR_SBA - YAPOR_THREADS */
 | 
					
						
							|  |  |  | #endif /* YAPOR */
 | 
					
						
							|  |  |  | #if defined(YAPOR_COPY) || defined(YAPOR_COW) || defined(YAPOR_SBA)
 | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |   Yap_init_yapor_stacks_memory(Trail, Heap, Stack+Atts, n_workers); | 
					
						
							| 
									
										
										
										
											2005-03-04 20:30:14 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2011-05-09 19:36:51 +01:00
										 |  |  |   Yap_InitMemory(Trail, Heap, Stack+Atts); | 
					
						
							| 
									
										
										
										
											2011-04-29 14:59:17 +01:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2005-03-04 20:30:14 +00:00
										 |  |  | #if defined(YAPOR) || defined(TABLING)
 | 
					
						
							| 
									
										
										
										
											2011-05-09 19:36:51 +01:00
										 |  |  |   Yap_init_global_optyap_data(max_table_size, n_workers, sch_loop, delay_load); | 
					
						
							| 
									
										
										
										
											2003-12-18 16:38:40 +00:00
										 |  |  | #endif /* YAPOR || TABLING */
 | 
					
						
							| 
									
										
										
										
											2004-03-02 16:44:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-09 19:36:51 +01:00
										 |  |  |   Yap_AttsSize = Atts; | 
					
						
							| 
									
										
										
										
											2012-12-11 22:07:10 +00:00
										 |  |  |   Yap_InitTime( 0 ); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   /* InitAbsmi must be done before InitCodes */ | 
					
						
							| 
									
										
										
										
											2007-02-18 00:26:36 +00:00
										 |  |  |   /* This must be done before initialising predicates */ | 
					
						
							| 
									
										
										
										
											2013-01-09 09:20:41 +00:00
										 |  |  |   for (i = 0; i < NUMBER_OF_YAP_FLAGS; i++) { | 
					
						
							| 
									
										
										
										
											2007-02-18 00:26:36 +00:00
										 |  |  |     yap_flags[i] = 0; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #ifdef MPW
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   Yap_InitAbsmi(REGS, FunctorList); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   Yap_InitAbsmi(); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  |   InitCodes(); | 
					
						
							|  |  |  |   InitOps(); | 
					
						
							|  |  |  |   InitDebug(); | 
					
						
							|  |  |  |   InitVersion(); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   Yap_InitSysPath(); | 
					
						
							| 
									
										
										
										
											2013-01-21 09:36:08 +00:00
										 |  |  | #if THREADS
 | 
					
						
							|  |  |  |   /* make sure we use the correct value of regcache */ | 
					
						
							|  |  |  |   regcache =  ((REGSTORE *)pthread_getspecific(Yap_yaamregs_key)); | 
					
						
							| 
									
										
										
										
											2013-11-15 01:10:25 +00:00
										 |  |  |   LOCAL_PL_local_data_p->reg_cache = regcache; | 
					
						
							| 
									
										
										
										
											2013-01-21 09:36:08 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #if USE_SYSTEM_MALLOC
 | 
					
						
							|  |  |  |   if (Trail < MinTrailSpace) | 
					
						
							|  |  |  |     Trail = MinTrailSpace; | 
					
						
							|  |  |  |   if (Stack < MinStackSpace) | 
					
						
							|  |  |  |     Stack = MinStackSpace; | 
					
						
							|  |  |  |   if (!(LOCAL_GlobalBase = (ADDR)malloc((Trail+Stack)*1024))) { | 
					
						
							|  |  |  |     Yap_Error(RESOURCE_ERROR_MEMORY, 0, "could not allocate stack space for main thread"); | 
					
						
							|  |  |  |     Yap_exit(1); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | #if THREADS
 | 
					
						
							|  |  |  |   /* don't forget this is a thread */ | 
					
						
							|  |  |  |   LOCAL_ThreadHandle.stack_address =  LOCAL_GlobalBase; | 
					
						
							| 
									
										
										
										
											2013-11-05 17:59:19 +00:00
										 |  |  |   LOCAL_ThreadHandle.tsize =  Trail; | 
					
						
							|  |  |  |   LOCAL_ThreadHandle.ssize =  Stack; | 
					
						
							| 
									
										
										
										
											2013-01-21 09:36:08 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |   GLOBAL_AllowGlobalExpansion = TRUE; | 
					
						
							|  |  |  |   GLOBAL_AllowLocalExpansion = TRUE; | 
					
						
							|  |  |  |   GLOBAL_AllowTrailExpansion = TRUE; | 
					
						
							|  |  |  |   Yap_InitExStacks (0, Trail, Stack); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   InitStdPreds(); | 
					
						
							| 
									
										
										
										
											2004-01-23 02:23:51 +00:00
										 |  |  |   /* make sure tmp area is available */ | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     Yap_ReleasePreAllocCodeSpace(Yap_PreAllocCodeSpace()); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-24 14:00:53 +01:00
										 |  |  | int | 
					
						
							|  |  |  | Yap_HaltRegisterHook (HaltHookFunc f, void * env) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   struct halt_hook *h; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!(h = (struct halt_hook *)Yap_AllocCodeSpace(sizeof(struct halt_hook)))) | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							|  |  |  |   h->environment = env; | 
					
						
							|  |  |  |   h->hook = f; | 
					
						
							| 
									
										
										
										
											2011-05-10 10:06:51 +01:00
										 |  |  |   LOCK(GLOBAL_BGL); | 
					
						
							|  |  |  |   h->next = GLOBAL_HaltHooks; | 
					
						
							|  |  |  |   GLOBAL_HaltHooks = h; | 
					
						
							|  |  |  |   UNLOCK(GLOBAL_BGL); | 
					
						
							| 
									
										
										
										
											2010-09-24 14:00:53 +01:00
										 |  |  |   return TRUE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | run_halt_hooks(int code) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-05-10 10:06:51 +01:00
										 |  |  |   struct halt_hook *hooke = GLOBAL_HaltHooks; | 
					
						
							| 
									
										
										
										
											2010-09-24 14:00:53 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   while (hooke) { | 
					
						
							|  |  |  |     hooke->hook(code, hooke->environment); | 
					
						
							|  |  |  |     hooke = hooke->next; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | void | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_exit (int value) | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2012-08-02 09:59:57 -05:00
										 |  |  |   void closeFiles(int all); | 
					
						
							| 
									
										
										
										
											2011-04-29 14:59:17 +01:00
										 |  |  | #if defined(YAPOR_COPY) || defined(YAPOR_COW) || defined(YAPOR_SBA)
 | 
					
						
							| 
									
										
										
										
											2011-06-02 17:01:00 +01:00
										 |  |  |   Yap_unmap_yapor_memory(); | 
					
						
							|  |  |  | #endif /* YAPOR_COPY || YAPOR_COW || YAPOR_SBA */
 | 
					
						
							| 
									
										
										
										
											2004-02-25 19:06:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   if (! (LOCAL_PrologMode & BootMode) ) { | 
					
						
							| 
									
										
										
										
											2004-02-25 19:06:31 +00:00
										 |  |  | #ifdef LOW_PROF
 | 
					
						
							| 
									
										
										
										
											2010-09-24 14:00:53 +01:00
										 |  |  |     remove("PROFPREDS"); | 
					
						
							|  |  |  |     remove("PROFILING"); | 
					
						
							| 
									
										
										
										
											2005-12-19 13:52:35 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-09-24 14:00:53 +01:00
										 |  |  |     run_halt_hooks(value); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_ShutdownLoadForeign(); | 
					
						
							| 
									
										
										
										
											2010-09-24 14:00:53 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2012-08-02 09:59:57 -05:00
										 |  |  |   closeFiles(TRUE); | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  |   exit(value); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 |