//
// File defining fields in the Yap_heap_codes global structure
//
// these fields used to spread all over the place, because they must be used in 4 ways:
//  - they must be defined somewhere
//  - they have an #ifdef to get a shorter name
//  - they must be initialised somewhere
//  - they must be restorable and collectable (from the atom gc).
//
//
// The defs include 4+ components:
//   Type
//   name in structured
//   global name
//   init code and restore code (optional)
//
//   
//
// MkAT (MkAtomTerm) cvts from a predefined atom to a term
// MkPred constructs a pred_entry
// MkOp gets an opcode
// void does nothing
// =VALUE inits as VALUE
// Init... sets up call to InitFunc
// Restore... sets up call to RestoreFunc
//

/* multi-thread/ORP support */
#if defined(YAPOR) || defined(THREADS)
/* number of threads and processes in system */
UInt		n_of_threads		NOfThreads	=1	void
/* number of threads created since start */
UInt		n_of_threads_created	NOfThreadsCreated =1	void
/* total run time for dead threads */
UInt  threads_total_time		ThreadsTotalTime =0L	void
/* protect long critical regions   */
lockvar		bgl			BGL			MkLock
/* worker local data */
worker_local	wl[MAX_AGENTS]		WorkerLocal		void void
#ifndef WL
#define WL	wl[worker_id]
#endif
#else
worker_local	wl			WorkerLocak			void void
#ifndef WL
#define WL	wl
#endif
#endif

/* memory management */
UInt		hole_size		Yap_HoleSize		void void
struct malloc_state *av_		Yap_av			void void
#if USE_DL_MALLOC
struct memory_hole memory_holes[MAX_DLMALLOC_HOLES] Yap_MemoryHoles void void
UInt		nof_memory_holes	Yap_NOfMemoryHoles	void void
#if defined(YAPOR) || defined(THREADS)
lockvar         dlmalloc_lock		DLMallocLock		MkLock
#endif
#endif
#if USE_DL_MALLOC || (USE_SYSTEM_MALLOC && HAVE_MALLINFO)
#ifndef  HeapUsed
#define  HeapUsed  Yap_givemallinfo()		
#endif
Int		heap_used		NotHeapUsed		void void
#else
Int		heap_used		HeapUsed		void void
#endif
Int		heap_max		HeapMax			void void
ADDR		heap_top		HeapTop			void void
ADDR		heap_lim		HeapLim			void void
struct FREEB    *free_blocks		FreeBlocks		void void
#if defined(YAPOR) || defined(THREADS)
lockvar		free_blocks_lock	FreeBlocksLock		MkLock
lockvar		heap_used_lock		HeapUsedLock		MkLock
lockvar		heap_top_lock		HeapTopLock		MkLock
int		heap_top_owner		HeapTopOwner		=-1 void
#endif


/* execution info */
/* OPCODE TABLE, needed to recover op tables */
#if USE_THREADED_CODE
opentry		*op_rtable		OP_RTABLE		void	OpRTableAdjust
#endif

/* popular opcodes */
OPCODE		execute_cpred_op_code	EXECUTE_CPRED_OP_CODE	MkOp _execute_cpred
OPCODE		expand_op_code		EXPAND_OP_CODE		MkOp _expand_index
OPCODE		fail_op			FAIL_OPCODE		MkOp _op_fail
OPCODE		index_op		INDEX_OPCODE		MkOp _index_pred
OPCODE		lockpred_op		LOCKPRED_OPCODE		MkOp _lock_pred
OPCODE		orlast_op		ORLAST_OPCODE		MkOp _or_last
OPCODE		undef_op		UNDEF_OPCODE		MkOp _undef_p

/* atom tables */
UInt		n_of_atoms		NOfAtoms		void void
UInt		atom_hash_table_size	AtomHashTableSize	void void
UInt		wide_atom_hash_table_size WideAtomHashTableSize void void
UInt		n_of_wide_atoms		NOfWideAtoms		void void
AtomHashEntry	invisiblechain		INVISIBLECHAIN		InitInvisibleAtoms() RestoreInvisibleAtoms()
AtomHashEntry	*wide_hash_chain	WideHashChain		InitWideAtoms()  RestoreWideAtoms()
AtomHashEntry	*hash_chain		HashChain		InitAtoms() RestoreAtoms()

/* use atom defs here */
ATOMS

#ifdef EUROTRA
Term		term_dollar_u		TermDollarU		MkAT AtomDollarU
#endif
Term		term_prolog		TermProlog		MkAT AtomProlog
Term		term_refound_var	TermReFoundVar		MkAT AtomRefoundVar
Term		user_module		USER_MODULE		MkAT AtomUser
Term		idb_module		IDB_MODULE		MkAT AtomIDB
Term		attributes_module	ATTRIBUTES_MODULE	MkAT AtomAttributes
Term		charsio_module		CHARSIO_MODULE		MkAT AtomCharsio
Term		terms_module		TERMS_MODULE		MkAT AtomTerms
Term		system_module		SYSTEM_MODULE		MkAT AtomSystem
Term		readutil_module		READUTIL_MODULE		MkAT AtomReadutil
Term		hacks_module		HACKS_MODULE		MkAT AtomYapHacks
Term		arg_module		ARG_MODULE		MkAT AtomArg
Term		globals_module		GLOBALS_MODULE		MkAT AtomNb
Term		swi_module		SWI_MODULE		MkAT AtomSwi

//
// Module list
//
struct mod_entry *current_modules	CurrentModules		=NULL	ModEntryPtrAdjust
// make sure we have the modules set at this point.
// don't actually want to define a field
void		void			void			Yap_InitModules()  void

/* Anderson's JIT */
yap_exec_mode	execution_mode		Yap_ExecutionMode	=INTERPRETED void

/*  The Predicate Hash Table: fast access to predicates. */
struct pred_entry **pred_hash		PredHash		InitPredHash() RestorePredHash()
#if defined(YAPOR) || defined(THREADS)
rwlock_t	pred_hash_rw_lock	PredHashRWLock		void
#endif
UInt		preds_in_hash_table	PredsInHashTable	=0 void
UInt		pred_hash_table_size	PredHashTableSize	void


/* Well-Known Predicates */
struct pred_entry *creep_code		CreepCode		MkPred AtomCreep 1 PROLOG_MODULE
struct pred_entry *undef_code		UndefCode		MkPred AtomUndefp 1 PROLOG_MODULE
struct pred_entry *spy_code		SpyCode			MkPred AtomSpy 1 PROLOG_MODULE
struct pred_entry *pred_fail		PredFail		MkPred AtomFail 0 PROLOG_MODULE
struct pred_entry *pred_true		PredTrue		MkPred AtomTrue 0 PROLOG_MODULE
#ifdef COROUTINING
struct pred_entry  *wake_up_code	WakeUpCode		MkPred AtomWakeUpGoal 2 PROLOG_MODULE
#endif
struct pred_entry *pred_goal_expansion	PredGoalExpansion	MkPred FunctorGoalExpansion USER_MODULE
struct pred_entry *pred_meta_call	PredMetaCall		MkPred FunctorMetaCall PROLOG_MODULE
struct pred_entry *pred_dollar_catch	PredDollarCatch         MkPred FunctorCatch PROLOG_MODULE
struct pred_entry *pred_recorded_with_key PredRecordedWithKey	MkPred FunctorRecordedWithKey PROLOG_MODULE
struct pred_entry *pred_log_upd_clause	PredLogUpdClause	MkPred FunctorDoLogUpdClause PROLOG_MODULE
struct pred_entry *pred_log_upd_clause_erase PredLogUpdClauseErase MkPred FunctorDoLogUpdClauseErase PROLOG_MODULE
struct pred_entry *pred_log_upd_clause0	PredLogUpdClause0	MkPred FunctorDoLogUpdClause PROLOG_MODULE
struct pred_entry *pred_static_clause	PredStaticClause	MkPred FunctorDoStaticClause PROLOG_MODULE
struct pred_entry *pred_throw		PredThrow		MkPred FunctorThrow PROLOG_MODULE
struct pred_entry *pred_handle_throw	PredHandleThrow		MkPred FunctorHandleThrow PROLOG_MODULE
struct pred_entry *pred_is		PredIs			MkPred FunctorIs PROLOG_MODULE
struct pred_entry *pred_safe_call_cleanup PredSafeCallCleanup	MkPred FunctorSafeCallCleanup PROLOG_MODULE
#ifdef YAPOR
struct pred_entry *pred_getwork		PredGetwork		MkPred AtomGetwork 0 PROLOG_MODULE
struct pred_entry *pred_getwork_seq	PredGetworkSeq		MkPred AtomGetworkSeq 0 PROLOG_MODULE
#endif /* YAPOR */

/* low-level tracer */
#ifdef LOW_LEVEL_TRACER
int		yap_do_low_level_trace	Yap_do_low_level_trace	=FALSE void
#if defined(YAPOR) || defined(THREADS)
lockvar		low_level_trace_lock	Yap_low_level_trace_lock MkLock
#endif
#endif

/* code management info */
UInt		clause_space		Yap_ClauseSpace		=0 void
UInt		index_space_Tree	Yap_IndexSpace_Tree	=0 void
UInt		index_space_EXT		Yap_IndexSpace_EXT	=0 void
UInt		index_space_SW		Yap_IndexSpace_SW	=0 void
UInt		lu_clause_space		Yap_LUClauseSpace	=0 void
UInt		lu_index_space_Tree	Yap_LUIndexSpace_Tree	=0 void
UInt		lu_index_space_CP	Yap_LUIndexSpace_CP	=0 void
UInt		lu_index_space_EXT	Yap_LUIndexSpace_EXT	=0 void
UInt		lu_index_space_SW	Yap_LUIndexSpace_SW	=0 void

/* static code: may be shared by many predicate or may be used for meta-execution */
yamop		comma_code[5]		COMMA_CODE		void void
yamop		dummycode[1]		DUMMYCODE		MkInstE _op_fail
yamop		failcode[1]		FAILCODE		MkInstE _op_fail
yamop		nocode[1]		NOCODE			MkInstE _Nstop

yamop		env_for_trustfail[2]	ENV_FOR_TRUSTFAIL	InitEnvInst(ENV_FOR_TRUSTFAIL,&TRUSTFAILCODE,_trust_fail,PredFail) RestoreEnvInst(ENV_FOR_TRUSTFAIL,&TRUSTFAILCODE,_trust_fail,PredFail)
yamop		*trustfailcode		TRUSTFAILCODE		void
yamop		env_for_yescode[2]	ENV_FOR_YESCODE		InitEnvInst(ENV_FOR_YESCODE,&YESCODE,_Ystop,PredFail) RestoreEnvInst(ENV_FOR_YESCODE,&YESCODE,_Ystop,PredFail)
yamop		*yescode		YESCODE			void

  yamop		rtrycode[1]		RTRYCODE		InitOtaplInst(RTRYCODE,_retry_and_mark,PredFail) RestoreOtaplInst(RTRYCODE,_retry_and_mark,PredFail)

#ifdef BEAM
yamop		beam_retry_code[1]	BEAM_RETRY_CODE		MkInstE _beam_retry_code
#endif /* BEAM */
#ifdef YAPOR
int		seq_def			SEQUENTIAL_IS_DEFAULT	=TRUE void
  yamop		getwork_code[1]		GETWORK			InitOtaplInst(GETWORK,_getwork,PredGetwork) RestoreOtaplInst(GETWORK,_getwork,PredGetwork)
  yamop		getwork_seq_code[1]	GETWORK_SEQ		InitOtaplInst(GETWORK_SEQ,_getwork_seq,PredGetworkSeq) RestoreOtaplInst(GETWORK_SEQ,_getwork_seq,PredGetworkSeq)
yamop		getwork_first_time[1]	GETWORK_FIRST_TIME	MkInstE _getwork_first_time
#endif /* YAPOR */
#ifdef TABLING
  yamop		table_load_answer_code[1] LOAD_ANSWER		InitOtaplInst(LOAD_ANSWER,_table_load_answer,PredFail) RestoreOtaplInst(LOAD_ANSWER,_table_load_answer,PredFail)
  yamop		table_try_answer_code[1] TRY_ANSWER		InitOtaplInst(TRY_ANSWER,_table_try_answer,PredFail) RestoreOtaplInst(TRY_ANSWER,_table_try_answer,PredFail)
  yamop		table_answer_resolution_code[1]	ANSWER_RESOLUTION InitOtaplInst(ANSWER_RESOLUTION,_table_answer_resolution,PredFail) RestoreOtaplInst(ANSWER_RESOLUTION,_table_answer_resolution,PredFail)
yamop		table_completion_code[1]	COMPLETION	InitOtaplInst(COMPLETION,_table_completion,PredFail) RestoreOtaplInst(COMPLETION,_table_completion,PredFail)
#endif /* TABLING */

/*  */
/*    PREG just before we enter $spy. We use that to find out the clause which  */
/*    was calling the debugged goal.  */
/*  */
yamop		*debugger_p_before_spy	P_before_spy		=NULL PtoOpAdjust 

/* support recorded_k  */
yamop		*retry_recordedp_code	RETRY_C_RECORDEDP_CODE	=NULL PtoOpAdjust 
yamop		*retry_recorded_k_code	RETRY_C_RECORDED_K_CODE =NULL PtoOpAdjust 

/* compiler flags */
int		system_profiling	PROFILING		=FALSE void
int		system_call_counting	CALL_COUNTING		=FALSE void
int		system_pred_goal_expansion_all	PRED_GOAL_EXPANSION_ALL	=FALSE void
int		system_pred_goal_expansion_func	PRED_GOAL_EXPANSION_FUNC =FALSE void
int		system_pred_goal_expansion_on	PRED_GOAL_EXPANSION_ON	=FALSE void
int		compiler_optimizer_on	optimizer_on		=TRUE void
int		compiler_compile_mode	compile_mode		=0 void
int		compiler_profiling	profiling		=FALSE void
int		compiler_call_counting	call_counting		=FALSE void
/********* whether we should try to compile array references ******************/
int		compiler_compile_arrays	compile_arrays		=FALSE void

/* DBTerms: pre-compiled ground terms */
#if defined(YAPOR) || defined(THREADS)
lockvar		dbterms_list_lock	DBTermsListLock		MkLock
#endif
struct dbterm_list *dbterms_list	DBTermsList		=NULL RestoreDBTermsList()

/* JITI support */
yamop		*expand_clauses_first	ExpandClausesFirst	=NULL void
yamop		*expand_clauses_last	ExpandClausesLast	=NULL RestoreExpandList()
UInt		expand_clauses		Yap_ExpandClauses	=0 void
#if defined(YAPOR) || defined(THREADS)
lockvar		expand_clauses_list_lock ExpandClausesListLock	MkLock
lockvar		op_list_lock		OpListLock		MkLock
#endif
/* instrumentation */
#ifdef DEBUG
UInt		new_cps			Yap_NewCps		=0L void
UInt		live_cps		Yap_LiveCps		=0L void
UInt		dirty_cps		Yap_DirtyCps		=0L void
UInt		freed_cps		Yap_FreedCps		=0L void
#endif
UInt		expand_clauses_sz	Yap_expand_clauses_sz	=0L void

/* UDI support */
struct udi_info *udi_control_blocks	UdiControlBlocks	=NULL RestoreUdiControlBlocks()

/* data-base statistics */
/* system boots in compile mode */
Int		static_predicates_marked STATIC_PREDICATES_MARKED   =FALSE void


/* Internal Database */
Prop		*IntKeys		INT_KEYS		=NULL RestoreIntKeys()
Prop		*IntLUKeys		INT_LU_KEYS		=NULL RestoreIntLUKeys()
Prop		*IntBBKeys		INT_BB_KEYS		=NULL RestoreIntBBKeys()

/* Internal Database Statistics */
UInt		int_keys_size		INT_KEYS_SIZE		=INT_KEYS_DEFAULT_SIZE void
UInt		int_keys_timestamp	INT_KEYS_TIMESTAMP	=0L void
UInt		int_bb_keys_size	INT_BB_KEYS_SIZE	=INT_KEYS_DEFAULT_SIZE void

/* Internal Data-Base Control */
int		update_mode		UPDATE_MODE	        =UPDATE_MODE_LOGICAL void

/* nasty IDB stuff */
struct DB_STRUCT *db_erased_marker	DBErasedMarker		InitDBErasedMarker() RestoreDBErasedMarker() 
struct logic_upd_clause *logdb_erased_marker LogDBErasedMarker	InitLogDBErasedMarker() RestoreLogDBErasedMarker() 

/* Dead clauses and IDB entries */
struct static_clause *dead_static_clauses DeadStaticClauses	=NULL RestoreDeadStaticClauses()
struct static_mega_clause *dead_mega_clauses DeadMegaClauses	=NULL RestoreDeadMegaClauses()
struct static_index *dead_static_indices DeadStaticIndices	=NULL RestoreDeadStaticIndices()
struct logic_upd_clause *db_erased_list	DBErasedList		=NULL RestoreDBErasedList()
struct logic_upd_index *db_erased_ilist DBErasedIList		=NULL RestoreDBErasedIList()
#if defined(YAPOR) || defined(THREADS)
lockvar  dead_static_clauses_lock	DeadStaticClausesLock	MkLock
lockvar  dead_mega_clauses_lock		DeadMegaClausesLock	MkLock
lockvar  dead_static_indices_lock	DeadStaticIndicesLock	MkLock
#endif

#ifdef COROUTINING
/* number of attribute modules */
int		num_of_atts		NUM_OF_ATTS		=1	void
/* initialised by memory allocator */
UInt		atts_size		Yap_AttsSize		void void
#endif

/* stack overflow expansion/gc control */
int		allow_local_expansion	Yap_AllowLocalExpansion =TRUE void 
int		allow_global_expansion	Yap_AllowGlobalExpansion =TRUE void 
int		allow_trail_expansion	Yap_AllowTrailExpansion =TRUE void 
UInt		size_of_overflow	SizeOfOverflow		=0 void
/* amount of space recovered in all garbage collections */
UInt		agc_last_call		AGcLastCall		=0 void
/* amount of space recovered in all garbage collections */
UInt		agc_threshold		AGcThreshold		=10000 void
Agc_hook	agc_hook		AGCHook			=NULL void

/* YAP control flags */
Int		yap_flags_field[NUMBER_OF_YAP_FLAGS] yap_flags InitFlags() void

/* Operators */
struct operator_entry	*op_list	OpList			=NULL OpListAdjust

/* Input/Output */

/* stream array */
struct stream_desc *yap_streams		Stream			=NULL RestoreStreams()

/* stream aliases */
UInt		n_of_file_aliases	NOfFileAliases		=0 void
UInt		sz_of_file_aliases	SzOfFileAliases		=0 void
struct AliasDescS *file_aliases		FileAliases		=NULL RestoreAliases()

/* prompting */
Atom		atprompt		AtPrompt		=AtomNil AtomAdjust
char		prompt[MAX_PROMPT]	Prompt			void void

/* readline */
#if HAVE_LIBREADLINE
char		*readline_buf		ReadlineBuf		=NULL void
char		*readline_pos		ReadlinePos		=0L   void
#endif

/* ISO char conversion: I will make no comments */
char		*char_conversion_table	CharConversionTable	=NULL CodeCharPAdjust
char		*char_conversion_table2	CharConversionTable2	=NULL CodeCharPAdjust

/* write depth */
UInt		maxdepth		max_depth		=0L void
UInt		axlist			max_list		=0L void
UInt		maxwriteargs		max_write_args		=0L void

/* what to do when the parser gives an error: should be thread bound?  */
int		parser_error_style	ParserErrorStyle	=EXCEPTION_ON_PARSER_ERROR void

/* library location.  */
char		*yap_lib_dir		Yap_LibDir		=NULL CodeCharPAdjust

/* time */
void		*last_wtime		LastWtimePtr		=NULL CodeVoidPAdjust

/* profiling */
int		debugger_output_msg	output_msg		=0L void
#if LOW_PROF
int		profiler_on		ProfilerOn		=FALSE void
int		offline_profiler	Yap_OffLineProfiler	=FALSE void
FILE		*f_prof			FProf			=NULL void
FILE		*f_preds		FPreds			=NULL void
UInt		prof_preds		ProfPreds		=0L void
#endif /* LOW_PROF */

/* foreign code loaded */
void		*foreign_code_loaded	ForeignCodeLoaded	=NULL RestoreForeignCode()
ADDR		foreign_code_base	ForeignCodeBase		=NULL void
ADDR		foreign_code_top	ForeignCodeTop		=NULL void
ADDR		foreign_code_max	ForeignCodeMax		=NULL void

/* Threads Array */
#ifdef THREADS
lockvar		thread_handles_lock	ThreadHandlesLock	MkLock
struct thandle	thread_handle[MAX_THREADS] ThreadHandle		InitThreadHandles() void
#endif