| 
									
										
										
										
											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:		grow.c							 * | 
					
						
							|  |  |  | * Last rev:	Thu Feb 23 1989		vv				 * | 
					
						
							|  |  |  | * mods:									 * | 
					
						
							|  |  |  | * comments:	Shifting the stacks       				 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | *************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-18 08:24:16 +00:00
										 |  |  | #include "absmi.h"
 | 
					
						
							| 
									
										
										
										
											2009-10-23 14:22:17 +01:00
										 |  |  | #include "YapHeap.h"
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #include "yapio.h"
 | 
					
						
							|  |  |  | #include "alloc.h"
 | 
					
						
							|  |  |  | #include "sshift.h"
 | 
					
						
							|  |  |  | #include "compile.h"
 | 
					
						
							| 
									
										
										
										
											2005-08-17 20:13:50 +00:00
										 |  |  | #include "attvar.h"
 | 
					
						
							| 
									
										
										
										
											2005-11-18 18:52:41 +00:00
										 |  |  | #include "cut_c.h"
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #if HAVE_STRING_H
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2011-04-18 14:59:17 +01:00
										 |  |  | #if YAPOR_THREADS
 | 
					
						
							| 
									
										
										
										
											2011-04-28 09:48:42 +01:00
										 |  |  | #include "opt.mavar.h"
 | 
					
						
							|  |  |  | #endif /* YAPOR_THREADS */
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-10 05:58:49 +00:00
										 |  |  | #if !HAVE_STRNCAT
 | 
					
						
							|  |  |  | #define strncat(s0,s1,sz)   strcat(s0,s1)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  | typedef enum { | 
					
						
							|  |  |  |   STACK_SHIFTING = 0, | 
					
						
							|  |  |  |   STACK_COPYING = 1, | 
					
						
							|  |  |  |   STACK_INCREMENTAL_COPYING = 2 | 
					
						
							|  |  |  | } what_stack_copying; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-10-28 01:16:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-25 17:15:04 -05:00
										 |  |  | static Int p_growheap( USES_REGS1 ); | 
					
						
							|  |  |  | static Int p_growstack( USES_REGS1 ); | 
					
						
							|  |  |  | static Int p_inform_trail_overflows( USES_REGS1 ); | 
					
						
							|  |  |  | static Int p_inform_heap_overflows( USES_REGS1 ); | 
					
						
							|  |  |  | static Int p_inform_stack_overflows( USES_REGS1 ); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* #define undf7  */ | 
					
						
							|  |  |  | /* #define undf5 */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-25 17:15:04 -05:00
										 |  |  | static int growstack(size_t CACHE_TYPE); | 
					
						
							|  |  |  | static void MoveGlobal( CACHE_TYPE1 ); | 
					
						
							|  |  |  | static void MoveLocalAndTrail( CACHE_TYPE1 ); | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  | static void SetHeapRegs(bool CACHE_TYPE); | 
					
						
							|  |  |  | static void AdjustTrail(bool, bool CACHE_TYPE); | 
					
						
							|  |  |  | static void AdjustLocal(bool CACHE_TYPE); | 
					
						
							|  |  |  | static void AdjustGlobal(Int, bool CACHE_TYPE); | 
					
						
							| 
									
										
										
										
											2013-04-25 17:15:04 -05:00
										 |  |  | static void AdjustGrowStack( CACHE_TYPE1 ); | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  | static int  static_growheap(size_t,bool,struct intermediates *,tr_fr_ptr *, TokEntry **, VarEntry ** CACHE_TYPE); | 
					
						
							| 
									
										
										
										
											2013-04-25 17:15:04 -05:00
										 |  |  | static void cpcellsd(CELL *, CELL *, CELL); | 
					
						
							|  |  |  | static CELL AdjustAppl(CELL CACHE_TYPE); | 
					
						
							|  |  |  | static CELL AdjustPair(CELL CACHE_TYPE); | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  | static void AdjustStacksAndTrail(Int, bool CACHE_TYPE); | 
					
						
							| 
									
										
										
										
											2013-04-25 17:15:04 -05:00
										 |  |  | static void AdjustRegs(int CACHE_TYPE); | 
					
						
							|  |  |  | static Term AdjustGlobTerm(Term CACHE_TYPE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-18 08:24:16 +00:00
										 |  |  | static void | 
					
						
							|  |  |  | LeaveGrowMode(prolog_exec_mode grow_mode) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   LOCAL_PrologMode &= ~grow_mode; | 
					
						
							| 
									
										
										
										
											2007-10-18 08:24:16 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | static void | 
					
						
							|  |  |  | cpcellsd(register CELL *Dest, register CELL *Org, CELL NOf) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | #if HAVE_MEMMOVE
 | 
					
						
							|  |  |  |   memmove((void *)Dest, (void *)Org, NOf*sizeof(CELL)); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |   register Int    n_of = NOf; | 
					
						
							|  |  |  |   for (; n_of >= 0; n_of--) | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  |     *Dest++ = *Org++; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  | SetHeapRegs(bool copying_threads USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  | #ifdef undf7
 | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |   Sfprintf(stderr,"HeapBase = %x\tHeapTop=%x\nGlobalBase=%x\tGlobalTop=%x\nLocalBase=%x\tLocatTop=%x\n", Yap_HeapBase, HeapTop, LOCAL_GlobalBase, H, LCL0, ASP); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  |   /* The old stack pointers */ | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   LOCAL_OldLCL0 = LCL0; | 
					
						
							|  |  |  |   LOCAL_OldASP = ASP; | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |   LOCAL_OldGlobalBase = (CELL *)LOCAL_GlobalBase; | 
					
						
							| 
									
										
										
										
											2014-01-19 21:15:05 +00:00
										 |  |  |   LOCAL_OldH = HR; | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   LOCAL_OldH0 = H0; | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |   LOCAL_OldTrailBase = LOCAL_TrailBase; | 
					
						
							|  |  |  |   LOCAL_OldTrailTop = LOCAL_TrailTop; | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   LOCAL_OldTR = TR; | 
					
						
							|  |  |  |   LOCAL_OldHeapBase = Yap_HeapBase; | 
					
						
							|  |  |  |   LOCAL_OldHeapTop = HeapTop; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   /* Adjust stack addresses */ | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |   LOCAL_TrailBase = TrailAddrAdjust(LOCAL_TrailBase); | 
					
						
							|  |  |  |   LOCAL_TrailTop = TrailAddrAdjust(LOCAL_TrailTop); | 
					
						
							| 
									
										
										
										
											2011-10-02 19:55:22 -03:00
										 |  |  |   CurrentTrailTop = (tr_fr_ptr)(LOCAL_TrailTop-MinTrailGap); | 
					
						
							| 
									
										
										
										
											2015-07-22 19:15:08 -05:00
										 |  |  |   LOCAL_GlobalBase = BaseAddrAdjust(LOCAL_GlobalBase); | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |   LOCAL_LocalBase = LocalAddrAdjust(LOCAL_LocalBase); | 
					
						
							| 
									
										
										
										
											2004-10-28 20:12:23 +00:00
										 |  |  | #if !USE_SYSTEM_MALLOC && !USE_DL_MALLOC
 | 
					
						
							| 
									
										
										
										
											2009-03-16 17:30:13 +00:00
										 |  |  |   AuxSp = PtoBaseAdjust(AuxSp); | 
					
						
							|  |  |  |   AuxTop = (ADDR)PtoBaseAdjust((CELL *)AuxTop); | 
					
						
							| 
									
										
										
										
											2004-02-06 16:40:50 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2007-02-18 00:26:36 +00:00
										 |  |  | #if !USE_SYSTEM_MALLOC
 | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |   if (HeapLim) | 
					
						
							| 
									
										
										
										
											2009-03-16 17:30:13 +00:00
										 |  |  |     HeapLim = BaseAddrAdjust(HeapLim); | 
					
						
							| 
									
										
										
										
											2007-02-18 00:26:36 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   /* The registers pointing to one of the stacks */ | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |   if (ENV) | 
					
						
							|  |  |  |     ENV = PtoLocAdjust(ENV); | 
					
						
							|  |  |  |   if (ASP) | 
					
						
							|  |  |  |     ASP = PtoLocAdjust(ASP); | 
					
						
							|  |  |  |   if (H0) | 
					
						
							|  |  |  |     H0 = PtoGloAdjust(H0); | 
					
						
							|  |  |  |   if (LCL0) | 
					
						
							|  |  |  |     LCL0 = PtoLocAdjust(LCL0); | 
					
						
							| 
									
										
										
										
											2014-01-19 21:15:05 +00:00
										 |  |  |   if (HR) | 
					
						
							|  |  |  |     HR = PtoGloAdjust(HR); | 
					
						
							| 
									
										
										
										
											2010-01-28 15:42:49 +00:00
										 |  |  |   if (Yap_REGS.CUT_C_TOP) | 
					
						
							|  |  |  |     Yap_REGS.CUT_C_TOP = CutCAdjust(Yap_REGS.CUT_C_TOP); | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |   if (HB) | 
					
						
							|  |  |  |     HB = PtoGloAdjust(HB); | 
					
						
							| 
									
										
										
										
											2011-12-30 16:04:16 +00:00
										 |  |  |   if (LOCAL_OpenArray) | 
					
						
							|  |  |  |     LOCAL_OpenArray = PtoGloAdjust(LOCAL_OpenArray); | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |   if (B) | 
					
						
							|  |  |  |     B = ChoicePtrAdjust(B); | 
					
						
							| 
									
										
										
										
											2013-12-17 15:57:24 +00:00
										 |  |  | #ifdef YAPOR_THREADS
 | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     choiceptr cpt; | 
					
						
							|  |  |  |     cpt = Get_LOCAL_top_cp(); | 
					
						
							|  |  |  |     if (cpt) { | 
					
						
							|  |  |  |       //      cpt = ChoicePtrAdjust( cpt );
 | 
					
						
							|  |  |  |       Set_LOCAL_top_cp( cpt ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #ifdef TABLING
 | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |   if (B_FZ) | 
					
						
							|  |  |  |     B_FZ = ChoicePtrAdjust(B_FZ); | 
					
						
							|  |  |  |   if (BB) | 
					
						
							|  |  |  |     BB = ChoicePtrAdjust(BB); | 
					
						
							|  |  |  |   if (H_FZ) | 
					
						
							|  |  |  |     H_FZ = PtoGloAdjust(H_FZ); | 
					
						
							|  |  |  |   if (TR_FZ) | 
					
						
							|  |  |  |     TR_FZ = PtoTRAdjust(TR_FZ); | 
					
						
							| 
									
										
										
										
											2003-11-07 16:31:08 +00:00
										 |  |  | #endif /* TABLING */
 | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |   if (TR) | 
					
						
							|  |  |  |     TR = PtoTRAdjust(TR); | 
					
						
							|  |  |  |   if (YENV) | 
					
						
							|  |  |  |     YENV = PtoLocAdjust(YENV); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (IsOldGlobalPtr(S)) | 
					
						
							|  |  |  |     S = PtoGloAdjust(S); | 
					
						
							| 
									
										
										
										
											2003-10-02 12:59:05 +00:00
										 |  |  |   else if (IsOldLocalPtr(S)) | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     S = PtoLocAdjust(S); | 
					
						
							| 
									
										
										
										
											2010-01-29 18:09:07 +00:00
										 |  |  |   if (!copying_threads) { | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |     if (LOCAL_GlobalArena) | 
					
						
							|  |  |  |       LOCAL_GlobalArena = AbsAppl(PtoGloAdjust(RepAppl(LOCAL_GlobalArena))); | 
					
						
							| 
									
										
										
										
											2010-01-29 18:09:07 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2004-06-16 14:12:53 +00:00
										 |  |  | #ifdef COROUTINING
 | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   if (LOCAL_AttsMutableList) | 
					
						
							|  |  |  |     LOCAL_AttsMutableList = AbsAppl(PtoGloAdjust(RepAppl(LOCAL_AttsMutableList))); | 
					
						
							|  |  |  |   if (LOCAL_WokenGoals) | 
					
						
							|  |  |  |     LOCAL_WokenGoals = AbsAppl(PtoGloAdjust(RepAppl(LOCAL_WokenGoals))); | 
					
						
							| 
									
										
										
										
											2004-06-16 14:12:53 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   LOCAL_GcGeneration = AbsAppl(PtoGloAdjust(RepAppl(LOCAL_GcGeneration))); | 
					
						
							|  |  |  |   LOCAL_GcPhase = AbsAppl(PtoGloAdjust(RepAppl(LOCAL_GcPhase))); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | MoveLocalAndTrail( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	/* cpcellsd(To,From,NOfCells) - copy the cells downwards  */ | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  | #if USE_SYSTEM_MALLOC
 | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   cpcellsd(ASP, (CELL *)((char *)LOCAL_OldASP+LOCAL_BaseDiff), (CELL *)LOCAL_OldTR - LOCAL_OldASP); | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   cpcellsd(ASP, LOCAL_OldASP, (CELL *)LOCAL_OldTR - LOCAL_OldASP); | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-14 18:51:11 +01:00
										 |  |  | #ifdef YAPOR_THREADS
 | 
					
						
							| 
									
										
										
										
											2010-02-01 21:44:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-14 15:58:19 +00:00
										 |  |  | static void | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | CopyLocalAndTrail( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2010-01-14 15:58:19 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	/* cpcellsd(To,From,NOfCells) - copy the cells downwards  */ | 
					
						
							|  |  |  | #if USE_SYSTEM_MALLOC
 | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   cpcellsd((void *)ASP, (void *)LOCAL_OldASP, (CELL *)LOCAL_OldTR - LOCAL_OldASP); | 
					
						
							| 
									
										
										
										
											2010-01-14 15:58:19 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  | static void | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | IncrementalCopyStacksFromWorker( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   memcpy((void *) PtoGloAdjust((CELL *)LOCAL_start_global_copy), | 
					
						
							|  |  |  | 	 (void *) (LOCAL_start_global_copy), | 
					
						
							|  |  |  | 	 (size_t) (LOCAL_end_global_copy - LOCAL_start_global_copy)); | 
					
						
							|  |  |  |   memcpy((void *) PtoLocAdjust((CELL *)LOCAL_start_local_copy), | 
					
						
							|  |  |  | 	 (void *) LOCAL_start_local_copy, | 
					
						
							|  |  |  | 	 (size_t) (LOCAL_end_local_copy - LOCAL_start_local_copy)); | 
					
						
							|  |  |  |   memcpy((void *) PtoTRAdjust((tr_fr_ptr)LOCAL_start_trail_copy), | 
					
						
							|  |  |  | 	 (void *) (LOCAL_start_trail_copy), | 
					
						
							|  |  |  | 	 (size_t) (LOCAL_end_trail_copy - LOCAL_start_trail_copy)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-02 09:16:11 +00:00
										 |  |  | #ifndef TABLING
 | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  | static CELL | 
					
						
							|  |  |  | worker_p_binding(int worker_p, CELL *aux_ptr) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 08:34:20 -08:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2014-02-09 22:17:36 +00:00
										 |  |  |   if (aux_ptr > HR) { | 
					
						
							| 
									
										
										
										
											2011-05-09 20:19:49 +01:00
										 |  |  |     CELL reg = REMOTE_ThreadHandle(worker_p).current_yaam_regs->LCL0_[aux_ptr-LCL0]; | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     reg = AdjustGlobTerm(reg PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  |     return reg; | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2011-05-09 20:19:49 +01:00
										 |  |  |     CELL reg = REMOTE_ThreadHandle(worker_p).current_yaam_regs-> H0_[aux_ptr-H0]; | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     reg = AdjustGlobTerm(reg PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  |     return reg; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-03-02 09:16:11 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | RestoreTrail(int worker_p USES_REGS) | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   tr_fr_ptr aux_tr; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* install fase --> TR and LOCAL_top_cp->cp_tr are equal */ | 
					
						
							|  |  |  |   aux_tr = ((choiceptr) LOCAL_start_local_copy)->cp_tr; | 
					
						
							|  |  |  |   TR = ((choiceptr) LOCAL_end_local_copy)->cp_tr; | 
					
						
							|  |  |  |   if (TR == aux_tr) | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   if (aux_tr < TR){ | 
					
						
							| 
									
										
										
										
											2015-09-25 10:57:26 +01:00
										 |  |  |     Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil, "oops"); | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:17:36 +00:00
										 |  |  |   Yap_NEW_MAHASH((ma_h_inner_struct *)HR PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  |   while (TR != aux_tr) { | 
					
						
							|  |  |  |     CELL aux_cell = TrailTerm(--aux_tr); | 
					
						
							|  |  |  |     if (IsVarTerm(aux_cell)) { | 
					
						
							| 
									
										
										
										
											2010-04-18 04:59:11 +01:00
										 |  |  |       if (aux_cell < LOCAL_start_global_copy || EQUAL_OR_YOUNGER_CP((choiceptr)LOCAL_end_local_copy, (choiceptr)aux_cell)) { | 
					
						
							|  |  |  | 	YAPOR_ERROR_CHECKING((CELL *)aux_cell < H0, "RestoreTrail: aux_cell < H0"); | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	YAPOR_ERROR_CHECKING((ADDR)aux_cell > LOCAL_LocalBase, "RestoreTrail: aux_cell > LocalBase"); | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  | #ifdef TABLING
 | 
					
						
							|  |  |  |         *((CELL *) aux_cell) = TrailVal(aux_tr); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |         *((CELL *) aux_cell) = worker_p_binding(worker_p, CellPtr(aux_cell)); | 
					
						
							|  |  |  | #endif /* TABLING */
 | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | #ifdef TABLING
 | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  |     } else if (IsPairTerm(aux_cell)) { | 
					
						
							|  |  |  |       /* avoid frozen segments */ | 
					
						
							|  |  |  |       aux_cell = (CELL) RepPair(aux_cell); | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |       if (IN_BETWEEN(LOCAL_TrailBase, aux_cell, LOCAL_TrailTop)) { | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  |         aux_tr = (tr_fr_ptr) aux_cell; | 
					
						
							| 
									
										
										
										
											2010-07-27 23:09:17 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  | #endif /* TABLING */
 | 
					
						
							|  |  |  | #ifdef MULTI_ASSIGNMENT_VARIABLES
 | 
					
						
							|  |  |  |     } else if (IsApplTerm(aux_cell)) { | 
					
						
							|  |  |  |       CELL *cell_ptr = RepAppl(aux_cell); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |       if (((CELL *)aux_cell < Get_LOCAL_top_cp()->cp_h || | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  | 	   EQUAL_OR_YOUNGER_CP(Get_LOCAL_top_cp(), (choiceptr)aux_cell)) && | 
					
						
							| 
									
										
										
										
											2011-04-28 09:48:42 +01:00
										 |  |  | 	  !Yap_lookup_ma_var(cell_ptr PASS_REGS)) { | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  | 	/* first time we found the variable, let's put the new value */ | 
					
						
							|  |  |  | #ifdef TABLING
 | 
					
						
							|  |  |  |         *cell_ptr = TrailVal(aux_tr); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |         *cell_ptr = worker_p_binding(worker_p, cell_ptr); | 
					
						
							|  |  |  | #endif /* TABLING */
 | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       /* skip the old value */ | 
					
						
							|  |  |  |       aux_tr--; | 
					
						
							|  |  |  | #endif /* MULTI_ASSIGNMENT_VARIABLES */
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2010-02-01 21:44:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-29 14:59:17 +01:00
										 |  |  | #endif /* YAPOR_THREADS */
 | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | static void | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | MoveGlobal( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2005-02-24 21:46:40 +00:00
										 |  |  |   /*
 | 
					
						
							|  |  |  |    * cpcellsd(To,From,NOfCells) - copy the cells downwards - in | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |    * absmi.asm | 
					
						
							| 
									
										
										
										
											2005-02-24 21:46:40 +00:00
										 |  |  |    */ | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |    cpcellsd((CELL *)LOCAL_GlobalBase, (CELL *)LOCAL_OldGlobalBase, LOCAL_OldH - (CELL *)LOCAL_OldGlobalBase); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | MoveExpandedGlobal( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  |   /*
 | 
					
						
							|  |  |  |    * cpcellsd(To,From,NOfCells) - copy the cells downwards - in | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |    * absmi.asm | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  |    */ | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   cpcellsd((CELL *)(LOCAL_GlobalBase+(LOCAL_GDiff-LOCAL_BaseDiff)), (CELL *)LOCAL_GlobalBase, LOCAL_OldH - (CELL *)LOCAL_OldGlobalBase); | 
					
						
							| 
									
										
										
										
											2006-05-16 18:37:31 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | MoveGlobalWithHole( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2006-05-16 18:37:31 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  |   /*
 | 
					
						
							|  |  |  |    * cpcellsd(To,From,NOfCells) - copy the cells downwards - in | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |    * absmi.asm | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  |    */ | 
					
						
							| 
									
										
										
										
											2006-10-16 17:12:48 +00:00
										 |  |  | #if USE_SYSTEM_MALLOC
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   cpcellsd((CELL *)((char *)LOCAL_GlobalBase+(LOCAL_GDiff0-LOCAL_BaseDiff)), (CELL *)LOCAL_GlobalBase, LOCAL_OldH - (CELL *)LOCAL_OldGlobalBase); | 
					
						
							| 
									
										
										
										
											2006-10-16 17:12:48 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   cpcellsd((CELL *)((char *)LOCAL_OldGlobalBase+LOCAL_GDiff0), (CELL *)LOCAL_OldGlobalBase, LOCAL_OldH - (CELL *)LOCAL_OldGlobalBase); | 
					
						
							| 
									
										
										
										
											2006-10-16 17:12:48 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | MoveHalfGlobal(CELL *OldPt USES_REGS) | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	 * cpcellsd(To,From,NOfCells) - copy the cells downwards - in | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | 	 * absmi.asm | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   UInt diff = LOCAL_OldH-OldPt; | 
					
						
							|  |  |  |   CELL *NewPt = (CELL *)((char*)OldPt+LOCAL_GDiff); | 
					
						
							|  |  |  |   CELL *IntPt = (CELL *)((char*)OldPt+LOCAL_GDiff0); | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  |   cpcellsd(NewPt, IntPt, diff); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline CELL | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | AdjustAppl(register CELL t0 USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   register CELL   *t = RepAppl(t0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (IsOldGlobalPtr(t)) | 
					
						
							|  |  |  |     return (AbsAppl(PtoGloAdjust(t))); | 
					
						
							|  |  |  |   else if (IsOldTrailPtr(t)) | 
					
						
							|  |  |  |     return (AbsAppl(CellPtoTRAdjust(t))); | 
					
						
							|  |  |  |   else if (IsHeapP(t)) | 
					
						
							|  |  |  |     return (AbsAppl(CellPtoHeapAdjust(t))); | 
					
						
							|  |  |  | #ifdef DEBUG
 | 
					
						
							|  |  |  |   else { | 
					
						
							|  |  |  |     /* strange cell */ | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |     /*    Sfprintf(stderr,"% garbage appl %lx found in stacks by stack shifter\n", t0);*/ | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |   return(t0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline CELL | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | AdjustPair(register CELL t0 USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   register CELL  *t = RepPair(t0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (IsOldGlobalPtr(t)) | 
					
						
							|  |  |  |     return (AbsPair(PtoGloAdjust(t))); | 
					
						
							|  |  |  |   if (IsOldTrailPtr(t)) | 
					
						
							|  |  |  |     return (AbsPair(CellPtoTRAdjust(t))); | 
					
						
							|  |  |  |   else if (IsHeapP(t)) | 
					
						
							|  |  |  |     return (AbsPair(CellPtoHeapAdjust(t))); | 
					
						
							|  |  |  | #ifdef DEBUG
 | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |   /* Sfprintf(stderr,"% garbage pair %lx found in stacks by stack shifter\n", t0);*/ | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  |   return(t0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  | AdjustTrail(bool adjusting_heap, bool thread_copying USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |   volatile tr_fr_ptr ptt, tr_base = (tr_fr_ptr)LOCAL_TrailBase; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-14 18:51:11 +01:00
										 |  |  | #if defined(YAPOR_THREADS)
 | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  |   if (thread_copying == STACK_INCREMENTAL_COPYING) { | 
					
						
							|  |  |  |     ptt =  (tr_fr_ptr)(LOCAL_end_trail_copy); | 
					
						
							|  |  |  |     tr_base =  (tr_fr_ptr)(LOCAL_start_trail_copy); | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2010-02-01 21:44:21 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  |     ptt = TR; | 
					
						
							| 
									
										
										
										
											2011-04-14 18:51:11 +01:00
										 |  |  | #if defined(YAPOR_THREADS)
 | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-02-01 21:44:21 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2011-07-22 04:09:33 -07:00
										 |  |  |   /* moving the trail is simple, yeaahhh! */ | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  |   while (ptt != tr_base) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     register CELL reg = TrailTerm(ptt-1); | 
					
						
							| 
									
										
										
										
											2001-07-04 16:48:54 +00:00
										 |  |  | #ifdef FROZEN_STACKS
 | 
					
						
							|  |  |  |     register CELL reg2 = TrailVal(ptt-1); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ptt--; | 
					
						
							|  |  |  |     if (IsVarTerm(reg)) { | 
					
						
							|  |  |  |       if (IsOldLocalInTR(reg)) | 
					
						
							|  |  |  | 	TrailTerm(ptt) = LocalAdjust(reg); | 
					
						
							|  |  |  |       else if (IsOldGlobal(reg)) | 
					
						
							|  |  |  | 	TrailTerm(ptt) = GlobalAdjust(reg); | 
					
						
							|  |  |  |       else if (IsOldTrail(reg)) | 
					
						
							|  |  |  | 	TrailTerm(ptt) = TrailAdjust(reg); | 
					
						
							| 
									
										
										
										
											2010-01-29 18:09:07 +00:00
										 |  |  |       else if (thread_copying) { | 
					
						
							|  |  |  | 	RESET_VARIABLE(&TrailTerm(ptt)); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } else if (IsPairTerm(reg)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       TrailTerm(ptt) = AdjustPair(reg PASS_REGS); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #ifdef MULTI_ASSIGNMENT_VARIABLES /* does not work with new structures */
 | 
					
						
							|  |  |  |     } else if (IsApplTerm(reg)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       TrailTerm(ptt) = AdjustAppl(reg PASS_REGS); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-07-04 16:48:54 +00:00
										 |  |  | #ifdef FROZEN_STACKS
 | 
					
						
							|  |  |  |     if (IsVarTerm(reg2)) { | 
					
						
							|  |  |  |       if (IsOldLocal(reg2)) | 
					
						
							|  |  |  | 	TrailVal(ptt) = LocalAdjust(reg2); | 
					
						
							|  |  |  |       else if (IsOldGlobal(reg2)) | 
					
						
							|  |  |  | 	TrailVal(ptt) = GlobalAdjust(reg2); | 
					
						
							|  |  |  |       else if (IsOldTrail(reg2)) | 
					
						
							|  |  |  | 	TrailVal(ptt) = TrailAdjust(reg2); | 
					
						
							|  |  |  |     } else if (IsApplTerm(reg2)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       TrailVal(ptt) = AdjustAppl(reg2 PASS_REGS); | 
					
						
							| 
									
										
										
										
											2001-07-04 16:48:54 +00:00
										 |  |  |     } else if (IsPairTerm(reg2)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       TrailVal(ptt) = AdjustPair(reg2 PASS_REGS); | 
					
						
							| 
									
										
										
										
											2001-07-04 16:48:54 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2015-06-18 07:59:53 +01:00
										 |  |  | fixPointerCells(CELL *pt, CELL *pt_bot, bool thread_copying USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  |   while (pt > pt_bot) { | 
					
						
							| 
									
										
										
										
											2015-06-18 07:59:53 +01:00
										 |  |  |     CELL reg = *--pt; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     if (IsVarTerm(reg)) { | 
					
						
							|  |  |  |       if (IsOldLocal(reg)) | 
					
						
							|  |  |  | 	*pt = LocalAdjust(reg); | 
					
						
							|  |  |  |       else if (IsOldGlobal(reg)) | 
					
						
							|  |  |  | 	*pt = GlobalAdjust(reg); | 
					
						
							|  |  |  |       else if (IsOldTrail(reg)) | 
					
						
							|  |  |  | 	*pt = TrailAdjust(reg); | 
					
						
							|  |  |  |       else if (IsOldCode(reg)) | 
					
						
							|  |  |  | 	*pt = CodeAdjust(reg); | 
					
						
							|  |  |  |     } else if (IsApplTerm(reg)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       *pt = AdjustAppl(reg PASS_REGS); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } else if (IsPairTerm(reg)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       *pt = AdjustPair(reg PASS_REGS); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-06-18 07:59:53 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | AdjustSlots(bool thread_copying USES_REGS) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   CELL *pt = LOCAL_SlotBase+LOCAL_CurSlot; | 
					
						
							|  |  |  |   CELL *pt_bot = LOCAL_SlotBase+1; | 
					
						
							|  |  |  |   fixPointerCells( pt_bot, pt, thread_copying PASS_REGS); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-18 07:59:53 +01:00
										 |  |  | static void | 
					
						
							|  |  |  | AdjustLocal(bool thread_copying USES_REGS) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   register CELL    *pt, *pt_bot; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* Adjusting the local */ | 
					
						
							|  |  |  | #if defined(YAPOR_THREADS)
 | 
					
						
							|  |  |  |   if (thread_copying == STACK_INCREMENTAL_COPYING) { | 
					
						
							|  |  |  |     pt =  (CELL *) (LOCAL_end_local_copy); | 
					
						
							|  |  |  |     pt_bot =  (CELL *) (LOCAL_start_local_copy); | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     pt = LCL0; | 
					
						
							|  |  |  |     pt_bot = ASP; | 
					
						
							|  |  |  | #if defined(YAPOR_THREADS)
 | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-07-22 19:15:08 -05:00
										 |  |  |   fixPointerCells( pt, pt_bot, thread_copying PASS_REGS); | 
					
						
							| 
									
										
										
										
											2015-06-18 07:59:53 +01:00
										 |  |  |   AdjustSlots( thread_copying PASS_REGS); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  | static Term | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | AdjustGlobTerm(Term reg USES_REGS) | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   if (IsVarTerm(reg)) { | 
					
						
							|  |  |  |     if (IsOldGlobal(reg)) | 
					
						
							|  |  |  |       return GlobalAdjust(reg); | 
					
						
							|  |  |  |     else if (IsOldLocal(reg)) | 
					
						
							|  |  |  |       return LocalAdjust(reg); | 
					
						
							|  |  |  | #ifdef MULTI_ASSIGNMENT_VARIABLES
 | 
					
						
							|  |  |  |     else if (IsOldTrail(reg)) | 
					
						
							|  |  |  |       return TrailAdjust(reg); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |   } else if (IsApplTerm(reg)) | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     return AdjustAppl(reg PASS_REGS); | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  |   else if (IsPairTerm(reg)) | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     return AdjustPair(reg PASS_REGS); | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  |   return AtomTermAdjust(reg); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  | static volatile CELL *cpt=NULL, *ocpt = NULL; | 
					
						
							| 
									
										
										
										
											2008-01-23 17:57:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | static void | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  | AdjustGlobal(Int sz, bool thread_copying USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  |   CELL *pt, *pt_max; | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   ArrayEntry *al = LOCAL_DynamicArrays; | 
					
						
							|  |  |  |   StaticArrayEntry *sal = LOCAL_StaticArrays; | 
					
						
							|  |  |  |   GlobalEntry *gl = LOCAL_GlobalVariables; | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   while (al) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     al->ValueOfVE = AdjustGlobTerm(al->ValueOfVE PASS_REGS); | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  |     al = al->NextAE; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  |   while (gl) { | 
					
						
							|  |  |  |     if (IsVarTerm(gl->global) || | 
					
						
							|  |  |  | 	!IsAtomOrIntTerm(gl->global)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       gl->global = AdjustGlobTerm(gl->global PASS_REGS); | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     gl = gl->NextGE; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  |   while (sal) { | 
					
						
							|  |  |  |     if (sal->ArrayType == array_of_nb_terms) { | 
					
						
							|  |  |  |       UInt arity = -sal->ArrayEArity, i; | 
					
						
							|  |  |  |       for (i=0; i < arity; i++) { | 
					
						
							|  |  |  | 	/*	    sal->ValueOfVE.lterms[i].tlive = AdjustGlobTerm(sal->ValueOfVE.lterms[i].tlive); */ | 
					
						
							|  |  |  | 	Term tlive  = sal->ValueOfVE.lterms[i].tlive; | 
					
						
							|  |  |  | 	if (!IsVarTerm(tlive) || !IsUnboundVar(&sal->ValueOfVE.lterms[i].tlive)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | 	    sal->ValueOfVE.lterms[i].tlive = AdjustGlobTerm(sal->ValueOfVE.lterms[i].tlive PASS_REGS); | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     sal = sal->NextAE; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /*
 | 
					
						
							|  |  |  |    * to clean the global now that functors are just variables pointing to | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |    * the code | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |    */ | 
					
						
							| 
									
										
										
										
											2011-04-14 18:51:11 +01:00
										 |  |  | #if defined(YAPOR_THREADS)
 | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  |   if (thread_copying == STACK_INCREMENTAL_COPYING) { | 
					
						
							|  |  |  |     pt =  (CELL *) (LOCAL_start_global_copy); | 
					
						
							|  |  |  |     pt_max =  (CELL *) (LOCAL_end_global_copy); | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2010-02-01 21:44:21 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-03-08 09:23:58 +00:00
										 |  |  |     pt = H0; | 
					
						
							| 
									
										
										
										
											2014-01-19 21:15:05 +00:00
										 |  |  |     pt_max = (HR-sz/CellSize); | 
					
						
							| 
									
										
										
										
											2011-04-14 18:51:11 +01:00
										 |  |  | #if defined(YAPOR_THREADS)
 | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-02-01 21:44:21 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-03-08 09:23:58 +00:00
										 |  |  |   pt = H0; | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  |   ocpt = NULL; | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  |   while (pt < pt_max) { | 
					
						
							| 
									
										
										
										
											2006-08-23 12:12:14 +00:00
										 |  |  |     CELL reg; | 
					
						
							| 
									
										
										
										
											2008-01-23 17:57:56 +00:00
										 |  |  |     cpt = pt; | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  |     if (cpt > ocpt) | 
					
						
							|  |  |  |       ocpt = cpt; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     reg = *pt; | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  |     if (IsVarTerm(reg)) { | 
					
						
							| 
									
										
										
										
											2008-05-10 23:24:13 +00:00
										 |  |  |       if (IsOldGlobal(reg)) | 
					
						
							|  |  |  | 	*pt = GlobalAdjust(reg); | 
					
						
							|  |  |  |       else if (IsOldLocal(reg)) | 
					
						
							|  |  |  | 	*pt = LocalAdjust(reg); | 
					
						
							| 
									
										
										
										
											2010-05-10 03:04:54 +01:00
										 |  |  |       else if (IsOldCode(reg) || IsExtensionFunctor((Functor)reg)) { | 
					
						
							| 
									
										
										
										
											2008-05-10 23:24:13 +00:00
										 |  |  | 	Functor f; | 
					
						
							|  |  |  | 	f = (Functor)reg; | 
					
						
							|  |  |  | 	/* skip bitmaps */ | 
					
						
							|  |  |  | 	switch((CELL)f) { | 
					
						
							|  |  |  | 	case (CELL)FunctorDouble: | 
					
						
							| 
									
										
										
										
											2014-01-19 21:15:05 +00:00
										 |  |  | #if SIZEOF_DOUBLE == 2*SIZEOF_INT_P
 | 
					
						
							| 
									
										
										
										
											2008-05-10 23:24:13 +00:00
										 |  |  | 	  pt += 3; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2008-05-10 23:24:13 +00:00
										 |  |  | 	  pt += 2; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2008-05-10 23:24:13 +00:00
										 |  |  | 	  break; | 
					
						
							| 
									
										
										
										
											2013-12-02 14:49:41 +00:00
										 |  |  | 	case (CELL)FunctorString: | 
					
						
							|  |  |  | 	  pt += 3+pt[1]; | 
					
						
							|  |  |  | 	  break; | 
					
						
							| 
									
										
										
										
											2008-05-10 23:24:13 +00:00
										 |  |  | 	case (CELL)FunctorBigInt: | 
					
						
							|  |  |  | 	  { | 
					
						
							| 
									
										
										
										
											2008-11-28 15:54:46 +00:00
										 |  |  | 	    Int sz = 2+ | 
					
						
							| 
									
										
										
										
											2008-05-10 23:24:13 +00:00
										 |  |  | 	      (sizeof(MP_INT)+ | 
					
						
							| 
									
										
										
										
											2008-11-28 15:54:46 +00:00
										 |  |  | 	       (((MP_INT *)(pt+2))->_mp_alloc*sizeof(mp_limb_t)))/CellSize; | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  | 	    //printf("sz *%ld* at @%ld@\n", sz, pt-H0);
 | 
					
						
							| 
									
										
										
										
											2011-12-13 10:41:05 +00:00
										 |  |  | 	    Opaque_CallOnGCMark f; | 
					
						
							| 
									
										
										
										
											2011-12-13 19:14:33 +01:00
										 |  |  | 	    Opaque_CallOnGCRelocate f2; | 
					
						
							| 
									
										
										
										
											2011-12-13 12:16:42 +00:00
										 |  |  | 	    Term t = AbsAppl(pt); | 
					
						
							| 
									
										
										
										
											2011-12-13 10:41:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-13 12:16:42 +00:00
										 |  |  | 	    if ( (f = Yap_blob_gc_mark_handler(t)) ) { | 
					
						
							| 
									
										
										
										
											2011-12-13 10:41:05 +00:00
										 |  |  | 	      CELL ar[256]; | 
					
						
							| 
									
										
										
										
											2011-12-13 12:16:42 +00:00
										 |  |  | 	      Int i,n = (f)(Yap_BlobTag(t), Yap_BlobInfo(t), ar, 256); | 
					
						
							| 
									
										
										
										
											2011-12-13 10:41:05 +00:00
										 |  |  | 	      if (n < 0) { | 
					
						
							| 
									
										
										
										
											2015-09-25 10:57:26 +01:00
										 |  |  | 		Yap_Error(RESOURCE_ERROR_HEAP,TermNil,"not enough space for slot internal variables"); | 
					
						
							| 
									
										
										
										
											2011-12-13 10:41:05 +00:00
										 |  |  | 	      } | 
					
						
							|  |  |  | 	      for (i = 0; i< n; i++) { | 
					
						
							|  |  |  | 		CELL *pt = ar+i; | 
					
						
							|  |  |  | 		CELL reg = *pt; | 
					
						
							|  |  |  | 		if (IsVarTerm(reg)) { | 
					
						
							|  |  |  | 		  if (IsOldGlobal(reg)) | 
					
						
							|  |  |  | 		    *pt = GlobalAdjust(reg); | 
					
						
							|  |  |  | 		  else if (IsOldLocal(reg)) | 
					
						
							|  |  |  | 		    *pt = LocalAdjust(reg); | 
					
						
							|  |  |  | #ifdef MULTI_ASSIGNMENT_VARIABLES
 | 
					
						
							|  |  |  | 		  else if (IsOldTrail(reg)) | 
					
						
							|  |  |  | 		    *pt = TrailAdjust(reg); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 		} else if (IsApplTerm(reg)) | 
					
						
							|  |  |  | 		  *pt = AdjustAppl(reg PASS_REGS); | 
					
						
							|  |  |  | 		else if (IsPairTerm(reg)) | 
					
						
							|  |  |  | 		  *pt = AdjustPair(reg PASS_REGS); | 
					
						
							|  |  |  | 		else if (IsAtomTerm(reg)) | 
					
						
							|  |  |  | 		  *pt = AtomTermAdjust(reg); | 
					
						
							|  |  |  | 	      } | 
					
						
							| 
									
										
										
										
											2011-12-13 19:14:33 +01:00
										 |  |  | 	      if ( (f2 = Yap_blob_gc_relocate_handler(t)) < 0 ) { | 
					
						
							| 
									
										
										
										
											2011-12-13 12:16:42 +00:00
										 |  |  | 		int out = (f2)(Yap_BlobTag(t), Yap_BlobInfo(t), ar, n); | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  | 		if (out < 0) { | 
					
						
							| 
									
										
										
										
											2015-09-25 10:57:26 +01:00
										 |  |  | 		  Yap_Error(RESOURCE_ERROR_HEAP,TermNil,"bad restore of slot internal variables"); | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  | 		  return; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2011-12-13 10:41:05 +00:00
										 |  |  | 	      } | 
					
						
							|  |  |  | 	    } | 
					
						
							| 
									
										
										
										
											2008-05-10 23:24:13 +00:00
										 |  |  | 	    pt += sz; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	  } | 
					
						
							| 
									
										
										
										
											2008-05-10 23:24:13 +00:00
										 |  |  | 	  break; | 
					
						
							|  |  |  | 	case (CELL)0L: | 
					
						
							|  |  |  | 	  break; | 
					
						
							|  |  |  | 	case (CELL)FunctorLongInt: | 
					
						
							|  |  |  | 	  pt += 2; | 
					
						
							|  |  |  | 	  break; | 
					
						
							|  |  |  | 	default: | 
					
						
							|  |  |  | 	  *pt = CodeAdjust(reg); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-05-10 23:24:13 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #ifdef MULTI_ASSIGNMENT_VARIABLES
 | 
					
						
							| 
									
										
										
										
											2008-05-10 23:24:13 +00:00
										 |  |  |       else if (IsOldTrail(reg)) | 
					
						
							|  |  |  | 	*pt = TrailAdjust(reg); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2008-05-10 23:24:13 +00:00
										 |  |  |     } else if (IsApplTerm(reg)) | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       *pt = AdjustAppl(reg PASS_REGS); | 
					
						
							| 
									
										
										
										
											2008-05-10 23:24:13 +00:00
										 |  |  |     else if (IsPairTerm(reg)) | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       *pt = AdjustPair(reg PASS_REGS); | 
					
						
							| 
									
										
										
										
											2008-05-10 23:24:13 +00:00
										 |  |  |     else if (IsAtomTerm(reg)) | 
					
						
							|  |  |  |       *pt = AtomTermAdjust(reg); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     pt++; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * When growing the stack we need to adjust: the local stack cells pointing | 
					
						
							|  |  |  |  * to the local; the local stack cells and the X terms pointing to the global | 
					
						
							|  |  |  |  * (just once) the trail cells pointing both to the global and to the local | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | static void | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  | AdjustStacksAndTrail(Int sz, bool copying_threads USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  |   AdjustTrail(true, copying_threads PASS_REGS); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   AdjustLocal(copying_threads PASS_REGS); | 
					
						
							|  |  |  |   AdjustGlobal(sz, copying_threads PASS_REGS); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | void | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_AdjustStacksAndTrail(void) | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   AdjustStacksAndTrail(0, FALSE PASS_REGS); | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * When growing the stack we need to adjust: the local cells pointing to the | 
					
						
							|  |  |  |  * local; the trail cells pointing to the local | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | AdjustGrowStack( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   AdjustTrail(FALSE, STACK_SHIFTING PASS_REGS); | 
					
						
							|  |  |  |   AdjustLocal(STACK_SHIFTING PASS_REGS); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | static void | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | AdjustRegs(int n USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   int            i; | 
					
						
							|  |  |  |   CELL	       reg; | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   for (i = 1; i < n; ++i) { | 
					
						
							|  |  |  |     reg = (CELL) XREGS[i]; | 
					
						
							|  |  |  |     if (IsVarTerm(reg)) { | 
					
						
							|  |  |  |       if (IsOldLocal(reg)) | 
					
						
							|  |  |  | 	reg = LocalAdjust(reg); | 
					
						
							|  |  |  |       else if (IsOldGlobal(reg)) | 
					
						
							|  |  |  | 	reg = GlobalAdjust(reg); | 
					
						
							|  |  |  |       else if (IsOldTrail(reg)) | 
					
						
							|  |  |  | 	reg = TrailAdjust(reg); | 
					
						
							|  |  |  |       else if (IsOldCode(reg)) | 
					
						
							|  |  |  | 	reg = CodeAdjust(reg); | 
					
						
							|  |  |  |     } else if (IsApplTerm(reg)) | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       reg = AdjustAppl(reg PASS_REGS); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     else if (IsPairTerm(reg)) | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       reg = AdjustPair(reg PASS_REGS); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     XREGS[i] = (Term) reg; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-04-18 06:30:41 +00:00
										 |  |  | static void | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | AdjustVarTable(VarEntry *ves USES_REGS) | 
					
						
							| 
									
										
										
										
											2007-04-18 06:30:41 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   ves->VarAdr = TermNil; | 
					
						
							|  |  |  |   if (ves->VarRight != NULL) { | 
					
						
							|  |  |  |     if (IsOldVarTableTrailPtr(ves->VarRight)) { | 
					
						
							|  |  |  |       ves->VarRight = (VarEntry *)TrailAddrAdjust((ADDR)(ves->VarRight)); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     AdjustVarTable(ves->VarRight PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-04-18 06:30:41 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   if (ves->VarLeft != NULL) { | 
					
						
							|  |  |  |     if (IsOldVarTableTrailPtr(ves->VarLeft)) { | 
					
						
							|  |  |  |       ves->VarLeft = (VarEntry *)TrailAddrAdjust((ADDR)(ves->VarLeft)); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     AdjustVarTable(ves->VarLeft PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-04-18 06:30:41 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |   If we have to shift while we are scanning we need to adjust all | 
					
						
							|  |  |  |   pointers created by the scanner (Tokens and Variables) | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | AdjustScannerStacks(TokEntry **tksp, VarEntry **vep USES_REGS) | 
					
						
							| 
									
										
										
										
											2007-04-18 06:30:41 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   TokEntry *tks = *tksp; | 
					
						
							|  |  |  |   VarEntry *ves = *vep; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (tks != NULL) { | 
					
						
							|  |  |  |     if (IsOldTokenTrailPtr(tks)) { | 
					
						
							|  |  |  |       tks = *tksp = TokEntryAdjust(tks); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   while (tks != NULL) { | 
					
						
							|  |  |  |     TokEntry *tktmp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     switch (tks->Tok) { | 
					
						
							| 
									
										
										
										
											2012-04-15 22:40:00 +01:00
										 |  |  |     case Number_tok: | 
					
						
							|  |  |  |       if (IsApplTerm(tks->TokInfo)) { | 
					
						
							|  |  |  | 	tks->TokInfo = AdjustAppl(tks->TokInfo PASS_REGS); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |       break; | 
					
						
							| 
									
										
										
										
											2007-04-18 06:30:41 +00:00
										 |  |  |     case Var_tok: | 
					
						
							| 
									
										
										
										
											2015-07-06 11:59:50 +01:00
										 |  |  |       case String_tok: | 
					
						
							|  |  |  |       case WString_tok: | 
					
						
							|  |  |  |       case BQString_tok: | 
					
						
							|  |  |  |       case WBQString_tok: | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     if (IsOldTrail(tks->TokInfo)) | 
					
						
							|  |  |  | 	       tks->TokInfo = TrailAdjust(tks->TokInfo); | 
					
						
							| 
									
										
										
										
											2007-04-18 06:30:41 +00:00
										 |  |  |       break; | 
					
						
							|  |  |  |     case Name_tok: | 
					
						
							|  |  |  |       tks->TokInfo = (Term)AtomAdjust((Atom)(tks->TokInfo)); | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     tktmp = tks->TokNext; | 
					
						
							|  |  |  |     if (tktmp != NULL) { | 
					
						
							|  |  |  |       if (IsOldTokenTrailPtr(tktmp)) { | 
					
						
							|  |  |  | 	tktmp = TokEntryAdjust(tktmp); | 
					
						
							|  |  |  | 	tks->TokNext = tktmp; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     tks = tktmp; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (ves != NULL) { | 
					
						
							|  |  |  |     if (IsOldVarTableTrailPtr(ves)) | 
					
						
							|  |  |  |       ves = *vep = (VarEntry *)TrailAddrAdjust((ADDR)ves); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     AdjustVarTable(ves PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-04-18 06:30:41 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |   ves = LOCAL_AnonVarTable; | 
					
						
							| 
									
										
										
										
											2007-04-18 06:30:41 +00:00
										 |  |  |   if (ves != NULL) { | 
					
						
							|  |  |  |     if (IsOldVarTableTrailPtr(ves)) | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |       ves = LOCAL_AnonVarTable = VarEntryAdjust(ves); | 
					
						
							| 
									
										
										
										
											2007-04-18 06:30:41 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   while (ves != NULL) { | 
					
						
							|  |  |  |     VarEntry *vetmp = ves->VarLeft; | 
					
						
							|  |  |  |     if (vetmp != NULL) { | 
					
						
							|  |  |  |       if (IsOldVarTableTrailPtr(vetmp)) { | 
					
						
							|  |  |  | 	vetmp = VarEntryAdjust(vetmp); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       ves->VarLeft = vetmp; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     ves->VarAdr = TermNil; | 
					
						
							|  |  |  |     ves = vetmp; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | void | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_AdjustRegs(int n) | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   AdjustRegs(n PASS_REGS); | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | /* Used by do_goal() when we're short of heap space */ | 
					
						
							|  |  |  | static int | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  | static_growheap(size_t esize, bool fix_code, struct intermediates *cip, tr_fr_ptr *old_trp, TokEntry **tksp, VarEntry **vep USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  |   Int size = esize; | 
					
						
							| 
									
										
										
										
											2004-03-02 16:44:58 +00:00
										 |  |  |   UInt start_growth_time, growth_time; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   int gc_verbose; | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  |   size_t minimal_request = 0L; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /* adjust to a multiple of 256) */ | 
					
						
							| 
									
										
										
										
											2008-01-24 00:11:59 +00:00
										 |  |  |   if (size < YAP_ALLOC_SIZE) | 
					
						
							|  |  |  |     size = YAP_ALLOC_SIZE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   size = AdjustPageSize(size); | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |   LOCAL_ErrorMessage = NULL; | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   if (!Yap_ExtendWorkSpace(size)) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |     Int min_size = AdjustPageSize(((CELL)LOCAL_TrailTop-(CELL)LOCAL_GlobalBase)+MinHeapGap); | 
					
						
							| 
									
										
										
										
											2003-10-28 01:16:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |     LOCAL_ErrorMessage = NULL; | 
					
						
							| 
									
										
										
										
											2003-10-28 01:16:03 +00:00
										 |  |  |     if (size < min_size) size = min_size; | 
					
						
							| 
									
										
										
										
											2004-08-11 16:14:55 +00:00
										 |  |  |     minimal_request = size; | 
					
						
							| 
									
										
										
										
											2003-10-28 01:16:03 +00:00
										 |  |  |     size = Yap_ExtendWorkSpaceThroughHole(size); | 
					
						
							|  |  |  |     if (size < 0) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |       LOCAL_ErrorMessage = "Database crashed against Stacks"; | 
					
						
							| 
									
										
										
										
											2003-10-28 01:16:03 +00:00
										 |  |  |       return FALSE; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   start_growth_time = Yap_cputime(); | 
					
						
							|  |  |  |   gc_verbose = Yap_is_gc_verbose(); | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   LOCAL_heap_overflows++; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (gc_verbose) { | 
					
						
							| 
									
										
										
										
											2011-04-14 18:51:11 +01:00
										 |  |  | #if  defined(YAPOR_THREADS)
 | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |     fprintf( stderr, "%% Worker Id %d:\n", worker_id); | 
					
						
							| 
									
										
										
										
											2008-01-23 17:57:56 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |     fprintf( stderr, "%% Database Overflow %d\n", LOCAL_heap_overflows); | 
					
						
							|  |  |  |     fprintf( stderr, "%%   growing the heap %ld bytes\n", size); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2003-09-23 02:19:37 +00:00
										 |  |  |   /* CreepFlag is set to force heap expansion */ | 
					
						
							| 
									
										
										
										
											2014-03-06 02:09:48 +00:00
										 |  |  |   if ( Yap_only_has_signal( YAP_CDOVF_SIGNAL) ) { | 
					
						
							| 
									
										
										
										
											2013-12-12 14:24:40 +00:00
										 |  |  |     CalculateStackGap( PASS_REGS1 ); | 
					
						
							| 
									
										
										
										
											2003-09-23 02:19:37 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   ASP -= 256; | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   LOCAL_TrDiff = LOCAL_LDiff = LOCAL_GDiff = LOCAL_GDiff0 = LOCAL_DelayDiff = LOCAL_BaseDiff = size; | 
					
						
							|  |  |  |   LOCAL_XDiff = LOCAL_HDiff = 0; | 
					
						
							|  |  |  |   LOCAL_GSplit = NULL; | 
					
						
							| 
									
										
										
										
											2012-03-03 21:46:07 +00:00
										 |  |  |   YAPEnterCriticalSection(); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   SetHeapRegs(FALSE PASS_REGS); | 
					
						
							|  |  |  |   MoveLocalAndTrail( PASS_REGS1 ); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (fix_code) { | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |     CELL *SaveOldH = LOCAL_OldH; | 
					
						
							|  |  |  |     LOCAL_OldH = (CELL *)cip->freep; | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     MoveGlobal( PASS_REGS1 ); | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |     LOCAL_OldH = SaveOldH; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     MoveGlobal( PASS_REGS1 ); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2007-04-18 06:30:41 +00:00
										 |  |  |   if (old_trp) { | 
					
						
							|  |  |  |     tr_fr_ptr nTR; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     AdjustScannerStacks(tksp, vep PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-04-18 06:30:41 +00:00
										 |  |  |     nTR = TR; | 
					
						
							|  |  |  |     *old_trp = PtoTRAdjust(*old_trp); | 
					
						
							|  |  |  |     TR = *old_trp; | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     AdjustStacksAndTrail(0, FALSE PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-04-18 06:30:41 +00:00
										 |  |  |     TR = nTR; | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     AdjustStacksAndTrail(0, FALSE PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-04-18 06:30:41 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   AdjustRegs(MaxTemps PASS_REGS); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   ASP += 256; | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   if (minimal_request) | 
					
						
							| 
									
										
										
										
											2004-08-11 16:14:55 +00:00
										 |  |  |     Yap_AllocHole(minimal_request, size); | 
					
						
							| 
									
										
										
										
											2012-03-03 21:46:07 +00:00
										 |  |  |   YAPLeaveCriticalSection(); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   growth_time = Yap_cputime()-start_growth_time; | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   LOCAL_total_heap_overflow_time += growth_time; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (gc_verbose) { | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |     fprintf(stderr, "%%   took %g sec\n", (double)growth_time/1000); | 
					
						
							|  |  |  |     fprintf(stderr, "%% Total of %g sec expanding Database\n", (double)LOCAL_total_heap_overflow_time/1000); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   return(TRUE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  | /* Used when we're short of heap, usually because of an overflow in
 | 
					
						
							|  |  |  |    the attributed stack, but also because we allocated a zone  */ | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | static int | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  | static_growglobal(size_t request, CELL **ptr, CELL *hsplit USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2004-03-02 16:44:58 +00:00
										 |  |  |   UInt start_growth_time, growth_time; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   int gc_verbose; | 
					
						
							| 
									
										
										
										
											2010-03-08 09:23:58 +00:00
										 |  |  |   char *omax = (char *)H0; | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |   ADDR old_GlobalBase = LOCAL_GlobalBase; | 
					
						
							| 
									
										
										
										
											2006-05-16 18:37:31 +00:00
										 |  |  |   UInt minimal_request = 0L; | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  |   Int size = request; | 
					
						
							| 
									
										
										
										
											2006-08-23 12:12:14 +00:00
										 |  |  |   char vb_msg1 = '\0', *vb_msg2; | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  |   bool do_grow = true; | 
					
						
							|  |  |  |   bool insert_in_delays = false; | 
					
						
							| 
									
										
										
										
											2009-03-16 17:30:13 +00:00
										 |  |  |   /*
 | 
					
						
							|  |  |  |     request is the amount of memory we requested, in bytes; | 
					
						
							|  |  |  |     base_move is the shift in global stacks we had to do | 
					
						
							|  |  |  |     size is how much space we allocate: it's negative if we just expand | 
					
						
							|  |  |  | 	the delay stack. | 
					
						
							|  |  |  |     do_grow is whether we expand stacks | 
					
						
							|  |  |  |   */ | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  |   if (hsplit) { | 
					
						
							|  |  |  |     /* just a little bit of sanity checking */ | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |     if (hsplit < H0 && hsplit > (CELL *)LOCAL_GlobalBase) { | 
					
						
							| 
									
										
										
										
											2009-03-16 17:30:13 +00:00
										 |  |  |       insert_in_delays = TRUE; | 
					
						
							| 
									
										
										
										
											2008-11-14 14:52:55 +00:00
										 |  |  |       /* expanding attributed variables */ | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |       if (omax - size > LOCAL_GlobalBase+4096*sizeof(CELL)) { | 
					
						
							| 
									
										
										
										
											2009-03-16 17:30:13 +00:00
										 |  |  | 	/* we can just ask for more room */ | 
					
						
							|  |  |  | 	size = 0; | 
					
						
							| 
									
										
										
										
											2009-02-26 23:06:27 +00:00
										 |  |  | 	do_grow = FALSE; | 
					
						
							| 
									
										
										
										
											2008-11-14 14:52:55 +00:00
										 |  |  |       } | 
					
						
							|  |  |  |     } else if (hsplit < (CELL*)omax || | 
					
						
							| 
									
										
										
										
											2014-01-19 21:15:05 +00:00
										 |  |  | 	hsplit > HR) | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  |       return FALSE; | 
					
						
							|  |  |  |     else if (hsplit == (CELL *)omax) | 
					
						
							|  |  |  |       hsplit = NULL; | 
					
						
							| 
									
										
										
										
											2008-11-14 14:52:55 +00:00
										 |  |  |     if (size < 0 || | 
					
						
							| 
									
										
										
										
											2014-01-19 21:15:05 +00:00
										 |  |  | 	(Unsigned(HR)+size < Unsigned(ASP)-StackGap( PASS_REGS1 ) && | 
					
						
							| 
									
										
										
										
											2008-11-14 14:52:55 +00:00
										 |  |  | 	 hsplit > H0)) { | 
					
						
							| 
									
										
										
										
											2006-11-06 18:35:05 +00:00
										 |  |  |       /* don't need to expand stacks */ | 
					
						
							| 
									
										
										
										
											2009-03-16 22:22:07 +00:00
										 |  |  |       insert_in_delays = FALSE; | 
					
						
							| 
									
										
										
										
											2006-11-06 18:35:05 +00:00
										 |  |  |       do_grow = FALSE; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-05-17 22:51:34 -07:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2014-01-19 21:15:05 +00:00
										 |  |  |     if (Unsigned(HR)+size < Unsigned(ASP)-CreepFlag) { | 
					
						
							| 
									
										
										
										
											2009-05-17 22:51:34 -07:00
										 |  |  |       /* we can just ask for more room */ | 
					
						
							|  |  |  |       do_grow = FALSE; | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2006-12-13 16:10:26 +00:00
										 |  |  |   if (do_grow) { | 
					
						
							| 
									
										
										
										
											2008-01-24 00:11:59 +00:00
										 |  |  |     if (size < YAP_ALLOC_SIZE) | 
					
						
							|  |  |  |       size = YAP_ALLOC_SIZE; | 
					
						
							| 
									
										
										
										
											2007-08-06 14:55:43 +00:00
										 |  |  |     size = AdjustPageSize(size); | 
					
						
							| 
									
										
										
										
											2006-12-13 16:10:26 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2006-11-06 18:35:05 +00:00
										 |  |  |   /* adjust to a multiple of 256) */ | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |   LOCAL_ErrorMessage = NULL; | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   LOCAL_PrologMode |= GrowStackMode; | 
					
						
							| 
									
										
										
										
											2006-11-06 18:35:05 +00:00
										 |  |  |   start_growth_time = Yap_cputime(); | 
					
						
							|  |  |  |   if (do_grow) { | 
					
						
							| 
									
										
										
										
											2011-05-10 10:06:51 +01:00
										 |  |  |     if (!GLOBAL_AllowGlobalExpansion) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |       LOCAL_ErrorMessage = "Global Stack crashed against Local Stack"; | 
					
						
							| 
									
										
										
										
											2009-05-10 13:36:55 -04:00
										 |  |  |       LeaveGrowMode(GrowStackMode); | 
					
						
							|  |  |  |       return 0; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-05-10 10:06:51 +01:00
										 |  |  |     if (!GLOBAL_AllowGlobalExpansion || !Yap_ExtendWorkSpace(size)) { | 
					
						
							| 
									
										
										
										
											2006-12-27 18:26:19 +00:00
										 |  |  |       /* always fails when using malloc */ | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |       LOCAL_ErrorMessage = NULL; | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |       size += AdjustPageSize(((CELL)LOCAL_TrailTop-(CELL)LOCAL_GlobalBase)+MinHeapGap); | 
					
						
							| 
									
										
										
										
											2007-01-28 14:26:37 +00:00
										 |  |  |       minimal_request = size; | 
					
						
							| 
									
										
										
										
											2006-11-06 18:35:05 +00:00
										 |  |  |       size = Yap_ExtendWorkSpaceThroughHole(size); | 
					
						
							|  |  |  |       if (size < 0) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	LOCAL_ErrorMessage = "Global Stack crashed against Local Stack"; | 
					
						
							| 
									
										
										
										
											2007-10-18 08:24:16 +00:00
										 |  |  | 	LeaveGrowMode(GrowStackMode); | 
					
						
							| 
									
										
										
										
											2006-12-13 16:10:26 +00:00
										 |  |  | 	return 0; | 
					
						
							| 
									
										
										
										
											2006-11-06 18:35:05 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2006-05-16 18:37:31 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   gc_verbose = Yap_is_gc_verbose(); | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   LOCAL_delay_overflows++; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (gc_verbose) { | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  |     if (hsplit) { | 
					
						
							|  |  |  |       if (hsplit > H0) { | 
					
						
							|  |  |  | 	vb_msg1 = 'H'; | 
					
						
							|  |  |  | 	vb_msg2 = "Global Variable Space"; | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  | 	vb_msg1 = 'D'; | 
					
						
							|  |  |  | 	vb_msg2 = "Global Variable Delay Space"; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       vb_msg1 = 'D'; | 
					
						
							|  |  |  |       vb_msg2 = "Delay"; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-04-14 18:51:11 +01:00
										 |  |  | #if  defined(YAPOR_THREADS)
 | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |     fprintf(stderr, "%% Worker Id %d:\n", worker_id); | 
					
						
							| 
									
										
										
										
											2008-01-23 17:57:56 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |     fprintf(stderr, "%% %cO %s Overflow %d\n", vb_msg1, vb_msg2, LOCAL_delay_overflows); | 
					
						
							|  |  |  |     fprintf(stderr, "%% %cO   growing the stacks %ld bytes\n", vb_msg1, size); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   ASP -= 256; | 
					
						
							| 
									
										
										
										
											2004-06-29 19:04:46 +00:00
										 |  |  |   YAPEnterCriticalSection(); | 
					
						
							| 
									
										
										
										
											2009-03-16 17:30:13 +00:00
										 |  |  |   /* we always shift the local and the stack by the same amount */ | 
					
						
							| 
									
										
										
										
											2006-11-06 18:35:05 +00:00
										 |  |  |   if (do_grow) { | 
					
						
							| 
									
										
										
										
											2009-06-02 18:08:18 -05:00
										 |  |  |     /* we got over a hole */ | 
					
						
							|  |  |  |     if (minimal_request) { | 
					
						
							|  |  |  |       /* we went over a hole */ | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |       LOCAL_BaseDiff = size+((CELL)LOCAL_TrailTop-(CELL)LOCAL_GlobalBase)-minimal_request; | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |       LOCAL_LDiff = LOCAL_TrDiff = size; | 
					
						
							| 
									
										
										
										
											2009-06-02 18:08:18 -05:00
										 |  |  |     } else { | 
					
						
							|  |  |  |       /* we may still have an overflow */ | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |       LOCAL_BaseDiff = LOCAL_GlobalBase - old_GlobalBase; | 
					
						
							| 
									
										
										
										
											2009-06-02 18:08:18 -05:00
										 |  |  |       /* if we grow, we need to move the stacks */ | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |       LOCAL_LDiff = LOCAL_TrDiff = LOCAL_BaseDiff+size; | 
					
						
							| 
									
										
										
										
											2009-06-02 18:08:18 -05:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2006-05-16 18:37:31 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2009-03-16 17:30:13 +00:00
										 |  |  |     /* stay still */ | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |     LOCAL_LDiff = LOCAL_TrDiff = 0; | 
					
						
							|  |  |  |     LOCAL_BaseDiff = 0; | 
					
						
							| 
									
										
										
										
											2009-03-16 17:30:13 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   /* now, remember we have delay -- global with a hole in delay or a
 | 
					
						
							| 
									
										
										
										
											2009-03-16 17:30:13 +00:00
										 |  |  |      hole in global */ | 
					
						
							| 
									
										
										
										
											2009-03-24 14:15:40 +00:00
										 |  |  |   if (!hsplit) { | 
					
						
							| 
									
										
										
										
											2009-05-17 22:51:34 -07:00
										 |  |  |     if (!do_grow) { | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |       LOCAL_DelayDiff = LOCAL_GDiff = LOCAL_GDiff0 = size; | 
					
						
							| 
									
										
										
										
											2009-05-17 22:51:34 -07:00
										 |  |  |       request = 0L; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       /* expand delay stack */ | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |       LOCAL_DelayDiff = LOCAL_GDiff = LOCAL_GDiff0 = LOCAL_LDiff; | 
					
						
							| 
									
										
										
										
											2009-05-17 22:51:34 -07:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-03-24 14:15:40 +00:00
										 |  |  |   } else if (insert_in_delays) { | 
					
						
							| 
									
										
										
										
											2009-03-16 17:30:13 +00:00
										 |  |  |     /* we want to expand a hole for the delay stack */ | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |     LOCAL_DelayDiff = size-request; | 
					
						
							|  |  |  |     LOCAL_GDiff = LOCAL_GDiff0 = size; | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2009-03-16 17:30:13 +00:00
										 |  |  |     /* we want to expand a hole for the delay stack */ | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |     LOCAL_GDiff0 = LOCAL_DelayDiff = LOCAL_BaseDiff; | 
					
						
							|  |  |  |     LOCAL_GDiff = LOCAL_BaseDiff+request; | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   LOCAL_GSplit = hsplit; | 
					
						
							|  |  |  |   LOCAL_XDiff = LOCAL_HDiff = 0; | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |   LOCAL_GlobalBase = old_GlobalBase; | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   SetHeapRegs(FALSE PASS_REGS); | 
					
						
							| 
									
										
										
										
											2006-11-06 18:35:05 +00:00
										 |  |  |   if (do_grow) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     MoveLocalAndTrail( PASS_REGS1 ); | 
					
						
							| 
									
										
										
										
											2006-11-06 18:35:05 +00:00
										 |  |  |     if (hsplit) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       MoveGlobalWithHole( PASS_REGS1 ); | 
					
						
							| 
									
										
										
										
											2006-11-06 18:35:05 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       MoveExpandedGlobal( PASS_REGS1 ); | 
					
						
							| 
									
										
										
										
											2006-11-06 18:35:05 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-05-17 22:51:34 -07:00
										 |  |  |   } else if (!hsplit) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     MoveExpandedGlobal( PASS_REGS1 ); | 
					
						
							| 
									
										
										
										
											2006-05-16 18:37:31 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2008-01-23 17:57:56 +00:00
										 |  |  |   /* don't run through garbage */ | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   if (hsplit && (LOCAL_OldH != hsplit)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     AdjustStacksAndTrail(request, FALSE PASS_REGS); | 
					
						
							| 
									
										
										
										
											2008-01-23 17:57:56 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     AdjustStacksAndTrail(0, FALSE PASS_REGS); | 
					
						
							| 
									
										
										
										
											2008-01-23 17:57:56 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   AdjustRegs(MaxTemps PASS_REGS); | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  |   if (ptr) { | 
					
						
							| 
									
										
										
										
											2002-05-07 03:51:59 +00:00
										 |  |  |     *ptr = PtoLocAdjust(*ptr); | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   if (hsplit) { | 
					
						
							| 
									
										
										
										
											2009-03-16 17:30:13 +00:00
										 |  |  |     if (insert_in_delays) { | 
					
						
							|  |  |  |       /* we have things not quite where we want to have them */ | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |       cpcellsd((CELL *)(omax+LOCAL_DelayDiff), (CELL *)(omax+LOCAL_GDiff0), (ADDR)hsplit-omax); | 
					
						
							| 
									
										
										
										
											2008-11-14 14:52:55 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       MoveHalfGlobal(hsplit PASS_REGS); | 
					
						
							| 
									
										
										
										
											2008-11-14 14:52:55 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   YAPLeaveCriticalSection(); | 
					
						
							|  |  |  |   ASP += 256; | 
					
						
							| 
									
										
										
										
											2006-05-16 18:37:31 +00:00
										 |  |  |   if (minimal_request) { | 
					
						
							|  |  |  |     Yap_AllocHole(minimal_request, size); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   growth_time = Yap_cputime()-start_growth_time; | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   LOCAL_total_delay_overflow_time += growth_time; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (gc_verbose) { | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |     fprintf(stderr, "%% %cO   took %g sec\n", vb_msg1, (double)growth_time/1000); | 
					
						
							|  |  |  |     fprintf(stderr, "%% %cO Total of %g sec expanding stacks \n", vb_msg1, (double)LOCAL_total_delay_overflow_time/1000); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2007-10-18 08:24:16 +00:00
										 |  |  |   LeaveGrowMode(GrowStackMode); | 
					
						
							| 
									
										
										
										
											2008-10-18 11:03:25 +01:00
										 |  |  |   if (hsplit) { | 
					
						
							| 
									
										
										
										
											2009-03-16 17:30:13 +00:00
										 |  |  |     return request; | 
					
						
							| 
									
										
										
										
											2008-10-18 11:03:25 +01:00
										 |  |  |   } else | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |     return LOCAL_GDiff-LOCAL_BaseDiff; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | fix_compiler_instructions(PInstr *pcpc USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  |   while (pcpc != NULL) { | 
					
						
							|  |  |  |     PInstr *ncpc = pcpc->nextInst; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  |     switch(pcpc->op) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       /* check c_var for functions that point at variables */ | 
					
						
							|  |  |  |     case get_var_op: | 
					
						
							|  |  |  |     case get_val_op: | 
					
						
							|  |  |  |     case unify_var_op: | 
					
						
							|  |  |  |     case unify_last_var_op: | 
					
						
							|  |  |  |     case unify_val_op: | 
					
						
							| 
									
										
										
										
											2004-08-20 16:16:23 +00:00
										 |  |  |     case unify_local_op: | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     case unify_last_val_op: | 
					
						
							| 
									
										
										
										
											2004-08-20 16:16:23 +00:00
										 |  |  |     case unify_last_local_op: | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     case put_var_op: | 
					
						
							|  |  |  |     case put_val_op: | 
					
						
							| 
									
										
										
										
											2004-08-20 16:16:23 +00:00
										 |  |  |     case put_unsafe_op: | 
					
						
							|  |  |  |     case write_unsafe_op: | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     case write_var_op: | 
					
						
							|  |  |  |     case write_val_op: | 
					
						
							| 
									
										
										
										
											2004-08-20 16:16:23 +00:00
										 |  |  |     case write_local_op: | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     case f_var_op: | 
					
						
							|  |  |  |     case f_val_op: | 
					
						
							|  |  |  |     case save_pair_op: | 
					
						
							|  |  |  |     case save_appl_op: | 
					
						
							|  |  |  |     case save_b_op: | 
					
						
							| 
									
										
										
										
											2003-12-27 00:38:53 +00:00
										 |  |  |     case commit_b_op: | 
					
						
							| 
									
										
										
										
											2006-11-06 18:35:05 +00:00
										 |  |  |     case fetch_args_vv_op: | 
					
						
							| 
									
										
										
										
											2004-08-20 16:16:23 +00:00
										 |  |  |     case fetch_args_cv_op: | 
					
						
							|  |  |  |     case fetch_args_vc_op: | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  |       pcpc->rnd1 = GlobalAdjust(pcpc->rnd1); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       break; | 
					
						
							| 
									
										
										
										
											2014-10-02 14:38:23 +01:00
										 |  |  |     case bccall_op: | 
					
						
							|  |  |  |       pcpc->rnd1 = GlobalAdjust(pcpc->rnd1); | 
					
						
							|  |  |  |       pcpc->rnd3 = GlobalAdjust(pcpc->rnd3); | 
					
						
							|  |  |  |       break; | 
					
						
							| 
									
										
										
										
											2006-09-20 20:03:51 +00:00
										 |  |  |     case get_float_op: | 
					
						
							|  |  |  |     case put_float_op: | 
					
						
							|  |  |  |     case get_longint_op: | 
					
						
							| 
									
										
										
										
											2013-12-02 14:49:41 +00:00
										 |  |  |     case get_string_op: | 
					
						
							| 
									
										
										
										
											2006-09-20 20:03:51 +00:00
										 |  |  |     case put_longint_op: | 
					
						
							| 
									
										
										
										
											2013-12-02 14:49:41 +00:00
										 |  |  |     case put_string_op: | 
					
						
							| 
									
										
										
										
											2006-09-20 20:03:51 +00:00
										 |  |  |     case unify_float_op: | 
					
						
							|  |  |  |     case unify_last_float_op: | 
					
						
							|  |  |  |     case write_float_op: | 
					
						
							|  |  |  |       /* floats might be in the global */ | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       pcpc->rnd1 = AdjustAppl(pcpc->rnd1 PASS_REGS); | 
					
						
							| 
									
										
										
										
											2006-09-20 20:03:51 +00:00
										 |  |  |       break; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       /* hopefully nothing to do */ | 
					
						
							| 
									
										
										
										
											2004-08-20 16:16:23 +00:00
										 |  |  |     case nop_op: | 
					
						
							| 
									
										
										
										
											2010-08-02 19:48:01 +01:00
										 |  |  |     case ensure_space_op: | 
					
						
							| 
									
										
										
										
											2004-08-20 16:16:23 +00:00
										 |  |  |     case get_atom_op: | 
					
						
							|  |  |  |     case put_atom_op: | 
					
						
							|  |  |  |     case get_num_op: | 
					
						
							|  |  |  |     case put_num_op: | 
					
						
							|  |  |  |     case align_float_op: | 
					
						
							|  |  |  |     case get_bigint_op: | 
					
						
							|  |  |  |     case put_bigint_op: | 
					
						
							| 
									
										
										
										
											2007-11-06 17:02:13 +00:00
										 |  |  |     case get_dbterm_op: | 
					
						
							|  |  |  |     case put_dbterm_op: | 
					
						
							| 
									
										
										
										
											2004-08-20 16:16:23 +00:00
										 |  |  |     case get_list_op: | 
					
						
							|  |  |  |     case put_list_op: | 
					
						
							|  |  |  |     case get_struct_op: | 
					
						
							|  |  |  |     case put_struct_op: | 
					
						
							|  |  |  |     case unify_atom_op: | 
					
						
							|  |  |  |     case unify_last_atom_op: | 
					
						
							|  |  |  |     case write_atom_op: | 
					
						
							|  |  |  |     case unify_num_op: | 
					
						
							|  |  |  |     case unify_last_num_op: | 
					
						
							|  |  |  |     case write_num_op: | 
					
						
							|  |  |  |     case unify_longint_op: | 
					
						
							| 
									
										
										
										
											2013-12-02 14:49:41 +00:00
										 |  |  |     case unify_string_op: | 
					
						
							| 
									
										
										
										
											2004-08-20 16:16:23 +00:00
										 |  |  |     case unify_last_longint_op: | 
					
						
							| 
									
										
										
										
											2013-12-02 14:49:41 +00:00
										 |  |  |     case unify_last_string_op: | 
					
						
							| 
									
										
										
										
											2004-08-20 16:16:23 +00:00
										 |  |  |     case write_longint_op: | 
					
						
							| 
									
										
										
										
											2013-12-02 14:49:41 +00:00
										 |  |  |     case write_string_op: | 
					
						
							| 
									
										
										
										
											2004-08-20 16:16:23 +00:00
										 |  |  |     case unify_bigint_op: | 
					
						
							|  |  |  |     case unify_last_bigint_op: | 
					
						
							| 
									
										
										
										
											2007-11-06 17:02:13 +00:00
										 |  |  |     case unify_dbterm_op: | 
					
						
							|  |  |  |     case unify_last_dbterm_op: | 
					
						
							| 
									
										
										
										
											2004-08-20 16:16:23 +00:00
										 |  |  |     case write_bigint_op: | 
					
						
							| 
									
										
										
										
											2007-11-06 17:02:13 +00:00
										 |  |  |     case write_dbterm_op: | 
					
						
							| 
									
										
										
										
											2004-08-20 16:16:23 +00:00
										 |  |  |     case unify_list_op: | 
					
						
							|  |  |  |     case write_list_op: | 
					
						
							|  |  |  |     case unify_struct_op: | 
					
						
							|  |  |  |     case write_struct_op: | 
					
						
							|  |  |  |     case fail_op: | 
					
						
							|  |  |  |     case cut_op: | 
					
						
							|  |  |  |     case cutexit_op: | 
					
						
							|  |  |  |     case allocate_op: | 
					
						
							|  |  |  |     case deallocate_op: | 
					
						
							|  |  |  |     case tryme_op: | 
					
						
							|  |  |  |     case jump_op: | 
					
						
							|  |  |  |     case jumpi_op: | 
					
						
							|  |  |  |     case procceed_op: | 
					
						
							|  |  |  |     case call_op: | 
					
						
							|  |  |  |     case execute_op: | 
					
						
							|  |  |  |     case safe_call_op: | 
					
						
							|  |  |  |     case label_op: | 
					
						
							|  |  |  |     case name_op: | 
					
						
							|  |  |  |     case pop_op: | 
					
						
							|  |  |  |     case retryme_op: | 
					
						
							|  |  |  |     case trustme_op: | 
					
						
							|  |  |  |     case either_op: | 
					
						
							|  |  |  |     case orelse_op: | 
					
						
							|  |  |  |     case orlast_op: | 
					
						
							|  |  |  |     case push_or_op: | 
					
						
							|  |  |  |     case pushpop_or_op: | 
					
						
							|  |  |  |     case pop_or_op: | 
					
						
							|  |  |  |     case patch_b_op: | 
					
						
							|  |  |  |     case try_op: | 
					
						
							|  |  |  |     case retry_op: | 
					
						
							|  |  |  |     case trust_op: | 
					
						
							|  |  |  |     case try_in_op: | 
					
						
							|  |  |  |     case jump_v_op: | 
					
						
							|  |  |  |     case jump_nv_op: | 
					
						
							|  |  |  |     case cache_arg_op: | 
					
						
							|  |  |  |     case cache_sub_arg_op: | 
					
						
							| 
									
										
										
										
											2009-02-12 21:35:31 +00:00
										 |  |  |     case user_switch_op: | 
					
						
							| 
									
										
										
										
											2004-08-20 16:16:23 +00:00
										 |  |  |     case switch_on_type_op: | 
					
						
							|  |  |  |     case switch_c_op: | 
					
						
							|  |  |  |     case if_c_op: | 
					
						
							|  |  |  |     case switch_f_op: | 
					
						
							|  |  |  |     case if_f_op: | 
					
						
							|  |  |  |     case if_not_op: | 
					
						
							|  |  |  |     case index_dbref_op: | 
					
						
							|  |  |  |     case index_blob_op: | 
					
						
							| 
									
										
										
										
											2009-02-09 21:56:40 +00:00
										 |  |  |     case index_long_op: | 
					
						
							| 
									
										
										
										
											2014-01-19 21:15:05 +00:00
										 |  |  |     case index_string_op: | 
					
						
							| 
									
										
										
										
											2004-08-20 16:16:23 +00:00
										 |  |  |     case if_nonvar_op: | 
					
						
							|  |  |  |     case unify_last_list_op: | 
					
						
							|  |  |  |     case write_last_list_op: | 
					
						
							|  |  |  |     case unify_last_struct_op: | 
					
						
							|  |  |  |     case write_last_struct_op: | 
					
						
							| 
									
										
										
										
											2015-11-05 15:21:56 +00:00
										 |  |  |     case mark_initialized_pvars_op: | 
					
						
							| 
									
										
										
										
											2004-08-20 16:16:23 +00:00
										 |  |  |     case mark_live_regs_op: | 
					
						
							| 
									
										
										
										
											2009-06-22 12:40:55 -05:00
										 |  |  |     case enter_profiling_op: | 
					
						
							| 
									
										
										
										
											2004-08-20 16:16:23 +00:00
										 |  |  |     case retry_profiled_op: | 
					
						
							| 
									
										
										
										
											2009-06-22 12:40:55 -05:00
										 |  |  |     case count_call_op: | 
					
						
							| 
									
										
										
										
											2004-08-20 16:16:23 +00:00
										 |  |  |     case count_retry_op: | 
					
						
							|  |  |  |     case restore_tmps_op: | 
					
						
							|  |  |  |     case restore_tmps_and_skip_op: | 
					
						
							|  |  |  |     case enter_lu_op: | 
					
						
							|  |  |  |     case empty_call_op: | 
					
						
							|  |  |  |     case blob_op: | 
					
						
							| 
									
										
										
										
											2014-01-19 21:15:05 +00:00
										 |  |  |     case string_op: | 
					
						
							| 
									
										
										
										
											2006-11-06 18:35:05 +00:00
										 |  |  |     case fetch_args_vi_op: | 
					
						
							|  |  |  |     case fetch_args_iv_op: | 
					
						
							| 
									
										
										
										
											2008-12-09 12:54:27 +00:00
										 |  |  |     case label_ctl_op: | 
					
						
							| 
									
										
										
										
											2009-03-09 11:52:01 +00:00
										 |  |  |     case f_0_op: | 
					
						
							| 
									
										
										
										
											2009-04-18 17:55:18 -05:00
										 |  |  |     case native_op: | 
					
						
							| 
									
										
										
										
											2005-03-04 20:30:14 +00:00
										 |  |  | #ifdef TABLING
 | 
					
						
							|  |  |  |     case table_new_answer_op: | 
					
						
							|  |  |  |     case table_try_single_op: | 
					
						
							|  |  |  | #endif /* TABLING */
 | 
					
						
							| 
									
										
										
										
											2008-03-25 16:45:53 +00:00
										 |  |  | #ifdef YAPOR
 | 
					
						
							|  |  |  |     case sync_op: | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | #ifdef BEAM
 | 
					
						
							|  |  |  |     case run_op: | 
					
						
							|  |  |  |     case body_op: | 
					
						
							|  |  |  |     case endgoal_op: | 
					
						
							|  |  |  |     case try_me_op: | 
					
						
							|  |  |  |     case retry_me_op: | 
					
						
							|  |  |  |     case trust_me_op: | 
					
						
							|  |  |  |     case only_1_clause_op: | 
					
						
							|  |  |  |     case create_first_box_op: | 
					
						
							|  |  |  |     case create_box_op: | 
					
						
							|  |  |  |     case create_last_box_op: | 
					
						
							|  |  |  |     case remove_box_op: | 
					
						
							|  |  |  |     case remove_last_box_op: | 
					
						
							|  |  |  |     case prepare_tries: | 
					
						
							|  |  |  |     case std_base_op: | 
					
						
							|  |  |  |     case direct_safe_call_op: | 
					
						
							|  |  |  |     case commit_op: | 
					
						
							|  |  |  |     case skip_while_var_op: | 
					
						
							|  |  |  |     case wait_while_var_op: | 
					
						
							|  |  |  |     case force_wait_op: | 
					
						
							|  |  |  |     case write_op: | 
					
						
							|  |  |  |     case is_op: | 
					
						
							|  |  |  |     case equal_op: | 
					
						
							|  |  |  |     case exit_op: | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (ncpc != NULL) { | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  |       ncpc = (PInstr *)GlobalAddrAdjust((ADDR)(pcpc->nextInst)); | 
					
						
							|  |  |  |       pcpc->nextInst = ncpc; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  |     pcpc = ncpc; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef TABLING
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | fix_tabling_info( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   /* we must fix the dependency frames and the subgoal frames, as they are
 | 
					
						
							|  |  |  |      pointing back to the global stack. */ | 
					
						
							|  |  |  |   struct dependency_frame *df; | 
					
						
							|  |  |  |   struct subgoal_frame *sg; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   df = LOCAL_top_dep_fr; | 
					
						
							| 
									
										
										
										
											2005-11-15 00:50:49 +00:00
										 |  |  |   while (df) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     if (DepFr_backchain_cp(df)) | 
					
						
							|  |  |  |       DepFr_backchain_cp(df) = ChoicePtrAdjust(DepFr_backchain_cp(df)); | 
					
						
							| 
									
										
										
										
											2011-09-04 13:05:09 +02:00
										 |  |  |     if (DepFr_leader_cp(df)) | 
					
						
							|  |  |  |       DepFr_leader_cp(df) = ChoicePtrAdjust(DepFr_leader_cp(df)); | 
					
						
							|  |  |  |     if (DepFr_cons_cp(df)) | 
					
						
							|  |  |  |       DepFr_cons_cp(df) = ConsumerChoicePtrAdjust(DepFr_cons_cp(df)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     df = DepFr_next(df); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   sg = LOCAL_top_sg_fr; | 
					
						
							| 
									
										
										
										
											2005-11-15 00:50:49 +00:00
										 |  |  |   while (sg) { | 
					
						
							| 
									
										
										
										
											2011-09-04 13:05:09 +02:00
										 |  |  |     if (SgFr_gen_cp(sg)) | 
					
						
							|  |  |  |       SgFr_gen_cp(sg) = GeneratorChoicePtrAdjust(SgFr_gen_cp(sg)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     sg = SgFr_next(sg); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif /* TABLING */
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-10-28 01:16:03 +00:00
										 |  |  | static int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | do_growheap(int fix_code, UInt in_size, struct intermediates *cip, tr_fr_ptr *old_trp, TokEntry **tksp, VarEntry **vep USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-11 12:25:49 +01:00
										 |  |  |   unsigned long size = sizeof(CELL) * K16; | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   int shift_factor = (LOCAL_heap_overflows > 8 ? 8 : LOCAL_heap_overflows); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   unsigned long sz =  size << shift_factor; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-19 13:04:09 +00:00
										 |  |  |   if (sz < in_size) { | 
					
						
							|  |  |  |     sz = in_size; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-04-29 14:59:17 +01:00
										 |  |  | #ifdef YAPOR
 | 
					
						
							| 
									
										
										
										
											2015-09-25 10:57:26 +01:00
										 |  |  |   Yap_Error(RESOURCE_ERROR_HEAP,TermNil,"cannot grow Heap: more than a worker/thread running"); | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  |   return FALSE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2011-05-10 10:06:51 +01:00
										 |  |  |   if (GLOBAL_SizeOfOverflow > sz) { | 
					
						
							| 
									
										
										
										
											2008-01-24 00:11:59 +00:00
										 |  |  |     if (size < YAP_ALLOC_SIZE) | 
					
						
							|  |  |  |       size = YAP_ALLOC_SIZE; | 
					
						
							| 
									
										
										
										
											2011-05-10 10:06:51 +01:00
										 |  |  |     sz = AdjustPageSize(GLOBAL_SizeOfOverflow); | 
					
						
							| 
									
										
										
										
											2008-01-24 00:11:59 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   while(sz >= sizeof(CELL) * K16 && !static_growheap(sz, fix_code, cip, old_trp, tksp, vep PASS_REGS)) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     size = size/2; | 
					
						
							|  |  |  |     sz =  size << shift_factor; | 
					
						
							| 
									
										
										
										
											2003-05-19 13:04:09 +00:00
										 |  |  |     if (sz < in_size) { | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   /* we must fix an instruction chain */ | 
					
						
							|  |  |  |   if (fix_code) { | 
					
						
							| 
									
										
										
										
											2004-01-23 02:23:51 +00:00
										 |  |  |     PInstr *pcpc = cip->CodeStart; | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  |     if (pcpc != NULL) { | 
					
						
							| 
									
										
										
										
											2004-01-23 02:23:51 +00:00
										 |  |  |       cip->CodeStart = pcpc = (PInstr *)GlobalAddrAdjust((ADDR)pcpc); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     fix_compiler_instructions(pcpc PASS_REGS); | 
					
						
							| 
									
										
										
										
											2004-01-23 02:23:51 +00:00
										 |  |  |     pcpc = cip->BlobsStart; | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  |     if (pcpc != NULL) { | 
					
						
							| 
									
										
										
										
											2004-01-23 02:23:51 +00:00
										 |  |  |       cip->BlobsStart = pcpc = (PInstr *)GlobalAddrAdjust((ADDR)pcpc); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     fix_compiler_instructions(pcpc PASS_REGS); | 
					
						
							| 
									
										
										
										
											2004-01-23 02:23:51 +00:00
										 |  |  |     cip->freep = (char *)GlobalAddrAdjust((ADDR)cip->freep); | 
					
						
							| 
									
										
										
										
											2010-03-30 10:58:46 +01:00
										 |  |  |     cip->label_offset = (Int *)GlobalAddrAdjust((ADDR)cip->label_offset); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | #ifdef TABLING
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   fix_tabling_info( PASS_REGS1 ); | 
					
						
							| 
									
										
										
										
											2003-11-07 16:31:08 +00:00
										 |  |  | #endif /* TABLING */
 | 
					
						
							| 
									
										
										
										
											2010-05-11 12:25:49 +01:00
										 |  |  |   if (sz >= sizeof(CELL) * K16) { | 
					
						
							| 
									
										
										
										
											2014-09-02 14:19:23 -05:00
										 |  |  |     Yap_get_signal(  YAP_CDOVF_SIGNAL ); | 
					
						
							| 
									
										
										
										
											2004-01-26 12:41:06 +00:00
										 |  |  |     return TRUE; | 
					
						
							| 
									
										
										
										
											2002-10-10 05:58:49 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   /* failed */ | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  |   return FALSE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-02-18 00:26:36 +00:00
										 |  |  | static void | 
					
						
							|  |  |  | init_new_table(AtomHashEntry *ntb, UInt nsize) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   UInt i; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-09 09:21:07 +00:00
										 |  |  |   for (i = 0; i < nsize; i++) { | 
					
						
							| 
									
										
										
										
											2007-02-18 00:26:36 +00:00
										 |  |  |     INIT_RWLOCK(ntb[i].AERWLock); | 
					
						
							|  |  |  |     ntb[i].Entry = NIL; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | cp_atom_table(AtomHashEntry *ntb, UInt nsize) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   UInt i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   for (i = 0; i < AtomHashTableSize; i++) { | 
					
						
							|  |  |  |     Atom            catom; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     READ_LOCK(HashChain[i].AERWLock); | 
					
						
							|  |  |  |     catom = HashChain[i].Entry; | 
					
						
							|  |  |  |     while (catom != NIL) { | 
					
						
							|  |  |  |       AtomEntry *ap = RepAtom(catom); | 
					
						
							|  |  |  |       Atom natom; | 
					
						
							|  |  |  |       CELL hash; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-21 17:05:36 -05:00
										 |  |  |       hash = HashFunction(ap->UStrOfAE) % nsize; | 
					
						
							| 
									
										
										
										
											2007-02-18 00:26:36 +00:00
										 |  |  |       natom = ap->NextOfAE; | 
					
						
							|  |  |  |       ap->NextOfAE = ntb[hash].Entry; | 
					
						
							|  |  |  |       ntb[hash].Entry = catom; | 
					
						
							|  |  |  |       catom = natom; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     READ_UNLOCK(HashChain[i].AERWLock); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-22 21:32:23 +00:00
										 |  |  | static int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | growatomtable( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2004-07-22 21:32:23 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   AtomHashEntry *ntb; | 
					
						
							| 
									
										
										
										
											2011-12-28 12:46:48 +00:00
										 |  |  |   UInt nsize = 3*AtomHashTableSize-1; | 
					
						
							| 
									
										
										
										
											2004-07-22 21:32:23 +00:00
										 |  |  |   UInt start_growth_time = Yap_cputime(), growth_time; | 
					
						
							|  |  |  |   int gc_verbose = Yap_is_gc_verbose(); | 
					
						
							| 
									
										
										
										
											2011-12-28 12:46:48 +00:00
										 |  |  |   if (nsize -AtomHashTableSize  > 4*1024*1024) | 
					
						
							|  |  |  |     nsize =  AtomHashTableSize+4*1024*1024+7919; | 
					
						
							| 
									
										
										
										
											2004-07-22 21:32:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-02 14:19:23 -05:00
										 |  |  |   Yap_get_signal(  YAP_CDOVF_SIGNAL ); | 
					
						
							| 
									
										
										
										
											2004-07-22 21:32:23 +00:00
										 |  |  |   while ((ntb = (AtomHashEntry *)Yap_AllocCodeSpace(nsize*sizeof(AtomHashEntry))) == NULL) { | 
					
						
							|  |  |  |     /* leave for next time */ | 
					
						
							| 
									
										
										
										
											2004-09-14 03:30:06 +00:00
										 |  |  | #if !USE_SYSTEM_MALLOC
 | 
					
						
							| 
									
										
										
										
											2007-04-18 06:30:41 +00:00
										 |  |  |     if (!do_growheap(FALSE, nsize*sizeof(AtomHashEntry), NULL, NULL, NULL, NULL)) | 
					
						
							| 
									
										
										
										
											2004-09-14 03:30:06 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2004-07-22 21:32:23 +00:00
										 |  |  |       return FALSE; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   LOCAL_atom_table_overflows ++; | 
					
						
							| 
									
										
										
										
											2004-07-22 21:32:23 +00:00
										 |  |  |   if (gc_verbose) { | 
					
						
							| 
									
										
										
										
											2011-04-14 18:51:11 +01:00
										 |  |  | #if  defined(YAPOR_THREADS)
 | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |     fprintf(stderr, "%% Worker Id %d:\n", worker_id); | 
					
						
							| 
									
										
										
										
											2008-01-23 17:57:56 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |     fprintf(stderr, "%% Atom Table Overflow %d\n", LOCAL_atom_table_overflows ); | 
					
						
							|  |  |  |     fprintf(stderr, "%%    growing the atom table to %ld entries\n", (long int)(nsize)); | 
					
						
							| 
									
										
										
										
											2004-07-22 21:32:23 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   YAPEnterCriticalSection(); | 
					
						
							| 
									
										
										
										
											2007-02-18 00:26:36 +00:00
										 |  |  |   init_new_table(ntb, nsize); | 
					
						
							|  |  |  |   cp_atom_table(ntb, nsize); | 
					
						
							| 
									
										
										
										
											2004-07-22 21:32:23 +00:00
										 |  |  |   Yap_FreeCodeSpace((char *)HashChain); | 
					
						
							|  |  |  |   HashChain = ntb; | 
					
						
							|  |  |  |   AtomHashTableSize = nsize; | 
					
						
							|  |  |  |   YAPLeaveCriticalSection(); | 
					
						
							|  |  |  |   growth_time = Yap_cputime()-start_growth_time; | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   LOCAL_total_atom_table_overflow_time += growth_time; | 
					
						
							| 
									
										
										
										
											2004-07-22 21:32:23 +00:00
										 |  |  |   if (gc_verbose) { | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |     fprintf(stderr, "%%   took %g sec\n", (double)growth_time/1000); | 
					
						
							|  |  |  |     fprintf(stderr, "%% Total of %g sec expanding atom table \n", (double)LOCAL_total_atom_table_overflow_time/1000); | 
					
						
							| 
									
										
										
										
											2004-07-22 21:32:23 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2004-09-13 21:18:35 +00:00
										 |  |  | #if USE_SYSTEM_MALLOC
 | 
					
						
							|  |  |  |   return TRUE; | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2008-01-23 17:57:56 +00:00
										 |  |  |   if (HeapTop + sizeof(YAP_SEG_SIZE)  > HeapLim - MinHeapGap) { | 
					
						
							| 
									
										
										
										
											2004-07-22 21:32:23 +00:00
										 |  |  |     /* make sure there is no heap overflow */ | 
					
						
							|  |  |  |     int res; | 
					
						
							| 
									
										
										
										
											2012-03-03 21:46:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     res = do_growheap(FALSE, 0, NULL, NULL, NULL, NULL PASS_REGS); | 
					
						
							| 
									
										
										
										
											2004-07-22 21:32:23 +00:00
										 |  |  |     return res; | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     return TRUE; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2004-09-13 21:18:35 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2004-07-22 21:32:23 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-10-28 01:16:03 +00:00
										 |  |  | int | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  | Yap_locked_growheap(bool fix_code, size_t in_size, void *cip) | 
					
						
							| 
									
										
										
										
											2003-10-28 01:16:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2004-06-29 19:04:46 +00:00
										 |  |  |   int res; | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  |   bool blob_overflow = (NOfBlobs > NOfBlobsMax); | 
					
						
							| 
									
										
										
										
											2004-06-29 19:04:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-14 10:27:39 +01:00
										 |  |  | #ifdef THREADS
 | 
					
						
							| 
									
										
										
										
											2014-10-19 01:52:39 +01:00
										 |  |  |   LOCK(GLOBAL_BGL); | 
					
						
							| 
									
										
										
										
											2014-06-14 10:27:39 +01:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2014-06-04 22:08:37 +01:00
										 |  |  |   // make sure that we cannot have more than a thread life
 | 
					
						
							|  |  |  |   if (Yap_NOfThreads() > 1) { | 
					
						
							| 
									
										
										
										
											2014-06-14 10:27:39 +01:00
										 |  |  | #ifdef THREADS
 | 
					
						
							| 
									
										
										
										
											2014-10-19 01:52:39 +01:00
										 |  |  |       UNLOCK(GLOBAL_BGL); | 
					
						
							| 
									
										
										
										
											2014-06-14 10:27:39 +01:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2014-06-04 22:08:37 +01:00
										 |  |  |       res = FALSE; | 
					
						
							|  |  |  |       if (NOfAtoms > 2*AtomHashTableSize || blob_overflow) { | 
					
						
							| 
									
										
										
										
											2014-09-02 14:19:23 -05:00
										 |  |  | 	  Yap_get_signal( YAP_CDOVF_SIGNAL ); | 
					
						
							| 
									
										
										
										
											2014-06-04 22:08:37 +01:00
										 |  |  | 	  return TRUE; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2014-03-06 02:09:48 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-06-04 22:08:37 +01:00
										 |  |  |   // don't release the MTHREAD lock in case we're running from the C-interface.
 | 
					
						
							| 
									
										
										
										
											2011-12-22 10:27:56 +00:00
										 |  |  |   if (NOfAtoms > 2*AtomHashTableSize || blob_overflow) { | 
					
						
							| 
									
										
										
										
											2007-02-18 00:26:36 +00:00
										 |  |  |     UInt n = NOfAtoms; | 
					
						
							| 
									
										
										
										
											2011-05-10 10:06:51 +01:00
										 |  |  |     if (GLOBAL_AGcThreshold) | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       Yap_atom_gc( PASS_REGS1 ); | 
					
						
							| 
									
										
										
										
											2007-02-18 00:26:36 +00:00
										 |  |  |     /* check if we have a significant improvement from agc */ | 
					
						
							| 
									
										
										
										
											2011-12-22 10:27:56 +00:00
										 |  |  |     if (!blob_overflow && | 
					
						
							|  |  |  | 	(n > NOfAtoms+ NOfAtoms/10 || | 
					
						
							|  |  |  | 	 /* +1 = make sure we didn't lose the current atom */ | 
					
						
							|  |  |  | 	 NOfAtoms+1 > 2*AtomHashTableSize)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       res  = growatomtable( PASS_REGS1 ); | 
					
						
							| 
									
										
										
										
											2007-02-18 00:26:36 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2014-06-14 10:27:39 +01:00
										 |  |  | #ifdef THREADS
 | 
					
						
							| 
									
										
										
										
											2014-10-19 01:52:39 +01:00
										 |  |  |       UNLOCK(GLOBAL_BGL); | 
					
						
							| 
									
										
										
										
											2014-06-14 10:27:39 +01:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2007-02-18 00:26:36 +00:00
										 |  |  |       return TRUE; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2007-10-18 08:24:16 +00:00
										 |  |  |     LeaveGrowMode(GrowHeapMode); | 
					
						
							| 
									
										
										
										
											2014-06-04 22:08:37 +01:00
										 |  |  |     if (res) { | 
					
						
							| 
									
										
										
										
											2014-06-14 10:27:39 +01:00
										 |  |  | #ifdef THREADS
 | 
					
						
							| 
									
										
										
										
											2014-10-19 01:52:39 +01:00
										 |  |  | 	UNLOCK(GLOBAL_BGL); | 
					
						
							| 
									
										
										
										
											2014-06-14 10:27:39 +01:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2011-06-27 22:55:30 +01:00
										 |  |  |       return res; | 
					
						
							| 
									
										
										
										
											2014-06-04 22:08:37 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2004-07-22 21:32:23 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-12-22 10:27:56 +00:00
										 |  |  | #if USE_SYSTEM_MALLOC
 | 
					
						
							| 
									
										
										
										
											2015-09-25 10:57:26 +01:00
										 |  |  |   P = Yap_Error(RESOURCE_ERROR_HEAP,TermNil,"malloc failed"); | 
					
						
							| 
									
										
										
										
											2012-12-14 19:35:26 +00:00
										 |  |  |   res = FALSE; | 
					
						
							| 
									
										
										
										
											2011-12-22 10:27:56 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   res=do_growheap(fix_code, in_size, (struct intermediates *)cip, NULL, NULL, NULL PASS_REGS); | 
					
						
							| 
									
										
										
										
											2011-12-22 10:27:56 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2007-10-18 08:24:16 +00:00
										 |  |  |   LeaveGrowMode(GrowHeapMode); | 
					
						
							| 
									
										
										
										
											2014-06-14 10:27:39 +01:00
										 |  |  | #ifdef THREADS
 | 
					
						
							| 
									
										
										
										
											2014-10-19 01:52:39 +01:00
										 |  |  |   UNLOCK(GLOBAL_BGL); | 
					
						
							| 
									
										
										
										
											2014-06-14 10:27:39 +01:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2007-04-18 06:30:41 +00:00
										 |  |  |   return res; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-23 22:41:12 +01:00
										 |  |  | int | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  | Yap_growheap(bool fix_code, size_t in_size, void *cip) | 
					
						
							| 
									
										
										
										
											2014-04-23 22:41:12 +01:00
										 |  |  | { | 
					
						
							|  |  |  |   int rc; | 
					
						
							|  |  |  |   rc = Yap_locked_growheap(fix_code, in_size, cip); | 
					
						
							|  |  |  |   return rc; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-04-18 06:30:41 +00:00
										 |  |  | int | 
					
						
							|  |  |  | Yap_growheap_in_parser(tr_fr_ptr *old_trp, TokEntry **tksp, VarEntry **vep) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2007-04-18 06:30:41 +00:00
										 |  |  |   int res; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   res=do_growheap(FALSE, 0L, NULL, old_trp, tksp, vep PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-10-18 08:24:16 +00:00
										 |  |  |   LeaveGrowMode(GrowHeapMode); | 
					
						
							| 
									
										
										
										
											2004-06-29 19:04:46 +00:00
										 |  |  |   return res; | 
					
						
							| 
									
										
										
										
											2003-10-28 01:16:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | int | 
					
						
							| 
									
										
										
										
											2014-04-23 22:41:12 +01:00
										 |  |  | Yap_locked_growglobal(CELL **ptr) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2010-05-11 12:25:49 +01:00
										 |  |  |   unsigned long sz = sizeof(CELL) * K16; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-14 18:51:11 +01:00
										 |  |  | #if defined(YAPOR_THREADS)
 | 
					
						
							| 
									
										
										
										
											2011-05-10 11:47:18 +01:00
										 |  |  |   if (GLOBAL_number_workers != 1) { | 
					
						
							| 
									
										
										
										
											2015-09-25 10:57:26 +01:00
										 |  |  |     Yap_Error(RESOURCE_ERROR_STACK,TermNil,"cannot grow Global: more than a worker/thread running"); | 
					
						
							| 
									
										
										
										
											2010-10-15 01:15:45 +01:00
										 |  |  |     return(FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | #elif defined(THREADS)
 | 
					
						
							| 
									
										
										
										
											2011-05-10 10:06:51 +01:00
										 |  |  |   if (GLOBAL_NOfThreads != 1) { | 
					
						
							| 
									
										
										
										
											2015-09-25 10:57:26 +01:00
										 |  |  |     Yap_Error(RESOURCE_ERROR_STACK,TermNil,"cannot grow Global: more than a worker/thread running"); | 
					
						
							| 
									
										
										
										
											2002-10-21 22:52:36 +00:00
										 |  |  |     return(FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   if ( static_growglobal(sz, ptr, NULL PASS_REGS) == 0) | 
					
						
							| 
									
										
										
										
											2006-12-13 16:10:26 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #ifdef TABLING
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   fix_tabling_info( PASS_REGS1 ); | 
					
						
							| 
									
										
										
										
											2003-11-07 16:31:08 +00:00
										 |  |  | #endif /* TABLING */
 | 
					
						
							| 
									
										
										
										
											2006-12-13 16:10:26 +00:00
										 |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-23 22:41:12 +01:00
										 |  |  | int | 
					
						
							|  |  |  | Yap_growglobal(CELL **ptr) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  |   int rc; | 
					
						
							| 
									
										
										
										
											2014-04-23 22:41:12 +01:00
										 |  |  |   rc = Yap_locked_growglobal(ptr); | 
					
						
							|  |  |  |   return rc; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-12-13 16:10:26 +00:00
										 |  |  | UInt | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  | Yap_InsertInGlobal(CELL *where, size_t howmuch) | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   if ((howmuch = static_growglobal(howmuch, NULL, where PASS_REGS)) == 0) | 
					
						
							| 
									
										
										
										
											2006-12-13 16:10:26 +00:00
										 |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  | #ifdef TABLING
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   fix_tabling_info( PASS_REGS1 ); | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  | #endif /* TABLING */
 | 
					
						
							| 
									
										
										
										
											2006-12-13 16:10:26 +00:00
										 |  |  |   return howmuch; | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-23 22:41:12 +01:00
										 |  |  | int | 
					
						
							|  |  |  | Yap_locked_growstack(size_t size) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   int res; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   LOCAL_PrologMode |= GrowStackMode; | 
					
						
							|  |  |  |   res=growstack(size PASS_REGS); | 
					
						
							|  |  |  |   LeaveGrowMode(GrowStackMode); | 
					
						
							|  |  |  |   return res; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-01-03 17:06:05 +00:00
										 |  |  | int | 
					
						
							| 
									
										
										
										
											2013-04-25 17:15:04 -05:00
										 |  |  | Yap_growstack(size_t size) | 
					
						
							| 
									
										
										
										
											2005-01-03 17:06:05 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2005-01-03 17:06:05 +00:00
										 |  |  |   int res; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   LOCAL_PrologMode |= GrowStackMode; | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   res=growstack(size PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-10-18 08:24:16 +00:00
										 |  |  |   LeaveGrowMode(GrowStackMode); | 
					
						
							| 
									
										
										
										
											2005-01-03 17:06:05 +00:00
										 |  |  |   return res; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  | static int | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  | execute_growstack(size_t esize0, bool from_trail, bool in_parser, tr_fr_ptr *old_trp, TokEntry **tksp, VarEntry **vep USES_REGS) | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2004-08-11 16:14:55 +00:00
										 |  |  |   UInt minimal_request = 0L; | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  |   Int size0 = esize0; | 
					
						
							|  |  |  |   Int size = size0; | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |   ADDR old_LOCAL_GlobalBase = LOCAL_GlobalBase; | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-10 10:06:51 +01:00
										 |  |  |   if (!GLOBAL_AllowGlobalExpansion) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |     LOCAL_ErrorMessage = "Database crashed against stacks"; | 
					
						
							| 
									
										
										
										
											2009-05-10 13:36:55 -04:00
										 |  |  |     return FALSE; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  |   if (!Yap_ExtendWorkSpace(size)) { | 
					
						
							| 
									
										
										
										
											2004-08-11 16:14:55 +00:00
										 |  |  |     /* make sure stacks and trail are contiguous */ | 
					
						
							| 
									
										
										
										
											2004-09-03 03:11:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     LOCAL_ErrorMessage = NULL; | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |     minimal_request = AdjustPageSize(((CELL)LOCAL_TrailTop-(CELL)LOCAL_GlobalBase)+4*MinHeapGap+size0); | 
					
						
							| 
									
										
										
										
											2004-08-11 16:14:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     size = Yap_ExtendWorkSpaceThroughHole(minimal_request); | 
					
						
							|  |  |  |     if (size < 0) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |       LOCAL_ErrorMessage = "Database crashed against stacks"; | 
					
						
							| 
									
										
										
										
											2004-08-11 16:14:55 +00:00
										 |  |  |       return FALSE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     YAPEnterCriticalSection(); | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |     LOCAL_GDiff = LOCAL_DelayDiff = LOCAL_BaseDiff = size-size0; | 
					
						
							| 
									
										
										
										
											2004-08-11 16:14:55 +00:00
										 |  |  |   } else { | 
					
						
							|  |  |  |     YAPEnterCriticalSection(); | 
					
						
							| 
									
										
										
										
											2015-07-22 19:15:08 -05:00
										 |  |  |     LOCAL_GDiff = LOCAL_BaseDiff = LOCAL_DelayDiff = LOCAL_GlobalBase-old_LOCAL_GlobalBase; | 
					
						
							|  |  |  |     LOCAL_GlobalBase=old_LOCAL_GlobalBase; | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   LOCAL_XDiff = LOCAL_HDiff = 0; | 
					
						
							|  |  |  |   LOCAL_GDiff0=LOCAL_GDiff; | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  | #if USE_SYSTEM_MALLOC
 | 
					
						
							|  |  |  |   if (from_trail) { | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |     LOCAL_TrDiff = LOCAL_LDiff = LOCAL_GDiff; | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |     LOCAL_TrDiff = LOCAL_LDiff = size+LOCAL_GDiff; | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2005-01-03 17:06:05 +00:00
										 |  |  |   if (from_trail) { | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |     LOCAL_TrDiff = LOCAL_LDiff = size-size0; | 
					
						
							| 
									
										
										
										
											2005-01-03 17:06:05 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |     LOCAL_TrDiff = LOCAL_LDiff = size; | 
					
						
							| 
									
										
										
										
											2005-01-03 17:06:05 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  |   ASP -= 256; | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   SetHeapRegs(FALSE PASS_REGS); | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  |   if (from_trail) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |     LOCAL_TrailTop += size0; | 
					
						
							| 
									
										
										
										
											2011-10-21 22:04:58 +01:00
										 |  |  |     CurrentTrailTop = (tr_fr_ptr)(LOCAL_TrailTop-MinTrailGap); | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   if (LOCAL_LDiff) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     MoveLocalAndTrail( PASS_REGS1 ); | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   if (LOCAL_GDiff) { | 
					
						
							| 
									
										
										
										
											2004-10-04 18:56:20 +00:00
										 |  |  | #if !USE_SYSTEM_MALLOC
 | 
					
						
							|  |  |  |     /* That is done by realloc */ | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     MoveGlobal( PASS_REGS1 ); | 
					
						
							| 
									
										
										
										
											2004-10-04 18:56:20 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2005-01-03 17:06:05 +00:00
										 |  |  |     if (in_parser) { | 
					
						
							|  |  |  |       tr_fr_ptr nTR; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       AdjustScannerStacks(tksp, vep PASS_REGS); | 
					
						
							| 
									
										
										
										
											2005-01-03 17:06:05 +00:00
										 |  |  |       nTR = TR; | 
					
						
							|  |  |  |       *old_trp = PtoTRAdjust(*old_trp); | 
					
						
							|  |  |  |       TR = *old_trp; | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       AdjustStacksAndTrail(0, FALSE PASS_REGS); | 
					
						
							| 
									
										
										
										
											2005-01-03 17:06:05 +00:00
										 |  |  |       TR = nTR; | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       AdjustStacksAndTrail(0, FALSE PASS_REGS); | 
					
						
							| 
									
										
										
										
											2005-01-03 17:06:05 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     AdjustRegs(MaxTemps PASS_REGS); | 
					
						
							| 
									
										
										
										
											2004-08-11 16:14:55 +00:00
										 |  |  | #ifdef TABLING
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     fix_tabling_info( PASS_REGS1 ); | 
					
						
							| 
									
										
										
										
											2004-08-11 16:14:55 +00:00
										 |  |  | #endif /* TABLING */
 | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   } else if (LOCAL_LDiff) { | 
					
						
							| 
									
										
										
										
											2005-01-03 17:06:05 +00:00
										 |  |  |     if (in_parser) { | 
					
						
							|  |  |  |       tr_fr_ptr nTR; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       AdjustScannerStacks(tksp, vep PASS_REGS); | 
					
						
							| 
									
										
										
										
											2005-01-03 17:06:05 +00:00
										 |  |  |       nTR = TR; | 
					
						
							|  |  |  |       *old_trp = PtoTRAdjust(*old_trp); | 
					
						
							|  |  |  |       TR = *old_trp; | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       AdjustGrowStack( PASS_REGS1 ); | 
					
						
							| 
									
										
										
										
											2005-01-03 17:06:05 +00:00
										 |  |  |       TR = nTR; | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       AdjustGrowStack( PASS_REGS1 ); | 
					
						
							| 
									
										
										
										
											2005-01-03 17:06:05 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     AdjustRegs(MaxTemps PASS_REGS); | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  | #ifdef TABLING
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     fix_tabling_info( PASS_REGS1 ); | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  | #endif /* TABLING */
 | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   YAPLeaveCriticalSection(); | 
					
						
							|  |  |  |   ASP += 256; | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   if (minimal_request) | 
					
						
							| 
									
										
										
										
											2004-08-11 16:14:55 +00:00
										 |  |  |     Yap_AllocHole(minimal_request, size); | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  |   return TRUE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | /* Used by do_goal() when we're short of stack space */ | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | static int | 
					
						
							| 
									
										
										
										
											2013-04-25 17:15:04 -05:00
										 |  |  | growstack(size_t size USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2004-03-02 16:44:58 +00:00
										 |  |  |   UInt start_growth_time, growth_time; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   int gc_verbose; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* adjust to a multiple of 256) */ | 
					
						
							| 
									
										
										
										
											2008-01-24 00:11:59 +00:00
										 |  |  |   if (size < YAP_ALLOC_SIZE) | 
					
						
							|  |  |  |     size = YAP_ALLOC_SIZE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   size = AdjustPageSize(size); | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |   LOCAL_ErrorMessage = NULL; | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   start_growth_time = Yap_cputime(); | 
					
						
							|  |  |  |   gc_verbose = Yap_is_gc_verbose(); | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   LOCAL_stack_overflows++; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (gc_verbose) { | 
					
						
							| 
									
										
										
										
											2008-01-23 17:57:56 +00:00
										 |  |  | #if  defined(YAPOR) || defined(THREADS)
 | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |     fprintf(stderr, "%% Worker Id %d:\n", worker_id); | 
					
						
							| 
									
										
										
										
											2008-01-23 17:57:56 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |     fprintf(stderr, "%% Stack Overflow %d\n", LOCAL_stack_overflows); | 
					
						
							|  |  |  |     fprintf(stderr, "%%   Global: %8ld cells (%p-%p)\n", (unsigned long int)(HR-(CELL *)LOCAL_GlobalBase),LOCAL_GlobalBase,HR); | 
					
						
							|  |  |  |     fprintf(stderr, "%%   Local:%8ld cells (%p-%p)\n", (unsigned long int)(LCL0-ASP),LCL0,ASP); | 
					
						
							|  |  |  |     fprintf(stderr, "%%   Trail:%8ld cells (%p-%p)\n", | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	       (unsigned long int)(TR-(tr_fr_ptr)LOCAL_TrailBase),LOCAL_TrailBase,TR); | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |     fprintf(stderr, "%% Growing the stacks " UInt_FORMAT " bytes\n", (UInt) size); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   if (!execute_growstack(size, FALSE, FALSE, NULL, NULL, NULL PASS_REGS)) | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   growth_time = Yap_cputime()-start_growth_time; | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   LOCAL_total_stack_overflow_time += growth_time; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (gc_verbose) { | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |     fprintf(stderr, "%%   took %g sec\n", (double)growth_time/1000); | 
					
						
							|  |  |  |     fprintf(stderr, "%% Total of %g sec expanding stacks \n", (double)LOCAL_total_stack_overflow_time/1000); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2008-04-01 14:09:43 +00:00
										 |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Used by parser when we're short of stack space */ | 
					
						
							|  |  |  | int | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_growstack_in_parser(tr_fr_ptr *old_trp, TokEntry **tksp, VarEntry **vep) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2005-01-03 17:06:05 +00:00
										 |  |  |   UInt size; | 
					
						
							| 
									
										
										
										
											2004-03-02 16:44:58 +00:00
										 |  |  |   UInt start_growth_time, growth_time; | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  |   bool gc_verbose; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   LOCAL_PrologMode |= GrowStackMode; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   /* adjust to a multiple of 256) */ | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |   size = AdjustPageSize((ADDR)LCL0-LOCAL_GlobalBase); | 
					
						
							|  |  |  |   LOCAL_ErrorMessage = NULL; | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   start_growth_time = Yap_cputime(); | 
					
						
							|  |  |  |   gc_verbose = Yap_is_gc_verbose(); | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   LOCAL_stack_overflows++; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (gc_verbose) { | 
					
						
							| 
									
										
										
										
											2008-01-23 17:57:56 +00:00
										 |  |  | #if  defined(YAPOR) || defined(THREADS)
 | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |     fprintf(stderr, "%% Worker Id %d:\n", worker_id); | 
					
						
							| 
									
										
										
										
											2008-01-23 17:57:56 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |     fprintf(stderr, "%% Stack Overflow %d\n", LOCAL_stack_overflows); | 
					
						
							|  |  |  |     fprintf(stderr, "%%   Global: %8ld cells (%p-%p)\n", (unsigned long int)(HR-(CELL *)LOCAL_GlobalBase),LOCAL_GlobalBase,HR); | 
					
						
							|  |  |  |     fprintf(stderr, "%%   Local:%8ld cells (%p-%p)\n", (unsigned long int)(LCL0-ASP),LCL0,ASP); | 
					
						
							|  |  |  |     fprintf(stderr, "%%   Trail:%8ld cells (%p-%p)\n", | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	       (unsigned long int)(TR-(tr_fr_ptr)LOCAL_TrailBase),LOCAL_TrailBase,TR); | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |     fprintf(stderr, "%% Growing the stacks %ld bytes\n", (unsigned long int)size); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   if (!execute_growstack(size, FALSE, TRUE, old_trp, tksp, vep PASS_REGS)) { | 
					
						
							| 
									
										
										
										
											2007-10-18 08:24:16 +00:00
										 |  |  |     LeaveGrowMode(GrowStackMode); | 
					
						
							| 
									
										
										
										
											2005-01-03 17:06:05 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   growth_time = Yap_cputime()-start_growth_time; | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   LOCAL_total_stack_overflow_time += growth_time; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (gc_verbose) { | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |     fprintf(stderr, "%%   took %g sec\n", (double)growth_time/1000); | 
					
						
							|  |  |  |     fprintf(stderr, "%% Total of %g sec expanding stacks \n", (double)LOCAL_total_stack_overflow_time/1000); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2007-10-18 08:24:16 +00:00
										 |  |  |   LeaveGrowMode(GrowStackMode); | 
					
						
							| 
									
										
										
										
											2005-01-03 17:06:05 +00:00
										 |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  | static int do_growtrail(size_t esize, bool contiguous_only, bool in_parser, tr_fr_ptr *old_trp, TokEntry **tksp, VarEntry **vep USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2004-03-02 16:44:58 +00:00
										 |  |  |   UInt start_growth_time = Yap_cputime(), growth_time; | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   int gc_verbose = Yap_is_gc_verbose(); | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  |   Int size0 = esize; | 
					
						
							|  |  |  |   Int size = esize; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 16:14:05 +00:00
										 |  |  | #if USE_SYSTEM_MALLOC
 | 
					
						
							|  |  |  |   if (contiguous_only) | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2004-09-14 03:30:06 +00:00
										 |  |  |   /* at least 64K for trail */ | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   if (!size) | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |     size = ((ADDR)TR-LOCAL_TrailBase); | 
					
						
							| 
									
										
										
										
											2007-03-21 18:32:50 +00:00
										 |  |  |   size *= 2; | 
					
						
							| 
									
										
										
										
											2008-01-24 00:11:59 +00:00
										 |  |  |   if (size < YAP_ALLOC_SIZE) | 
					
						
							|  |  |  |     size = YAP_ALLOC_SIZE; | 
					
						
							| 
									
										
										
										
											2010-05-11 12:25:49 +01:00
										 |  |  |   if (size > M2) | 
					
						
							|  |  |  |     size = M2; | 
					
						
							| 
									
										
										
										
											2010-03-30 09:15:02 +01:00
										 |  |  |   if (size < size0) | 
					
						
							|  |  |  |     size=size0; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   /* adjust to a multiple of 256) */ | 
					
						
							|  |  |  |   size = AdjustPageSize(size); | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   LOCAL_trail_overflows++; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (gc_verbose) { | 
					
						
							| 
									
										
										
										
											2011-04-29 14:59:17 +01:00
										 |  |  | #if defined(YAPOR) || defined(THREADS)
 | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |     fprintf(stderr, "%% Worker Id %d:\n", worker_id); | 
					
						
							| 
									
										
										
										
											2008-01-23 17:57:56 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |     fprintf(stderr, "%% Trail Overflow %d\n", LOCAL_trail_overflows); | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  | #if USE_SYSTEM_MALLOC
 | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |     fprintf(stderr, "%%  Heap: %8ld cells (%p-%p)\n", (unsigned long int)(HR-(CELL *)LOCAL_GlobalBase),(CELL *)LOCAL_GlobalBase,HR); | 
					
						
							|  |  |  |     fprintf(stderr, "%%  Local:%8ld cells (%p-%p)\n", (unsigned long int)(LCL0-ASP),LCL0,ASP); | 
					
						
							|  |  |  |     fprintf(stderr, "%%  Trail:%8ld cells (%p-%p)\n", | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	       (unsigned long int)(TR-(tr_fr_ptr)LOCAL_TrailBase),LOCAL_TrailBase,TR); | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |     fprintf(stderr, "%% growing the trail %ld bytes\n", size); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |   LOCAL_ErrorMessage = NULL; | 
					
						
							| 
									
										
										
										
											2011-05-10 10:06:51 +01:00
										 |  |  |   if (!GLOBAL_AllowTrailExpansion) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |     LOCAL_ErrorMessage = "Trail Overflow"; | 
					
						
							| 
									
										
										
										
											2009-05-10 13:36:55 -04:00
										 |  |  |     return FALSE; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  | #if USE_SYSTEM_MALLOC
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   execute_growstack(size, TRUE, in_parser, old_trp, tksp, vep PASS_REGS); | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2012-03-03 21:46:07 +00:00
										 |  |  |   YAPEnterCriticalSection(); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   if (!Yap_ExtendWorkSpace(size)) { | 
					
						
							| 
									
										
										
										
											2012-03-03 21:46:07 +00:00
										 |  |  |     YAPLeaveCriticalSection(); | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |     LOCAL_ErrorMessage = NULL; | 
					
						
							| 
									
										
										
										
											2005-01-03 17:06:05 +00:00
										 |  |  |     if (contiguous_only) { | 
					
						
							| 
									
										
										
										
											2004-12-28 22:20:37 +00:00
										 |  |  |       /* I can't expand in this case */ | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |       LOCAL_trail_overflows--; | 
					
						
							| 
									
										
										
										
											2004-12-28 22:20:37 +00:00
										 |  |  |       return FALSE; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     execute_growstack(size, TRUE, in_parser, old_trp, tksp, vep PASS_REGS); | 
					
						
							| 
									
										
										
										
											2005-01-03 17:06:05 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2005-11-22 12:42:39 +00:00
										 |  |  |     if (in_parser) { | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |       LOCAL_TrDiff = LOCAL_LDiff = LOCAL_GDiff = LOCAL_BaseDiff = LOCAL_DelayDiff = LOCAL_XDiff = LOCAL_HDiff = LOCAL_GDiff0 = 0; | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       AdjustScannerStacks(tksp, vep PASS_REGS); | 
					
						
							| 
									
										
										
										
											2005-11-22 12:42:39 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |     LOCAL_TrailTop += size; | 
					
						
							| 
									
										
										
										
											2011-10-21 22:04:58 +01:00
										 |  |  |     CurrentTrailTop = (tr_fr_ptr)(LOCAL_TrailTop-MinTrailGap); | 
					
						
							| 
									
										
										
										
											2005-01-03 17:06:05 +00:00
										 |  |  |     YAPLeaveCriticalSection(); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   growth_time = Yap_cputime()-start_growth_time; | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   LOCAL_total_trail_overflow_time += growth_time; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (gc_verbose) { | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |     fprintf(stderr, "%%  took %g sec\n", (double)growth_time/1000); | 
					
						
							|  |  |  |     fprintf(stderr, "%% Total of %g sec expanding trail \n", (double)LOCAL_total_trail_overflow_time/1000); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-09-02 14:19:23 -05:00
										 |  |  |   Yap_get_signal( YAP_TROVF_SIGNAL ); | 
					
						
							| 
									
										
										
										
											2003-11-12 12:33:31 +00:00
										 |  |  |   return TRUE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Used by do_goal() when we're short of stack space */ | 
					
						
							|  |  |  | int | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  | Yap_growtrail(size_t size, bool contiguous_only) | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-04-23 22:41:12 +01:00
										 |  |  |   int rc; | 
					
						
							|  |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   rc = do_growtrail(size, contiguous_only, FALSE, NULL, NULL, NULL PASS_REGS); | 
					
						
							|  |  |  |   return rc; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Used by do_goal() when we're short of stack space */ | 
					
						
							|  |  |  | int | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  | Yap_locked_growtrail(size_t size, bool contiguous_only) | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2014-04-28 11:47:53 +01:00
										 |  |  |   return do_growtrail(size, contiguous_only, FALSE, NULL, NULL, NULL PASS_REGS); | 
					
						
							| 
									
										
										
										
											2005-01-03 17:06:05 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int | 
					
						
							|  |  |  | Yap_growtrail_in_parser(tr_fr_ptr *old_trp, TokEntry **tksp, VarEntry **vep) | 
					
						
							| 
									
										
										
										
											2003-11-12 12:33:31 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   return do_growtrail(0, FALSE, TRUE, old_trp, tksp, vep PASS_REGS); | 
					
						
							| 
									
										
										
										
											2003-11-12 12:33:31 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CELL ** | 
					
						
							| 
									
										
										
										
											2012-03-15 22:37:13 +00:00
										 |  |  | Yap_shift_visit(CELL **to_visit, CELL ***to_visit_maxp, CELL ***to_visit_base) | 
					
						
							| 
									
										
										
										
											2003-11-12 12:33:31 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  |   CELL **to_visit_max = *to_visit_maxp; | 
					
						
							| 
									
										
										
										
											2009-05-22 18:35:24 -05:00
										 |  |  |   /* relative position of top of stack */ | 
					
						
							|  |  |  |   Int off = (ADDR)to_visit-AuxBase; | 
					
						
							|  |  |  |   /* how much space the top stack was using */ | 
					
						
							|  |  |  |   Int sz = AuxTop - (ADDR)to_visit_max; | 
					
						
							|  |  |  |   /* how much space the bottom stack was using */ | 
					
						
							|  |  |  |   Int szlow = (ADDR)to_visit_max-AuxBase; | 
					
						
							|  |  |  |   /* original size for AuxSpace */ | 
					
						
							|  |  |  |   Int totalsz0 = AuxTop - AuxBase; /* totalsz0 == szlow+sz */ | 
					
						
							|  |  |  |   /* new size for AuxSpace */ | 
					
						
							|  |  |  |   Int totalsz; | 
					
						
							|  |  |  |   /* how much we grow */ | 
					
						
							|  |  |  |   Int dsz; /* totalsz == szlow+dsz+sz */ | 
					
						
							|  |  |  |   char *newb = Yap_ExpandPreAllocCodeSpace(0, NULL, FALSE); | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-17 09:42:40 -07:00
										 |  |  |   if (newb == NULL) { | 
					
						
							| 
									
										
										
										
											2015-09-25 10:57:26 +01:00
										 |  |  |     Yap_Error(RESOURCE_ERROR_HEAP,TermNil,"cannot allocate temporary space for unification (%p)", to_visit); | 
					
						
							| 
									
										
										
										
											2009-05-17 09:42:40 -07:00
										 |  |  |     return to_visit; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  |   /* check new size */ | 
					
						
							| 
									
										
										
										
											2009-05-22 18:35:24 -05:00
										 |  |  |   totalsz  = AuxTop-AuxBase; | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  |   /* how much we grew */ | 
					
						
							| 
									
										
										
										
											2009-05-22 18:35:24 -05:00
										 |  |  |   dsz = totalsz-totalsz0; | 
					
						
							| 
									
										
										
										
											2009-05-17 12:26:09 -07:00
										 |  |  |   if (dsz == 0) { | 
					
						
							| 
									
										
										
										
											2015-09-25 10:57:26 +01:00
										 |  |  |     Yap_Error(RESOURCE_ERROR_HEAP,TermNil,"cannot allocate temporary space for unification (%p)", to_visit); | 
					
						
							| 
									
										
										
										
											2009-05-17 12:26:09 -07:00
										 |  |  |     return to_visit; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  |   /* copy whole block to end */ | 
					
						
							| 
									
										
										
										
											2009-05-22 18:35:24 -05:00
										 |  |  |   cpcellsd((CELL *)(newb+(dsz+szlow)), (CELL *)(newb+szlow), sz/sizeof(CELL)); | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  |   /* base pointer is block start */ | 
					
						
							| 
									
										
										
										
											2009-05-22 18:35:24 -05:00
										 |  |  |   *to_visit_maxp = (CELL **)(newb+szlow); | 
					
						
							| 
									
										
										
										
											2012-03-15 22:37:13 +00:00
										 |  |  |   /* base pointer is block start */ | 
					
						
							|  |  |  |   if (to_visit_base) | 
					
						
							|  |  |  |     *to_visit_base = (CELL **)AuxSp; | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  |   /* current top is originall diff + diff size */ | 
					
						
							| 
									
										
										
										
											2009-05-22 18:35:24 -05:00
										 |  |  |   return (CELL **)(newb+(off+dsz)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_inform_trail_overflows( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   Term tn = MkIntTerm(LOCAL_trail_overflows); | 
					
						
							|  |  |  |   Term tt = MkIntegerTerm(LOCAL_total_trail_overflow_time); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   return(Yap_unify(tn, ARG1) && Yap_unify(tt, ARG2)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* :- grow_heap(Size) */ | 
					
						
							|  |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_growheap( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   Int             diff; | 
					
						
							|  |  |  |   Term t1 = Deref(ARG1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (IsVarTerm(t1)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(INSTANTIATION_ERROR, t1, "grow_heap/1"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return(FALSE); | 
					
						
							|  |  |  |   } else if (!IsIntTerm(t1)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(TYPE_ERROR_INTEGER, t1, "grow_heap/1"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return(FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   diff = IntOfTerm(t1); | 
					
						
							|  |  |  |   if (diff < 0) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, t1, "grow_heap/1"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   return(static_growheap(diff, FALSE, NULL, NULL, NULL, NULL PASS_REGS)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_inform_heap_overflows( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   Term tn = MkIntTerm(LOCAL_heap_overflows); | 
					
						
							|  |  |  |   Term tt = MkIntegerTerm(LOCAL_total_heap_overflow_time); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   return(Yap_unify(tn, ARG1) && Yap_unify(tt, ARG2)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-14 18:51:11 +01:00
										 |  |  | #if defined(YAPOR_THREADS)
 | 
					
						
							| 
									
										
										
										
											2010-01-14 15:58:19 +00:00
										 |  |  | void | 
					
						
							| 
									
										
										
										
											2014-09-09 23:50:43 -05:00
										 |  |  | Yap_CopyThreadStacks(int worker_q, int worker_p, bool incremental) | 
					
						
							| 
									
										
										
										
											2010-01-14 15:58:19 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2010-01-14 15:58:19 +00:00
										 |  |  |   Int size; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* make sure both stacks have same size */ | 
					
						
							| 
									
										
										
										
											2011-05-09 20:19:49 +01:00
										 |  |  |   Int p_size = REMOTE_ThreadHandle(worker_p).ssize+REMOTE_ThreadHandle(worker_p).tsize; | 
					
						
							|  |  |  |   Int q_size = REMOTE_ThreadHandle(worker_q).ssize+REMOTE_ThreadHandle(worker_q).tsize; | 
					
						
							| 
									
										
										
										
											2013-12-17 15:57:24 +00:00
										 |  |  |    if (p_size != q_size) { | 
					
						
							|  |  |  |     UInt start_growth_time, growth_time; | 
					
						
							|  |  |  |     int gc_verbose; | 
					
						
							|  |  |  |     size_t ssiz = REMOTE_ThreadHandle(worker_q).ssize*K1; | 
					
						
							|  |  |  |     size_t tsiz = REMOTE_ThreadHandle(worker_q).tsize*K1; | 
					
						
							|  |  |  |     size_t diff = (REMOTE_ThreadHandle(worker_p).ssize-REMOTE_ThreadHandle(worker_q).ssize)*K1; | 
					
						
							|  |  |  |     char *oldq = (char *)REMOTE_ThreadHandle(worker_q).stack_address, *newq; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!(newq = REMOTE_ThreadHandle(worker_q).stack_address = realloc(REMOTE_ThreadHandle(worker_q).stack_address,p_size*K1))) { | 
					
						
							| 
									
										
										
										
											2015-09-25 10:57:26 +01:00
										 |  |  |       Yap_Error(RESOURCE_ERROR_STACK,TermNil,"cannot expand slave thread to match master thread"); | 
					
						
							| 
									
										
										
										
											2013-12-17 15:57:24 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     start_growth_time = Yap_cputime(); | 
					
						
							|  |  |  |     gc_verbose = Yap_is_gc_verbose(); | 
					
						
							|  |  |  |     LOCAL_stack_overflows++; | 
					
						
							|  |  |  |     if (gc_verbose) { | 
					
						
							|  |  |  | #if  defined(YAPOR) || defined(THREADS)
 | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |       fprintf(stderr, "%% Worker Id %d:\n", worker_id); | 
					
						
							| 
									
										
										
										
											2013-12-17 15:57:24 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |       fprintf(stderr, "%% Stack Overflow %d\n", LOCAL_stack_overflows); | 
					
						
							|  |  |  |       fprintf(stderr, "%%   Stack: %8ld cells (%p-%p)\n", (unsigned long int)(LCL0-(CELL *)LOCAL_GlobalBase),LOCAL_GlobalBase,LCL0); | 
					
						
							|  |  |  |       fprintf(stderr, "%%   Trail:%8ld cells (%p-%p)\n", | 
					
						
							| 
									
										
										
										
											2013-12-17 15:57:24 +00:00
										 |  |  | 	      (unsigned long int)(TR-(tr_fr_ptr)LOCAL_TrailBase),LOCAL_TrailBase,TR); | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |       fprintf(stderr, "%% Growing the stacks %ld bytes\n", diff); | 
					
						
							| 
									
										
										
										
											2013-12-17 15:57:24 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     LOCAL_GDiff = LOCAL_GDiff0 = LOCAL_DelayDiff = LOCAL_BaseDiff = (newq-oldq); | 
					
						
							|  |  |  |     LOCAL_TrDiff = LOCAL_LDiff = diff + LOCAL_GDiff; | 
					
						
							|  |  |  |     LOCAL_XDiff = LOCAL_HDiff = 0; | 
					
						
							|  |  |  |     LOCAL_GSplit = NULL; | 
					
						
							|  |  |  |     YAPEnterCriticalSection(); | 
					
						
							|  |  |  |     SetHeapRegs(FALSE PASS_REGS); | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |         choiceptr imageB; | 
					
						
							| 
									
										
										
										
											2013-12-17 15:57:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	LOCAL_OldLCL0 = LCL0; | 
					
						
							|  |  |  | 	LCL0 = REMOTE_ThreadHandle(0).current_yaam_regs->LCL0_; | 
					
						
							|  |  |  | 	imageB = Get_GLOBAL_root_cp(); | 
					
						
							|  |  |  | 	/* we know B */ | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | 	B->cp_tr = TR = | 
					
						
							| 
									
										
										
										
											2013-12-17 15:57:24 +00:00
										 |  |  | 	  (tr_fr_ptr)((CELL)(imageB->cp_tr)+((CELL)LOCAL_OldLCL0-(CELL)LCL0)); | 
					
						
							|  |  |  | 	LCL0 = LOCAL_OldLCL0; | 
					
						
							|  |  |  | 	B->cp_h = H0; | 
					
						
							|  |  |  | 	B->cp_ap = GETWORK; | 
					
						
							|  |  |  | 	B->cp_or_fr = GLOBAL_root_or_fr; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     YAPLeaveCriticalSection(); | 
					
						
							|  |  |  |     growth_time = Yap_cputime()-start_growth_time; | 
					
						
							|  |  |  |     LOCAL_total_stack_overflow_time += growth_time; | 
					
						
							|  |  |  |     if (gc_verbose) { | 
					
						
							| 
									
										
										
										
											2015-06-18 08:00:48 +01:00
										 |  |  |       fprintf(stderr, "%%   took %g sec\n", (double)growth_time/1000); | 
					
						
							|  |  |  |       fprintf(stderr, "%% Total of %g sec expanding stacks \n", (double)LOCAL_total_stack_overflow_time/1000); | 
					
						
							| 
									
										
										
										
											2010-01-14 15:58:19 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2013-12-17 15:57:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-09 20:19:49 +01:00
										 |  |  |   REMOTE_ThreadHandle(worker_q).ssize = REMOTE_ThreadHandle(worker_p).ssize; | 
					
						
							|  |  |  |   REMOTE_ThreadHandle(worker_q).tsize = REMOTE_ThreadHandle(worker_p).tsize; | 
					
						
							| 
									
										
										
										
											2010-01-14 15:58:19 +00:00
										 |  |  |   /* compute offset indicators */ | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |   LOCAL_GlobalBase = REMOTE_GlobalBase(worker_p); | 
					
						
							|  |  |  |   LOCAL_LocalBase = REMOTE_LocalBase(worker_p); | 
					
						
							|  |  |  |   LOCAL_TrailBase = REMOTE_TrailBase(worker_p); | 
					
						
							|  |  |  |   LOCAL_TrailTop = REMOTE_TrailTop(worker_p); | 
					
						
							| 
									
										
										
										
											2011-10-02 19:55:22 -03:00
										 |  |  |   CurrentTrailTop = (tr_fr_ptr)(LOCAL_TrailTop-MinTrailGap); | 
					
						
							| 
									
										
										
										
											2011-05-09 20:19:49 +01:00
										 |  |  |   size = REMOTE_ThreadHandle(worker_q).stack_address-REMOTE_ThreadHandle(worker_p).stack_address; | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   LOCAL_TrDiff = LOCAL_LDiff = LOCAL_GDiff = LOCAL_GDiff0 = LOCAL_DelayDiff = LOCAL_BaseDiff = size; | 
					
						
							|  |  |  |   LOCAL_XDiff = LOCAL_HDiff = 0; | 
					
						
							|  |  |  |   LOCAL_GSplit = NULL; | 
					
						
							| 
									
										
										
										
											2014-01-19 21:15:05 +00:00
										 |  |  |   HR = REMOTE_ThreadHandle(worker_p).current_yaam_regs->H_; | 
					
						
							| 
									
										
										
										
											2011-05-09 20:19:49 +01:00
										 |  |  |   H0 = REMOTE_ThreadHandle(worker_p).current_yaam_regs->H0_; | 
					
						
							|  |  |  |   B = REMOTE_ThreadHandle(worker_p).current_yaam_regs->B_; | 
					
						
							|  |  |  |   ENV = REMOTE_ThreadHandle(worker_p).current_yaam_regs->ENV_; | 
					
						
							|  |  |  |   YENV = REMOTE_ThreadHandle(worker_p).current_yaam_regs->YENV_; | 
					
						
							|  |  |  |   ASP = REMOTE_ThreadHandle(worker_p).current_yaam_regs->ASP_; | 
					
						
							|  |  |  |   TR = REMOTE_ThreadHandle(worker_p).current_yaam_regs->TR_; | 
					
						
							| 
									
										
										
										
											2010-01-14 15:58:19 +00:00
										 |  |  |   if (ASP > CellPtr(B)) | 
					
						
							|  |  |  |     ASP = CellPtr(B); | 
					
						
							| 
									
										
										
										
											2011-05-09 20:19:49 +01:00
										 |  |  |   LCL0 = REMOTE_ThreadHandle(worker_p).current_yaam_regs->LCL0_; | 
					
						
							|  |  |  |   Yap_REGS.CUT_C_TOP = REMOTE_ThreadHandle(worker_p).current_yaam_regs->CUT_C_TOP; | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   LOCAL_DynamicArrays = NULL; | 
					
						
							|  |  |  |   LOCAL_StaticArrays = NULL; | 
					
						
							|  |  |  |   LOCAL_GlobalVariables = NULL; | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   SetHeapRegs(TRUE PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  |   if (incremental) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     IncrementalCopyStacksFromWorker( PASS_REGS1 ); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     LOCAL_start_global_copy = | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  |       (CELL)PtoGloAdjust((CELL *)LOCAL_start_global_copy); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     LOCAL_end_global_copy = | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  |       (CELL)PtoGloAdjust((CELL *)LOCAL_end_global_copy); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     LOCAL_start_local_copy = | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  |       (CELL)PtoLocAdjust((CELL *)LOCAL_start_local_copy); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     LOCAL_end_local_copy = | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  |       (CELL)PtoLocAdjust((CELL *)LOCAL_end_local_copy); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     LOCAL_start_trail_copy = | 
					
						
							| 
									
										
										
										
											2010-07-27 23:09:17 +01:00
										 |  |  |       (CELL)PtoTRAdjust((tr_fr_ptr)LOCAL_start_trail_copy); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     LOCAL_end_trail_copy = | 
					
						
							| 
									
										
										
										
											2010-07-27 23:09:17 +01:00
										 |  |  |       (CELL)PtoTRAdjust((tr_fr_ptr)LOCAL_end_trail_copy); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     AdjustStacksAndTrail(0, STACK_INCREMENTAL_COPYING PASS_REGS); | 
					
						
							|  |  |  |     RestoreTrail(worker_p PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  |     TR = (tr_fr_ptr) LOCAL_end_trail_copy; | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     CopyLocalAndTrail( PASS_REGS1 ); | 
					
						
							|  |  |  |     MoveGlobal( PASS_REGS1 ); | 
					
						
							|  |  |  |     AdjustStacksAndTrail(0, STACK_COPYING PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-02-01 20:05:01 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-01-14 15:58:19 +00:00
										 |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | /* :- grow_stack(Size) */ | 
					
						
							|  |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_growstack( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   Int             diff; | 
					
						
							|  |  |  |   Term t1 = Deref(ARG1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (IsVarTerm(t1)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(INSTANTIATION_ERROR, t1, "grow_stack/1"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return(FALSE); | 
					
						
							|  |  |  |   } else if (!IsIntTerm(t1)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(TYPE_ERROR_INTEGER, t1, "grow_stack/1"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return(FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   diff = IntOfTerm(t1); | 
					
						
							|  |  |  |   if (diff < 0) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, t1, "grow_stack/1"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   return(growstack(diff PASS_REGS)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_inform_stack_overflows( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2007-02-18 00:26:36 +00:00
										 |  |  | {				/*  */ | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   Term tn = MkIntTerm(LOCAL_stack_overflows); | 
					
						
							|  |  |  |   Term tt = MkIntegerTerm(LOCAL_total_stack_overflow_time); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   return(Yap_unify(tn, ARG1) && Yap_unify(tt, ARG2)); | 
					
						
							| 
									
										
										
										
											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_total_stack_shift_time(void) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   return(LOCAL_total_heap_overflow_time+ | 
					
						
							|  |  |  | 	 LOCAL_total_stack_overflow_time+ | 
					
						
							|  |  |  | 	 LOCAL_total_trail_overflow_time); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_InitGrowPreds(void) | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-10-19 18:10:48 +01:00
										 |  |  |   Yap_InitCPred("$grow_heap", 1, p_growheap, SafePredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$grow_stack", 1, p_growstack, SafePredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$inform_trail_overflows", 2, p_inform_trail_overflows, SafePredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$inform_heap_overflows", 2, p_inform_heap_overflows, SafePredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$inform_stack_overflows", 2, p_inform_stack_overflows, SafePredFlag); | 
					
						
							| 
									
										
										
										
											2003-10-28 01:16:03 +00:00
										 |  |  |   Yap_init_gc(); | 
					
						
							|  |  |  |   Yap_init_agc(); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } |