diff --git a/C/stdpreds.c b/C/stdpreds.c index 5772d8406..c8ff6f283 100755 --- a/C/stdpreds.c +++ b/C/stdpreds.c @@ -4155,8 +4155,8 @@ Yap_InitCPreds(void) Yap_InitCPred("$has_yap_or", 0, p_has_yap_or, SafePredFlag|SyncPredFlag|HiddenPredFlag); Yap_InitCPred("$has_eam", 0, p_has_eam, SafePredFlag|SyncPredFlag|HiddenPredFlag); #ifndef YAPOR - Yap_InitCPred("$default_sequential", 1, p_default_sequential, SafePredFlag|SyncPredFlag|HiddenPredFlag); - Yap_InitCPred("$yapor_threads", 1, p_yapor_threads, SafePredFlag|SyncPredFlag|HiddenPredFlag); + Yap_InitCPred("$c_default_sequential", 1, p_default_sequential, SafePredFlag|SyncPredFlag|HiddenPredFlag); + Yap_InitCPred("$c_yapor_threads", 1, p_yapor_threads, SafePredFlag|SyncPredFlag|HiddenPredFlag); #endif #ifdef INES Yap_InitCPred("euc_dist", 3, p_euc_dist, SafePredFlag); @@ -4169,9 +4169,6 @@ Yap_InitCPreds(void) #ifdef DEBUG Yap_InitCPred("dump_active_goals", 0, p_dump_active_goals, SafePredFlag|SyncPredFlag); #endif -#ifndef YAPOR - Yap_InitCPred("$yapor_threads", 1, p_yapor_threads, SafePredFlag|SyncPredFlag); -#endif Yap_InitArrayPreds(); Yap_InitBBPreds(); diff --git a/OPTYap/opt.preds.c b/OPTYap/opt.preds.c index 3c9154535..f48921f4f 100644 --- a/OPTYap/opt.preds.c +++ b/OPTYap/opt.preds.c @@ -34,24 +34,6 @@ #include "tab.macros.h" #endif /* TABLING */ -static Int p_yapor_threads(void); -#ifdef YAPOR -static realtime current_time(void); -static Int p_yapor_on(void); -static Int p_start_yapor(void); -static Int p_sequential(void); -static Int p_default_sequential(void); -static Int p_execution_mode(void); -static Int p_performance(void); -static Int p_parallel_new_answer(void); -static Int p_parallel_yes_answer(void); -static int parallel_new_answer_putchar(int sno, int ch); -static void show_answers(void); -static void answer_to_stdout(char *answer); -static Int p_or_statistics(void); -static Int p_worker(void); -#endif /* YAPOR */ - #ifdef TABLING static Int p_freeze_choice_point(void); static Int p_wake_choice_point(void); @@ -65,48 +47,60 @@ static Int p_show_table(void); static Int p_show_all_tables(void); #ifdef GLOBAL_TRIE static Int p_show_global_trie(void); -static Int p_global_trie_statistics(void); +static Int p_show_statistics_global_trie(void); #endif /* GLOBAL_TRIE */ -static Int p_table_statistics(void); -static Int p_tabling_statistics(void); +static Int p_show_statistics_table(void); +static Int p_show_statistics_tabling(void); #endif /* TABLING */ - -#if defined(YAPOR) && defined(TABLING) -static Int p_opt_statistics(void); -#endif /* YAPOR && TABLING */ - -#if defined(DEBUG_YAPOR) || defined(DEBUG_TABLING) -static int p_debug_prolog(void); -#endif /* DEBUG_YAPOR || DEBUG_TABLING */ - -#ifdef SHM_MEMORY_ALLOC_SCHEME -static void shm_pages(long pages_in_use, long bytes_in_use); +static Int p_yapor_threads(void); #ifdef YAPOR -static void shm_or_frames(long *pages_in_use, long *bytes_in_use); -static void shm_query_goal_solution_frames(long *pages_in_use, long *bytes_in_use); -static void shm_query_goal_answer_frames(long *pages_in_use, long *bytes_in_use); +static Int p_worker(void); +static Int p_yapor_on(void); +static Int p_start_yapor(void); +static Int p_default_sequential(void); +static Int p_execution_mode(void); +static Int p_performance(void); +static Int p_parallel_new_answer(void); +static Int p_parallel_yes_answer(void); +static Int p_show_statistics_or(void); #endif /* YAPOR */ -#ifdef TABLING_INNER_CUTS -static void shm_table_subgoal_solution_frames(long *pages_in_use, long *bytes_in_use); -static void shm_table_subgoal_answer_frames(long *pages_in_use, long *bytes_in_use); -#endif /* TABLING_INNER_CUTS */ +#if defined(YAPOR) && defined(TABLING) +static Int p_show_statistics_opt(void); +#endif /* YAPOR && TABLING */ +static Int p_get_optyap_statistics(void); + +#ifdef YAPOR +static inline realtime current_time(void); +static inline int parallel_new_answer_putchar(int sno, int ch); +static inline void show_answers(void); +static inline void answer_to_stdout(char *answer); +#endif /* YAPOR */ + #ifdef TABLING -static void shm_table_entries(long *pages_in_use, long *bytes_in_use); -static void shm_subgoal_frames(long *pages_in_use, long *bytes_in_use); -static void shm_subgoal_trie_nodes(long *pages_in_use, long *bytes_in_use); -static void shm_answer_trie_nodes(long *pages_in_use, long *bytes_in_use); -static void shm_subgoal_trie_hashes(long *pages_in_use, long *bytes_in_use); -static void shm_answer_trie_hashes(long *pages_in_use, long *bytes_in_use); -static void shm_dependency_frames(long *pages_in_use, long *bytes_in_use); +static inline long show_statistics_table_entries(void); +static inline long show_statistics_subgoal_frames(void); +static inline long show_statistics_dependency_frames(void); +static inline long show_statistics_subgoal_trie_nodes(void); +static inline long show_statistics_answer_trie_nodes(void); +static inline long show_statistics_subgoal_trie_hashes(void); +static inline long show_statistics_answer_trie_hashes(void); #ifdef GLOBAL_TRIE -static void shm_global_trie_nodes(long *pages_in_use, long *bytes_in_use); -static void shm_global_trie_hashes(long *pages_in_use, long *bytes_in_use); +static inline long show_statistics_global_trie_nodes(void); +static inline long show_statistics_global_trie_hashes(void); #endif /* GLOBAL_TRIE */ #endif /* TABLING */ +#ifdef YAPOR +static inline long show_statistics_or_frames(void); +static inline long show_statistics_query_goal_solution_frames(void); +static inline long show_statistics_query_goal_answer_frames(void); +#endif /* YAPOR */ #if defined(YAPOR) && defined(TABLING) -static void shm_suspension_frames(long *pages_in_use, long *bytes_in_use); +static inline long show_statistics_suspension_frames(void); +#ifdef TABLING_INNER_CUTS +static inline long show_statistics_table_subgoal_solution_frames(void); +static inline long show_statistics_table_subgoal_answer_frames(void); +#endif /* TABLING_INNER_CUTS */ #endif /* YAPOR && TABLING */ -#endif /* SHM_MEMORY_ALLOC_SCHEME */ @@ -129,19 +123,6 @@ static qg_ans_fr_ptr actual_answer; *******************************/ void Yap_init_optyap_preds(void) { - Yap_InitCPred("$yapor_threads", 1, p_yapor_threads, SafePredFlag|SyncPredFlag|HiddenPredFlag); -#ifdef YAPOR - Yap_InitCPred("$worker", 0, p_worker, SafePredFlag|SyncPredFlag|HiddenPredFlag); - Yap_InitCPred("$yapor_on", 0, p_yapor_on, SafePredFlag|SyncPredFlag|HiddenPredFlag); - Yap_InitCPred("$start_yapor", 0, p_start_yapor, SafePredFlag|SyncPredFlag|HiddenPredFlag); - Yap_InitCPred("$sequential", 1, p_sequential, SafePredFlag|SyncPredFlag|HiddenPredFlag); - Yap_InitCPred("$default_sequential", 1, p_default_sequential, SafePredFlag|SyncPredFlag|HiddenPredFlag); - Yap_InitCPred("execution_mode", 1, p_execution_mode, SafePredFlag|SyncPredFlag); - Yap_InitCPred("performance", 1, p_performance, SafePredFlag|SyncPredFlag); - Yap_InitCPred("$parallel_new_answer", 1, p_parallel_new_answer, SafePredFlag|SyncPredFlag|HiddenPredFlag); - Yap_InitCPred("$parallel_yes_answer", 0, p_parallel_yes_answer, SafePredFlag|SyncPredFlag|HiddenPredFlag); - Yap_InitCPred("or_statistics", 0, p_or_statistics, SafePredFlag|SyncPredFlag); -#endif /* YAPOR */ #ifdef TABLING Yap_InitCPred("freeze_choice_point", 1, p_freeze_choice_point, SafePredFlag|SyncPredFlag); Yap_InitCPred("wake_choice_point", 1, p_wake_choice_point, SafePredFlag|SyncPredFlag); @@ -155,17 +136,27 @@ void Yap_init_optyap_preds(void) { Yap_InitCPred("show_all_tables", 0, p_show_all_tables, SafePredFlag|SyncPredFlag); #ifdef GLOBAL_TRIE Yap_InitCPred("show_global_trie", 0, p_show_global_trie, SafePredFlag|SyncPredFlag); - Yap_InitCPred("global_trie_statistics", 0, p_global_trie_statistics, SafePredFlag|SyncPredFlag); + Yap_InitCPred("global_trie_statistics", 0, p_show_statistics_global_trie, SafePredFlag|SyncPredFlag); #endif /* GLOBAL_TRIE */ - Yap_InitCPred("$c_table_statistics", 2, p_table_statistics, SafePredFlag|SyncPredFlag|HiddenPredFlag); - Yap_InitCPred("tabling_statistics", 0, p_tabling_statistics, SafePredFlag|SyncPredFlag); + Yap_InitCPred("$c_table_statistics", 2, p_show_statistics_table, SafePredFlag|SyncPredFlag|HiddenPredFlag); + Yap_InitCPred("tabling_statistics", 0, p_show_statistics_tabling, SafePredFlag|SyncPredFlag); #endif /* TABLING */ + Yap_InitCPred("$c_yapor_threads", 1, p_yapor_threads, SafePredFlag|SyncPredFlag|HiddenPredFlag); +#ifdef YAPOR + Yap_InitCPred("$c_worker", 0, p_worker, SafePredFlag|SyncPredFlag|HiddenPredFlag); + Yap_InitCPred("$c_yapor_on", 0, p_yapor_on, SafePredFlag|SyncPredFlag|HiddenPredFlag); + Yap_InitCPred("$c_start_yapor", 0, p_start_yapor, SafePredFlag|SyncPredFlag|HiddenPredFlag); + Yap_InitCPred("$c_default_sequential", 1, p_default_sequential, SafePredFlag|SyncPredFlag|HiddenPredFlag); + Yap_InitCPred("execution_mode", 1, p_execution_mode, SafePredFlag|SyncPredFlag); + Yap_InitCPred("performance", 1, p_performance, SafePredFlag|SyncPredFlag); + Yap_InitCPred("$c_parallel_new_answer", 1, p_parallel_new_answer, SafePredFlag|SyncPredFlag|HiddenPredFlag); + Yap_InitCPred("$c_parallel_yes_answer", 0, p_parallel_yes_answer, SafePredFlag|SyncPredFlag|HiddenPredFlag); + Yap_InitCPred("or_statistics", 0, p_show_statistics_or, SafePredFlag|SyncPredFlag); +#endif /* YAPOR */ #if defined(YAPOR) && defined(TABLING) - Yap_InitCPred("opt_statistics", 0, p_opt_statistics, SafePredFlag|SyncPredFlag); + Yap_InitCPred("opt_statistics", 0, p_show_statistics_opt, SafePredFlag|SyncPredFlag); #endif /* YAPOR && TABLING */ -#if defined(DEBUG_YAPOR) || defined(DEBUG_TABLING) - Yap_InitCPred("debug_prolog", 1, p_debug_prolog, SafePredFlag|SyncPredFlag); -#endif /* DEBUG_YAPOR || DEBUG_TABLING */ + Yap_InitCPred("$c_get_optyap_statistics", 3, p_get_optyap_statistics, SafePredFlag|SyncPredFlag|HiddenPredFlag); } @@ -179,12 +170,335 @@ void finish_yapor(void) { -/****************************** -** Local functions ** -******************************/ +/*********************************** +** Tabling C Predicates ** +***********************************/ -static -Int p_yapor_threads(void) { +#ifdef TABLING +static Int p_freeze_choice_point(void) { + Term term_arg, term_cp; + + term_arg = Deref(ARG1); + if (IsVarTerm(term_arg)) { + choiceptr cp = freeze_current_cp(); + term_cp = MkIntegerTerm((Int) cp); + return Yap_unify(ARG1, term_cp); + } + return (FALSE); +} + + +static Int p_wake_choice_point(void) { + Term term_arg; + + term_arg = Deref(ARG1); + if (IsIntegerTerm(term_arg)) { + choiceptr cp = (choiceptr) IntegerOfTerm(term_arg); + resume_frozen_cp(cp); + } + return (FALSE); +} + + +static Int p_abolish_all_frozen_choice_points(void) { + abolish_all_frozen_cps(); + return (TRUE); +} + + +static Int p_table(void) { + Term mod, t; + PredEntry *pe; + Atom at; + int arity; + tab_ent_ptr tab_ent; + + mod = Deref(ARG1); + t = Deref(ARG2); + if (IsAtomTerm(t)) { + at = AtomOfTerm(t); + pe = RepPredProp(PredPropByAtom(at, mod)); + arity = 0; + } else if (IsApplTerm(t)) { + at = NameOfFunctor(FunctorOfTerm(t)); + pe = RepPredProp(PredPropByFunc(FunctorOfTerm(t), mod)); + arity = ArityOfFunctor(FunctorOfTerm(t)); + } else + return (FALSE); + if (pe->PredFlags & TabledPredFlag) + return (TRUE); /* predicate already tabled */ + if (pe->cs.p_code.FirstClause) + return (FALSE); /* predicate already compiled */ + pe->PredFlags |= TabledPredFlag; + new_table_entry(tab_ent, pe, at, arity); + pe->TableOfPred = tab_ent; + return (TRUE); +} + + +static Int p_tabling_mode(void) { + Term mod, t, tvalue; + tab_ent_ptr tab_ent; + + mod = Deref(ARG1); + t = Deref(ARG2); + if (IsAtomTerm(t)) + tab_ent = RepPredProp(PredPropByAtom(AtomOfTerm(t), mod))->TableOfPred; + else if (IsApplTerm(t)) + tab_ent = RepPredProp(PredPropByFunc(FunctorOfTerm(t), mod))->TableOfPred; + else + return (FALSE); + tvalue = Deref(ARG3); + if (IsVarTerm(tvalue)) { + t = TermNil; + if (IsMode_LocalTrie(TabEnt_flags(tab_ent))) + t = MkPairTerm(MkAtomTerm(AtomLocalTrie), t); + else if (IsMode_GlobalTrie(TabEnt_flags(tab_ent))) + t = MkPairTerm(MkAtomTerm(AtomGlobalTrie), t); + if (IsMode_ExecAnswers(TabEnt_flags(tab_ent))) + t = MkPairTerm(MkAtomTerm(AtomExecAnswers), t); + else if (IsMode_LoadAnswers(TabEnt_flags(tab_ent))) + t = MkPairTerm(MkAtomTerm(AtomLoadAnswers), t); + if (IsMode_Batched(TabEnt_flags(tab_ent))) + t = MkPairTerm(MkAtomTerm(AtomBatched), t); + else if (IsMode_Local(TabEnt_flags(tab_ent))) + t = MkPairTerm(MkAtomTerm(AtomLocal), t); + t = MkPairTerm(MkAtomTerm(AtomDefault), t); + t = MkPairTerm(t, TermNil); + if (IsMode_LocalTrie(TabEnt_mode(tab_ent))) + t = MkPairTerm(MkAtomTerm(AtomLocalTrie), t); + else if (IsMode_GlobalTrie(TabEnt_mode(tab_ent))) + t = MkPairTerm(MkAtomTerm(AtomGlobalTrie), t); + if (IsMode_ExecAnswers(TabEnt_mode(tab_ent))) + t = MkPairTerm(MkAtomTerm(AtomExecAnswers), t); + else if (IsMode_LoadAnswers(TabEnt_mode(tab_ent))) + t = MkPairTerm(MkAtomTerm(AtomLoadAnswers), t); + if (IsMode_Batched(TabEnt_mode(tab_ent))) + t = MkPairTerm(MkAtomTerm(AtomBatched), t); + else if (IsMode_Local(TabEnt_mode(tab_ent))) + t = MkPairTerm(MkAtomTerm(AtomLocal), t); + Bind((CELL *) tvalue, t); + return(TRUE); + } else if (IsIntTerm(tvalue)) { + Int value = IntOfTerm(tvalue); + if (value == 1) { /* batched */ + SetMode_Batched(TabEnt_flags(tab_ent)); + if (! IsMode_Local(yap_flags[TABLING_MODE_FLAG])) { + SetMode_Batched(TabEnt_mode(tab_ent)); + return(TRUE); + } + } else if (value == 2) { /* local */ + SetMode_Local(TabEnt_flags(tab_ent)); + if (! IsMode_Batched(yap_flags[TABLING_MODE_FLAG])) { + SetMode_Local(TabEnt_mode(tab_ent)); + return(TRUE); + } + } else if (value == 3) { /* exec_answers */ + SetMode_ExecAnswers(TabEnt_flags(tab_ent)); + if (! IsMode_LoadAnswers(yap_flags[TABLING_MODE_FLAG])) { + SetMode_ExecAnswers(TabEnt_mode(tab_ent)); + return(TRUE); + } + } else if (value == 4) { /* load_answers */ + SetMode_LoadAnswers(TabEnt_flags(tab_ent)); + if (! IsMode_ExecAnswers(yap_flags[TABLING_MODE_FLAG])) { + SetMode_LoadAnswers(TabEnt_mode(tab_ent)); + return(TRUE); + } + } else if (value == 5) { /* local_trie */ + SetMode_LocalTrie(TabEnt_flags(tab_ent)); + if (! IsMode_GlobalTrie(yap_flags[TABLING_MODE_FLAG])) { + SetMode_LocalTrie(TabEnt_mode(tab_ent)); + return(TRUE); + } + } else if (value == 6) { /* global_trie */ + SetMode_GlobalTrie(TabEnt_flags(tab_ent)); + if (! IsMode_LocalTrie(yap_flags[TABLING_MODE_FLAG])) { + SetMode_GlobalTrie(TabEnt_mode(tab_ent)); + return(TRUE); + } + } + } + return (FALSE); +} + + +static Int p_abolish_table(void) { + Term mod, t; + tab_ent_ptr tab_ent; + sg_hash_ptr hash; + sg_node_ptr sg_node; + + mod = Deref(ARG1); + t = Deref(ARG2); + if (IsAtomTerm(t)) + tab_ent = RepPredProp(PredPropByAtom(AtomOfTerm(t), mod))->TableOfPred; + else if (IsApplTerm(t)) + tab_ent = RepPredProp(PredPropByFunc(FunctorOfTerm(t), mod))->TableOfPred; + else + return (FALSE); + hash = TabEnt_hash_chain(tab_ent); + TabEnt_hash_chain(tab_ent) = NULL; + free_subgoal_trie_hash_chain(hash); + sg_node = TrNode_child(TabEnt_subgoal_trie(tab_ent)); + if (sg_node) { + TrNode_child(TabEnt_subgoal_trie(tab_ent)) = NULL; +#ifdef GLOBAL_TRIE + free_subgoal_trie_branch(sg_node, TabEnt_arity(tab_ent), TRAVERSE_POSITION_FIRST); +#else + free_subgoal_trie_branch(sg_node, TabEnt_arity(tab_ent), 0, TRAVERSE_POSITION_FIRST); +#endif /* GLOBAL_TRIE */ + } + return (TRUE); +} + + +static Int p_abolish_all_tables(void) { + tab_ent_ptr tab_ent; + sg_hash_ptr hash; + sg_node_ptr sg_node; + + tab_ent = GLOBAL_root_tab_ent; + while(tab_ent) { + hash = TabEnt_hash_chain(tab_ent); + TabEnt_hash_chain(tab_ent) = NULL; + free_subgoal_trie_hash_chain(hash); + sg_node = TrNode_child(TabEnt_subgoal_trie(tab_ent)); + if (sg_node) { + TrNode_child(TabEnt_subgoal_trie(tab_ent)) = NULL; +#ifdef GLOBAL_TRIE + free_subgoal_trie_branch(sg_node, TabEnt_arity(tab_ent), TRAVERSE_POSITION_FIRST); +#else + free_subgoal_trie_branch(sg_node, TabEnt_arity(tab_ent), 0, TRAVERSE_POSITION_FIRST); +#endif /* GLOBAL_TRIE */ + } + tab_ent = TabEnt_next(tab_ent); + } + return (TRUE); +} + + +static Int p_show_tabled_predicates(void) { + tab_ent_ptr tab_ent; + + tab_ent = GLOBAL_root_tab_ent; + fprintf(Yap_stdout, "Tabled predicates\n"); + if (tab_ent == NULL) + fprintf(Yap_stdout, " NONE\n"); + else + while(tab_ent) { + fprintf(Yap_stdout, " %s/%d\n", AtomName(TabEnt_atom(tab_ent)), TabEnt_arity(tab_ent)); + tab_ent = TabEnt_next(tab_ent); + } + return (TRUE); +} + + +static Int p_show_table(void) { + Term mod, t; + tab_ent_ptr tab_ent; + + mod = Deref(ARG1); + t = Deref(ARG2); + if (IsAtomTerm(t)) + tab_ent = RepPredProp(PredPropByAtom(AtomOfTerm(t), mod))->TableOfPred; + else if (IsApplTerm(t)) + tab_ent = RepPredProp(PredPropByFunc(FunctorOfTerm(t), mod))->TableOfPred; + else + return (FALSE); + show_table(tab_ent, SHOW_MODE_STRUCTURE); + return (TRUE); +} + + +static Int p_show_all_tables(void) { + tab_ent_ptr tab_ent; + + tab_ent = GLOBAL_root_tab_ent; + while(tab_ent) { + show_table(tab_ent, SHOW_MODE_STRUCTURE); + tab_ent = TabEnt_next(tab_ent); + } + return (TRUE); +} + + +#ifdef GLOBAL_TRIE +static Int p_show_global_trie(void) { + show_global_trie(SHOW_MODE_STRUCTURE); + return (TRUE); +} + +static Int p_show_statistics_global_trie(void) { + show_global_trie(SHOW_MODE_STATISTICS); + return (TRUE); +} +#endif /* GLOBAL_TRIE */ + + +static Int p_show_statistics_table(void) { + Term mod, t; + tab_ent_ptr tab_ent; + + mod = Deref(ARG1); + t = Deref(ARG2); + if (IsAtomTerm(t)) + tab_ent = RepPredProp(PredPropByAtom(AtomOfTerm(t), mod))->TableOfPred; + else if (IsApplTerm(t)) + tab_ent = RepPredProp(PredPropByFunc(FunctorOfTerm(t), mod))->TableOfPred; + else + return (FALSE); + show_table(tab_ent, SHOW_MODE_STATISTICS); + return (TRUE); +} + + +static Int p_show_statistics_tabling(void) { + long total_bytes = 0, aux_bytes; + + aux_bytes = 0; + fprintf(Yap_stdout, "Execution data structures\n"); + aux_bytes += show_statistics_table_entries(); + aux_bytes += show_statistics_subgoal_frames(); + aux_bytes += show_statistics_dependency_frames(); + fprintf(Yap_stdout, " Memory in use: %10ld bytes\n", aux_bytes); + total_bytes += aux_bytes; + aux_bytes = 0; + fprintf(Yap_stdout, "\nLocal trie data structures\n"); + aux_bytes += show_statistics_subgoal_trie_nodes(); + aux_bytes += show_statistics_answer_trie_nodes(); + aux_bytes += show_statistics_subgoal_trie_hashes(); + aux_bytes += show_statistics_answer_trie_hashes(); + fprintf(Yap_stdout, " Memory in use: %10ld bytes\n", aux_bytes); + total_bytes += aux_bytes; +#ifdef GLOBAL_TRIE + aux_bytes = 0; + fprintf(Yap_stdout, "\nGlobal trie data structures\n"); + aux_bytes += show_statistics_global_trie_nodes(); + aux_bytes += show_statistics_global_trie_hashes(); + fprintf(Yap_stdout, " Memory in use: %10ld bytes\n", aux_bytes); + total_bytes += aux_bytes; +#endif /* GLOBAL_TRIE */ +#ifdef SHM_MEMORY_ALLOC_SCHEME + fprintf(Yap_stdout, "\nTotal memory in use: %10ld bytes (%ld pages in use)\n", + total_bytes, Pg_str_in_use(GLOBAL_PAGES_void)); + fprintf(Yap_stdout, "Total memory allocated: %10ld bytes (%ld pages in total)\n", + Pg_pg_alloc(GLOBAL_PAGES_void) * Yap_page_size, Pg_pg_alloc(GLOBAL_PAGES_void)); +#else + fprintf(Yap_stdout, "\nTotal memory in use: %10ld bytes\n", total_bytes); +#endif /* SHM_MEMORY_ALLOC_SCHEME */ + + return (TRUE); +} +#endif /* TABLING */ + + + +/********************************* +** YapOr C Predicates ** +*********************************/ + +static Int p_yapor_threads(void) { #if defined(YAPOR) && defined(THREADS) return Yap_unify(MkIntegerTerm(number_workers),ARG1); #else @@ -194,27 +508,19 @@ Int p_yapor_threads(void) { #ifdef YAPOR -static -realtime current_time(void) { - /* to get time as Yap */ - /* - double now, interval; - Yap_cputime_interval(&now, &interval); - return ((realtime)now); - */ - struct timeval tempo; - gettimeofday(&tempo, NULL); - return ((realtime)tempo.tv_sec + (realtime)tempo.tv_usec / TIME_RESOLUTION); +static Int p_worker(void) { + CurrentModule = USER_MODULE; + P = GETWORK_FIRST_TIME; + return TRUE; } -static -Int p_yapor_on(void) { +static Int p_yapor_on(void) { return (PARALLEL_EXECUTION_MODE); } -static -Int p_start_yapor(void) { + +static Int p_start_yapor(void) { #ifdef TIMESTAMP_CHECK GLOBAL_timestamp = 0; #endif /* TIMESTAMP_CHECK */ @@ -233,39 +539,8 @@ Int p_start_yapor(void) { return (TRUE); } -static -Int p_worker(void) { - CurrentModule = USER_MODULE; - P = GETWORK_FIRST_TIME; - return TRUE; -} -static -Int p_sequential(void) { - Term t, mod; - PredEntry *pe; - - mod = Deref(ARG2); - if (IsVarTerm(mod) || !IsAtomTerm(mod)) { - return(FALSE); - } - t = Deref(ARG1); - if (IsAtomTerm(t)) { - Atom at = AtomOfTerm(t); - pe = RepPredProp(PredPropByAtom(at, mod)); - } else if (IsApplTerm(t)) { - Functor func = FunctorOfTerm(t); - pe = RepPredProp(PredPropByFunc(func, mod)); - } else { - return(FALSE); - } - pe->PredFlags |= SequentialPredFlag; - return (TRUE); -} - - -static -Int p_default_sequential(void) { +static Int p_default_sequential(void) { Term t; t = Deref(ARG1); if (IsVarTerm(t)) { @@ -293,8 +568,7 @@ Int p_default_sequential(void) { } -static -Int p_execution_mode(void) { +static Int p_execution_mode(void) { Term t; t = Deref(ARG1); if (IsVarTerm(t)) { @@ -322,8 +596,7 @@ Int p_execution_mode(void) { } -static -Int p_performance(void) { +static Int p_performance(void) { Term t; realtime one_worker_execution_time = 0; int i; @@ -397,8 +670,7 @@ Int p_performance(void) { } -static -Int p_parallel_new_answer(void) { +static Int p_parallel_new_answer(void) { or_fr_ptr leftmost_or_fr; length_answer = 0; @@ -419,22 +691,247 @@ Int p_parallel_new_answer(void) { } -static -Int p_parallel_yes_answer(void) { +static Int p_parallel_yes_answer(void) { GLOBAL_answers = YES_ANSWER; return (TRUE); } -static -int parallel_new_answer_putchar(int sno, int ch) { +static Int p_show_statistics_or(void) { + long total_bytes = 0, aux_bytes; + + aux_bytes = 0; + fprintf(Yap_stdout, "Execution data structures\n"); + aux_bytes += show_statistics_or_frames(); + fprintf(Yap_stdout, " Memory in use: %10ld bytes\n", aux_bytes); + total_bytes += aux_bytes; + aux_bytes = 0; + fprintf(Yap_stdout, "\nCut support data structures\n"); + aux_bytes += show_statistics_query_goal_solution_frames(); + aux_bytes += show_statistics_query_goal_answer_frames(); + fprintf(Yap_stdout, " Memory in use: %10ld bytes\n", aux_bytes); + total_bytes += aux_bytes; +#ifdef SHM_MEMORY_ALLOC_SCHEME + fprintf(Yap_stdout, "\nTotal memory in use: %10ld bytes (%ld pages in use)\n", + total_bytes, Pg_str_in_use(GLOBAL_PAGES_void)); + fprintf(Yap_stdout, "Total memory allocated: %10ld bytes (%ld pages in total)\n", + Pg_pg_alloc(GLOBAL_PAGES_void) * Yap_page_size, Pg_pg_alloc(GLOBAL_PAGES_void)); +#else + fprintf(Yap_stdout, "\nTotal memory in use: %10ld bytes\n", total_bytes); +#endif /* SHM_MEMORY_ALLOC_SCHEME */ + + return (TRUE); +} +#endif /* YAPOR */ + + + +/********************************** +** OPTYap C Predicates ** +**********************************/ + +#if defined(YAPOR) && defined(TABLING) +static Int p_show_statistics_opt(void) { + long total_bytes = 0, aux_bytes; + + aux_bytes = 0; + fprintf(Yap_stdout, "Execution data structures\n"); + aux_bytes += show_statistics_table_entries(); + aux_bytes += show_statistics_subgoal_frames(); + aux_bytes += show_statistics_dependency_frames(); + aux_bytes += show_statistics_or_frames(); + aux_bytes += show_statistics_suspension_frames(); + fprintf(Yap_stdout, " Memory in use: %10ld bytes\n", aux_bytes); + total_bytes += aux_bytes; + aux_bytes = 0; + fprintf(Yap_stdout, "\nLocal trie data structures\n"); + aux_bytes += show_statistics_subgoal_trie_nodes(); + aux_bytes += show_statistics_answer_trie_nodes(); + aux_bytes += show_statistics_subgoal_trie_hashes(); + aux_bytes += show_statistics_answer_trie_hashes(); + fprintf(Yap_stdout, " Memory in use: %10ld bytes\n", aux_bytes); + total_bytes += aux_bytes; +#ifdef GLOBAL_TRIE + aux_bytes = 0; + fprintf(Yap_stdout, "\nGlobal trie data structures\n"); + aux_bytes += show_statistics_global_trie_nodes(); + aux_bytes += show_statistics_global_trie_hashes(); + fprintf(Yap_stdout, " Memory in use: %10ld bytes\n", aux_bytes); + total_bytes += aux_bytes; +#endif /* GLOBAL_TRIE */ + aux_bytes = 0; + fprintf(Yap_stdout, "\nCut support data structures\n"); + aux_bytes += show_statistics_query_goal_solution_frames(); + aux_bytes += show_statistics_query_goal_answer_frames(); +#ifdef TABLING_INNER_CUTS + aux_bytes += show_statistics_table_subgoal_solution_frames(); + aux_bytes += show_statistics_table_subgoal_answer_frames(); +#endif /* TABLING_INNER_CUTS */ + fprintf(Yap_stdout, " Memory in use: %10ld bytes\n", aux_bytes); + total_bytes += aux_bytes; +#ifdef SHM_MEMORY_ALLOC_SCHEME + fprintf(Yap_stdout, "\nTotal memory in use: %10ld bytes (%ld pages in use)\n", + total_bytes, Pg_str_in_use(GLOBAL_PAGES_void)); + fprintf(Yap_stdout, "Total memory allocated: %10ld bytes (%ld pages in total)\n", + Pg_pg_alloc(GLOBAL_PAGES_void) * Yap_page_size, Pg_pg_alloc(GLOBAL_PAGES_void)); +#else + fprintf(Yap_stdout, "\nTotal memory in use: %10ld bytes\n", total_bytes); +#endif /* SHM_MEMORY_ALLOC_SCHEME */ + + return (TRUE); +} +#endif /* YAPOR && TABLING */ + + +static Int p_get_optyap_statistics(void) { + Term tbytes, tstructs; + Int value, bytes = -1, structs = -1; + + value = IntOfTerm(Deref(ARG1)); + if (value == 0) { /* total_memory */ + bytes = 0; +#ifdef TABLING + bytes += Pg_str_in_use(GLOBAL_PAGES_tab_ent) * sizeof(struct table_entry); + bytes += Pg_str_in_use(GLOBAL_PAGES_sg_fr) * sizeof(struct subgoal_frame); + bytes += Pg_str_in_use(GLOBAL_PAGES_dep_fr) * sizeof(struct dependency_frame); + bytes += Pg_str_in_use(GLOBAL_PAGES_sg_node) * sizeof(struct subgoal_trie_node); + bytes += Pg_str_in_use(GLOBAL_PAGES_ans_node) * sizeof(struct answer_trie_node); + bytes += Pg_str_in_use(GLOBAL_PAGES_sg_hash) * sizeof(struct subgoal_trie_hash); + bytes += Pg_str_in_use(GLOBAL_PAGES_ans_hash) * sizeof(struct answer_trie_hash); +#ifdef GLOBAL_TRIE + bytes += Pg_str_in_use(GLOBAL_PAGES_gt_node) * sizeof(struct global_trie_node); + bytes += Pg_str_in_use(GLOBAL_PAGES_gt_hash) * sizeof(struct global_trie_hash); +#endif /* GLOBAL_TRIE */ +#endif /* TABLING */ +#ifdef YAPOR + bytes += Pg_str_in_use(GLOBAL_PAGES_or_fr) * sizeof(struct or_frame); + bytes += Pg_str_in_use(GLOBAL_PAGES_qg_sol_fr) * sizeof(struct query_goal_solution_frame); + bytes += Pg_str_in_use(GLOBAL_PAGES_qg_ans_fr) * sizeof(struct query_goal_answer_frame); +#endif /* YAPOR */ +#if defined(YAPOR) && defined(TABLING) + bytes += Pg_str_in_use(GLOBAL_PAGES_susp_fr) * sizeof(struct suspension_frame); +#ifdef TABLING_INNER_CUTS + bytes += Pg_str_in_use(GLOBAL_PAGES_tg_sol_fr) * sizeof(struct table_subgoal_solution_frame); + bytes += Pg_str_in_use(GLOBAL_PAGES_tg_ans_fr) * sizeof(struct table_subgoal_answer_frame); +#endif /* TABLING_INNER_CUTS */ +#endif /* YAPOR && TABLING */ +#ifdef SHM_MEMORY_ALLOC_SCHEME + structs = Pg_pg_alloc(GLOBAL_PAGES_void) * Yap_page_size; +#else + structs = bytes; +#endif /* SHM_MEMORY_ALLOC_SCHEME */ + } +#ifdef TABLING + if (value == 1) { /* table_entries */ + bytes = Pg_str_in_use(GLOBAL_PAGES_tab_ent) * sizeof(struct table_entry); + structs = Pg_str_in_use(GLOBAL_PAGES_tab_ent); + } + if (value == 2) { /* subgoal_frames */ + bytes = Pg_str_in_use(GLOBAL_PAGES_sg_fr) * sizeof(struct subgoal_frame); + structs = Pg_str_in_use(GLOBAL_PAGES_sg_fr); + } + if (value == 3) { /* dependency_frames */ + bytes = Pg_str_in_use(GLOBAL_PAGES_dep_fr) * sizeof(struct dependency_frame); + structs = Pg_str_in_use(GLOBAL_PAGES_dep_fr); + } + if (value == 6) { /* subgoal_trie_nodes */ + bytes = Pg_str_in_use(GLOBAL_PAGES_sg_node) * sizeof(struct subgoal_trie_node); + structs = Pg_str_in_use(GLOBAL_PAGES_sg_node); + } + if (value == 7) { /* answer_trie_nodes */ + bytes = Pg_str_in_use(GLOBAL_PAGES_ans_node) * sizeof(struct answer_trie_node); + structs = Pg_str_in_use(GLOBAL_PAGES_ans_node); + } + if (value == 8) { /* subgoal_trie_hashes */ + bytes = Pg_str_in_use(GLOBAL_PAGES_sg_hash) * sizeof(struct subgoal_trie_hash); + structs = Pg_str_in_use(GLOBAL_PAGES_sg_hash); + } + if (value == 9) { /* answer_trie_hashes */ + bytes = Pg_str_in_use(GLOBAL_PAGES_ans_hash) * sizeof(struct answer_trie_hash); + structs = Pg_str_in_use(GLOBAL_PAGES_ans_hash); + } +#ifdef GLOBAL_TRIE + if (value == 10) { /* global_trie_nodes */ + bytes = Pg_str_in_use(GLOBAL_PAGES_gt_node) * sizeof(struct global_trie_node); + structs = Pg_str_in_use(GLOBAL_PAGES_gt_node); + } + if (value == 11) { /* global_trie_hashes */ + bytes = Pg_str_in_use(GLOBAL_PAGES_gt_hash) * sizeof(struct global_trie_hash); + structs = Pg_str_in_use(GLOBAL_PAGES_gt_hash); + } +#endif /* GLOBAL_TRIE */ +#endif /* TABLING */ +#ifdef YAPOR + if (value == 4) { /* or_frames */ + bytes = Pg_str_in_use(GLOBAL_PAGES_or_fr) * sizeof(struct or_frame); + structs = Pg_str_in_use(GLOBAL_PAGES_or_fr); + } + if (value == 12) { /* query_goal_solution_frames */ + bytes = Pg_str_in_use(GLOBAL_PAGES_qg_sol_fr) * sizeof(struct query_goal_solution_frame); + structs = Pg_str_in_use(GLOBAL_PAGES_qg_sol_fr); + } + if (value == 13) { /* query_goal_answer_frames */ + bytes = Pg_str_in_use(GLOBAL_PAGES_qg_ans_fr) * sizeof(struct query_goal_answer_frame); + structs = Pg_str_in_use(GLOBAL_PAGES_qg_ans_fr); + } +#endif /* YAPOR */ +#if defined(YAPOR) && defined(TABLING) + if (value == 5) { /* suspension_frames */ + bytes = Pg_str_in_use(GLOBAL_PAGES_susp_fr) * sizeof(struct suspension_frame); + structs = Pg_str_in_use(GLOBAL_PAGES_susp_fr); + } +#ifdef TABLING_INNER_CUTS + if (value == 14) { /* table_subgoal_solution_frames */ + bytes = Pg_str_in_use(GLOBAL_PAGES_tg_sol_fr) * sizeof(struct table_subgoal_solution_frame); + structs = Pg_str_in_use(GLOBAL_PAGES_tg_sol_fr); + } + if (value == 15) { /* table_subgoal_answer_frames */ + bytes = Pg_str_in_use(GLOBAL_PAGES_tg_ans_fr) * sizeof(struct table_subgoal_answer_frame); + structs = Pg_str_in_use(GLOBAL_PAGES_tg_ans_fr); + } +#endif /* TABLING_INNER_CUTS */ +#endif /* YAPOR && TABLING */ + if (bytes == -1) + return (FALSE); + tbytes = Deref(ARG2); + tstructs = Deref(ARG3); + if (IsVarTerm(tbytes)) { + Bind((CELL *) tbytes, MkIntTerm(bytes)); + } else if (IsIntTerm(tbytes) && IntOfTerm(tbytes) != bytes) + return (FALSE); + if (IsVarTerm(tstructs)) { + Bind((CELL *) tstructs, MkIntTerm(structs)); + } else if (IsIntTerm(tstructs) && IntOfTerm(tstructs) != structs) + return (FALSE); + return (TRUE); +} + + + +/****************************** +** Local functions ** +******************************/ + +#ifdef YAPOR +static inline realtime current_time(void) { + /* to get time as Yap */ + /* + double now, interval; + Yap_cputime_interval(&now, &interval); + return ((realtime)now); + */ + struct timeval tempo; + gettimeofday(&tempo, NULL); + return ((realtime)tempo.tv_sec + (realtime)tempo.tv_usec / TIME_RESOLUTION); +} + +static inline int parallel_new_answer_putchar(int sno, int ch) { AnsFr_answer(actual_answer)[length_answer++] = ch; return ch; } -static -void show_answers(void) { +static inline void show_answers(void) { int i; if (OrFr_qg_solutions(LOCAL_top_or_fr)) { qg_ans_fr_ptr aux_answer1, aux_answer2; @@ -488,8 +985,7 @@ void show_answers(void) { } -static -void answer_to_stdout(char *answer) { +static inline void answer_to_stdout(char *answer) { int length_answer = 0, length_output = 0, caracter, list, par_rectos; char output[MAX_LENGTH_ANSWER]; while (1) { @@ -527,643 +1023,17 @@ void answer_to_stdout(char *answer) { fprintf(Yap_stderr, " %s\n", output); return; } - - -static -Int p_or_statistics(void) { -#ifdef SHM_MEMORY_ALLOC_SCHEME - long pages_in_use = 0, bytes_in_use = 0; - - shm_or_frames(&pages_in_use, &bytes_in_use); - shm_query_goal_solution_frames(&pages_in_use, &bytes_in_use); - shm_query_goal_answer_frames(&pages_in_use, &bytes_in_use); - shm_pages(pages_in_use, bytes_in_use); -#else - long bytes_in_use = 0; - - fprintf(Yap_stdout, "%s Or-frames: %10ld structs in use\n", - Pg_str_in_use(GLOBAL_PAGES_or_fr) == 1 ? " ": "*", Pg_str_in_use(GLOBAL_PAGES_or_fr)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_or_fr) * sizeof(struct or_frame); - fprintf(Yap_stdout, "%s Query goal solution frames: %10ld structs in use\n", - Pg_str_in_use(GLOBAL_PAGES_qg_sol_fr) == 0 ? " ": "*", Pg_str_in_use(GLOBAL_PAGES_qg_sol_fr)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_qg_sol_fr) * sizeof(struct query_goal_solution_frame); - fprintf(Yap_stdout, "%s Query goal answer frames: %10ld structs in use\n", - Pg_str_in_use(GLOBAL_PAGES_qg_ans_fr) == 0 ? " ": "*", Pg_str_in_use(GLOBAL_PAGES_qg_ans_fr)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_qg_ans_fr) * sizeof(struct query_goal_answer_frame); - fprintf(Yap_stdout, " Total memory in use: %10ld bytes\n", bytes_in_use); -#endif /* MEMORY_ALLOC_SCHEME */ - return (TRUE); -} #endif /* YAPOR */ #ifdef TABLING -static -Int p_freeze_choice_point(void) { - Term term_arg, term_cp; - - term_arg = Deref(ARG1); - if (IsVarTerm(term_arg)) { - choiceptr cp = freeze_current_cp(); - term_cp = MkIntegerTerm((Int) cp); - return Yap_unify(ARG1, term_cp); - } - return (FALSE); -} - - -static -Int p_wake_choice_point(void) { - Term term_arg; - - term_arg = Deref(ARG1); - if (IsIntegerTerm(term_arg)) { - choiceptr cp = (choiceptr) IntegerOfTerm(term_arg); - resume_frozen_cp(cp); - } - return (FALSE); -} - - -static -Int p_abolish_all_frozen_choice_points(void) { - abolish_all_frozen_cps(); - return (TRUE); -} - - -static -Int p_table(void) { - Term mod, t; - PredEntry *pe; - Atom at; - int arity; - tab_ent_ptr tab_ent; - - mod = Deref(ARG1); - t = Deref(ARG2); - if (IsAtomTerm(t)) { - at = AtomOfTerm(t); - pe = RepPredProp(PredPropByAtom(at, mod)); - arity = 0; - } else if (IsApplTerm(t)) { - at = NameOfFunctor(FunctorOfTerm(t)); - pe = RepPredProp(PredPropByFunc(FunctorOfTerm(t), mod)); - arity = ArityOfFunctor(FunctorOfTerm(t)); - } else - return (FALSE); - if (pe->PredFlags & TabledPredFlag) - return (TRUE); /* predicate already tabled */ - if (pe->cs.p_code.FirstClause) - return (FALSE); /* predicate already compiled */ - pe->PredFlags |= TabledPredFlag; - new_table_entry(tab_ent, pe, at, arity); - pe->TableOfPred = tab_ent; - return (TRUE); -} - - -static -Int p_tabling_mode(void) { - Term mod, t, tvalue; - tab_ent_ptr tab_ent; - - mod = Deref(ARG1); - t = Deref(ARG2); - if (IsAtomTerm(t)) - tab_ent = RepPredProp(PredPropByAtom(AtomOfTerm(t), mod))->TableOfPred; - else if (IsApplTerm(t)) - tab_ent = RepPredProp(PredPropByFunc(FunctorOfTerm(t), mod))->TableOfPred; - else - return (FALSE); - tvalue = Deref(ARG3); - if (IsVarTerm(tvalue)) { - t = TermNil; - if (IsMode_LocalTrie(TabEnt_flags(tab_ent))) - t = MkPairTerm(MkAtomTerm(AtomLocalTrie), t); - else if (IsMode_GlobalTrie(TabEnt_flags(tab_ent))) - t = MkPairTerm(MkAtomTerm(AtomGlobalTrie), t); - if (IsMode_ExecAnswers(TabEnt_flags(tab_ent))) - t = MkPairTerm(MkAtomTerm(AtomExecAnswers), t); - else if (IsMode_LoadAnswers(TabEnt_flags(tab_ent))) - t = MkPairTerm(MkAtomTerm(AtomLoadAnswers), t); - if (IsMode_Batched(TabEnt_flags(tab_ent))) - t = MkPairTerm(MkAtomTerm(AtomBatched), t); - else if (IsMode_Local(TabEnt_flags(tab_ent))) - t = MkPairTerm(MkAtomTerm(AtomLocal), t); - t = MkPairTerm(MkAtomTerm(AtomDefault), t); - t = MkPairTerm(t, TermNil); - if (IsMode_LocalTrie(TabEnt_mode(tab_ent))) - t = MkPairTerm(MkAtomTerm(AtomLocalTrie), t); - else if (IsMode_GlobalTrie(TabEnt_mode(tab_ent))) - t = MkPairTerm(MkAtomTerm(AtomGlobalTrie), t); - if (IsMode_ExecAnswers(TabEnt_mode(tab_ent))) - t = MkPairTerm(MkAtomTerm(AtomExecAnswers), t); - else if (IsMode_LoadAnswers(TabEnt_mode(tab_ent))) - t = MkPairTerm(MkAtomTerm(AtomLoadAnswers), t); - if (IsMode_Batched(TabEnt_mode(tab_ent))) - t = MkPairTerm(MkAtomTerm(AtomBatched), t); - else if (IsMode_Local(TabEnt_mode(tab_ent))) - t = MkPairTerm(MkAtomTerm(AtomLocal), t); - Bind((CELL *) tvalue, t); - return(TRUE); - } else if (IsIntTerm(tvalue)) { - Int value = IntOfTerm(tvalue); - if (value == 1) { /* batched */ - SetMode_Batched(TabEnt_flags(tab_ent)); - if (! IsMode_Local(yap_flags[TABLING_MODE_FLAG])) - SetMode_Batched(TabEnt_mode(tab_ent)); - return(TRUE); - } else if (value == 2) { /* local */ - SetMode_Local(TabEnt_flags(tab_ent)); - if (! IsMode_Batched(yap_flags[TABLING_MODE_FLAG])) - SetMode_Local(TabEnt_mode(tab_ent)); - return(TRUE); - } else if (value == 3) { /* exec_answers */ - SetMode_ExecAnswers(TabEnt_flags(tab_ent)); - if (! IsMode_LoadAnswers(yap_flags[TABLING_MODE_FLAG])) - SetMode_ExecAnswers(TabEnt_mode(tab_ent)); - return(TRUE); - } else if (value == 4) { /* load_answers */ - SetMode_LoadAnswers(TabEnt_flags(tab_ent)); - if (! IsMode_ExecAnswers(yap_flags[TABLING_MODE_FLAG])) - SetMode_LoadAnswers(TabEnt_mode(tab_ent)); - return(TRUE); - } else if (value == 5) { /* local_trie */ - SetMode_LocalTrie(TabEnt_flags(tab_ent)); - if (! IsMode_GlobalTrie(yap_flags[TABLING_MODE_FLAG])) - SetMode_LocalTrie(TabEnt_mode(tab_ent)); - return(TRUE); - } else if (value == 6) { /* global_trie */ - SetMode_GlobalTrie(TabEnt_flags(tab_ent)); - if (! IsMode_LocalTrie(yap_flags[TABLING_MODE_FLAG])) - SetMode_GlobalTrie(TabEnt_mode(tab_ent)); - return(TRUE); - } - } - return (FALSE); -} - - -static -Int p_abolish_table(void) { - Term mod, t; - tab_ent_ptr tab_ent; - sg_hash_ptr hash; - sg_node_ptr sg_node; - - mod = Deref(ARG1); - t = Deref(ARG2); - if (IsAtomTerm(t)) - tab_ent = RepPredProp(PredPropByAtom(AtomOfTerm(t), mod))->TableOfPred; - else if (IsApplTerm(t)) - tab_ent = RepPredProp(PredPropByFunc(FunctorOfTerm(t), mod))->TableOfPred; - else - return (FALSE); - hash = TabEnt_hash_chain(tab_ent); - TabEnt_hash_chain(tab_ent) = NULL; - free_subgoal_trie_hash_chain(hash); - sg_node = TrNode_child(TabEnt_subgoal_trie(tab_ent)); - if (sg_node) { - TrNode_child(TabEnt_subgoal_trie(tab_ent)) = NULL; -#ifdef GLOBAL_TRIE - free_subgoal_trie_branch(sg_node, TabEnt_arity(tab_ent), TRAVERSE_POSITION_FIRST); -#else - free_subgoal_trie_branch(sg_node, TabEnt_arity(tab_ent), 0, TRAVERSE_POSITION_FIRST); -#endif /* GLOBAL_TRIE */ - } - return (TRUE); -} - - -static -Int p_abolish_all_tables(void) { - tab_ent_ptr tab_ent; - sg_hash_ptr hash; - sg_node_ptr sg_node; - - tab_ent = GLOBAL_root_tab_ent; - while(tab_ent) { - hash = TabEnt_hash_chain(tab_ent); - TabEnt_hash_chain(tab_ent) = NULL; - free_subgoal_trie_hash_chain(hash); - sg_node = TrNode_child(TabEnt_subgoal_trie(tab_ent)); - if (sg_node) { - TrNode_child(TabEnt_subgoal_trie(tab_ent)) = NULL; -#ifdef GLOBAL_TRIE - free_subgoal_trie_branch(sg_node, TabEnt_arity(tab_ent), TRAVERSE_POSITION_FIRST); -#else - free_subgoal_trie_branch(sg_node, TabEnt_arity(tab_ent), 0, TRAVERSE_POSITION_FIRST); -#endif /* GLOBAL_TRIE */ - } - tab_ent = TabEnt_next(tab_ent); - } - return (TRUE); -} - - -static -Int p_show_tabled_predicates(void) { - tab_ent_ptr tab_ent; - - tab_ent = GLOBAL_root_tab_ent; - fprintf(Yap_stdout, "Tabled predicates\n"); - if (tab_ent == NULL) - fprintf(Yap_stdout, " NONE\n"); - else - while(tab_ent) { - fprintf(Yap_stdout, " %s/%d\n", AtomName(TabEnt_atom(tab_ent)), TabEnt_arity(tab_ent)); - tab_ent = TabEnt_next(tab_ent); - } - return (TRUE); -} - - -static -Int p_show_table(void) { - Term mod, t; - tab_ent_ptr tab_ent; - - mod = Deref(ARG1); - t = Deref(ARG2); - if (IsAtomTerm(t)) - tab_ent = RepPredProp(PredPropByAtom(AtomOfTerm(t), mod))->TableOfPred; - else if (IsApplTerm(t)) - tab_ent = RepPredProp(PredPropByFunc(FunctorOfTerm(t), mod))->TableOfPred; - else - return (FALSE); - show_table(tab_ent, SHOW_MODE_STRUCTURE); - return (TRUE); -} - - -static -Int p_show_all_tables(void) { - tab_ent_ptr tab_ent; - - tab_ent = GLOBAL_root_tab_ent; - while(tab_ent) { - show_table(tab_ent, SHOW_MODE_STRUCTURE); - tab_ent = TabEnt_next(tab_ent); - } - return (TRUE); -} - - -#ifdef GLOBAL_TRIE -static -Int p_show_global_trie(void) { - show_global_trie(SHOW_MODE_STRUCTURE); - return (TRUE); -} - -static -Int p_global_trie_statistics(void) { - show_global_trie(SHOW_MODE_STATISTICS); - return (TRUE); -} -#endif /* GLOBAL_TRIE */ - - -static -Int p_table_statistics(void) { - Term mod, t; - tab_ent_ptr tab_ent; - - mod = Deref(ARG1); - t = Deref(ARG2); - if (IsAtomTerm(t)) - tab_ent = RepPredProp(PredPropByAtom(AtomOfTerm(t), mod))->TableOfPred; - else if (IsApplTerm(t)) - tab_ent = RepPredProp(PredPropByFunc(FunctorOfTerm(t), mod))->TableOfPred; - else - return (FALSE); - show_table(tab_ent, SHOW_MODE_STATISTICS); - return (TRUE); -} - - -static -Int p_tabling_statistics(void) { +static inline long show_statistics_table_entries(void) { #ifdef SHM_MEMORY_ALLOC_SCHEME - long pages_in_use = 0, bytes_in_use = 0; - - shm_table_entries(&pages_in_use, &bytes_in_use); - shm_subgoal_frames(&pages_in_use, &bytes_in_use); - shm_subgoal_trie_nodes(&pages_in_use, &bytes_in_use); - shm_answer_trie_nodes(&pages_in_use, &bytes_in_use); -#ifdef GLOBAL_TRIE - shm_global_trie_nodes(&pages_in_use, &bytes_in_use); -#endif /* GLOBAL_TRIE */ - shm_subgoal_trie_hashes(&pages_in_use, &bytes_in_use); - shm_answer_trie_hashes(&pages_in_use, &bytes_in_use); -#ifdef GLOBAL_TRIE - shm_global_trie_hashes(&pages_in_use, &bytes_in_use); -#endif /* GLOBAL_TRIE */ - shm_dependency_frames(&pages_in_use, &bytes_in_use); - shm_pages(pages_in_use, bytes_in_use); -#else - long bytes_in_use = 0; - - fprintf(Yap_stdout, " Table entries: %10ld structs in use\n", Pg_str_in_use(GLOBAL_PAGES_tab_ent)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_tab_ent) * sizeof(struct table_entry); - fprintf(Yap_stdout, " Subgoal frames: %10ld structs in use\n", Pg_str_in_use(GLOBAL_PAGES_sg_fr)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_sg_fr) * sizeof(struct subgoal_frame); - fprintf(Yap_stdout, " Subgoal trie nodes: %10ld structs in use\n", Pg_str_in_use(GLOBAL_PAGES_sg_node)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_sg_node) * sizeof(struct subgoal_trie_node); - fprintf(Yap_stdout, " Answer trie nodes: %10ld structs in use\n", Pg_str_in_use(GLOBAL_PAGES_ans_node)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_ans_node) * sizeof(struct answer_trie_node); -#ifdef GLOBAL_TRIE - fprintf(Yap_stderr, " Global trie nodes: %10ld structs in use\n", Pg_str_in_use(GLOBAL_PAGES_gt_node)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_gt_node) * sizeof(struct global_trie_node); -#endif /* GLOBAL_TRIE */ - fprintf(Yap_stdout, " Subgoal trie hashes: %10ld structs in use\n", Pg_str_in_use(GLOBAL_PAGES_sg_hash)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_sg_hash) * sizeof(struct subgoal_trie_hash); - fprintf(Yap_stdout, " Answer trie hashes: %10ld structs in use\n", Pg_str_in_use(GLOBAL_PAGES_ans_hash)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_ans_hash) * sizeof(struct answer_trie_hash); -#ifdef GLOBAL_TRIE - fprintf(Yap_stderr, " Global trie hashes: %10ld structs in use\n", Pg_str_in_use(GLOBAL_PAGES_gt_hash)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_gt_hash) * sizeof(struct global_trie_hash); -#endif /* GLOBAL_TRIE */ - fprintf(Yap_stdout, "%s Dependency frames: %10ld structs in use\n", - Pg_str_in_use(GLOBAL_PAGES_dep_fr) == 1 ? " ": "*", Pg_str_in_use(GLOBAL_PAGES_dep_fr)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_dep_fr) * sizeof(struct dependency_frame); - fprintf(Yap_stdout, " Total memory in use: %10ld bytes\n", bytes_in_use); -#endif /* MEMORY_ALLOC_SCHEME */ - return (TRUE); -} -#endif /* TABLING */ - - -#if defined(YAPOR) && defined(TABLING) -static -Int p_opt_statistics(void) { -#ifdef SHM_MEMORY_ALLOC_SCHEME - long pages_in_use = 0, bytes_in_use = 0; - - shm_or_frames(&pages_in_use, &bytes_in_use); - shm_query_goal_solution_frames(&pages_in_use, &bytes_in_use); - shm_query_goal_answer_frames(&pages_in_use, &bytes_in_use); -#ifdef TABLING_INNER_CUTS - shm_table_subgoal_solution_frames(&pages_in_use, &bytes_in_use); - shm_table_subgoal_answer_frames(&pages_in_use, &bytes_in_use); -#endif /* TABLING_INNER_CUTS */ - shm_table_entries(&pages_in_use, &bytes_in_use); - shm_subgoal_frames(&pages_in_use, &bytes_in_use); - shm_subgoal_trie_nodes(&pages_in_use, &bytes_in_use); - shm_answer_trie_nodes(&pages_in_use, &bytes_in_use); -#ifdef GLOBAL_TRIE - shm_global_trie_nodes(&pages_in_use, &bytes_in_use); -#endif /* GLOBAL_TRIE */ - shm_subgoal_trie_hashes(&pages_in_use, &bytes_in_use); - shm_answer_trie_hashes(&pages_in_use, &bytes_in_use); -#ifdef GLOBAL_TRIE - shm_global_trie_hashes(&pages_in_use, &bytes_in_use); -#endif /* GLOBAL_TRIE */ - shm_dependency_frames(&pages_in_use, &bytes_in_use); - shm_show_suspension_frames(&pages_in_use, &bytes_in_use); - shm_pages(pages_in_use, bytes_in_use); -#else - long bytes_in_use = 0; - - fprintf(Yap_stdout, "%s Or-frames: %10ld structs in use\n", - Pg_str_in_use(GLOBAL_PAGES_or_fr) == 1 ? " ": "*", Pg_str_in_use(GLOBAL_PAGES_or_fr)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_or_fr) * sizeof(struct or_frame); - fprintf(Yap_stdout, "%s Query goal solution frames: %10ld structs in use\n", - Pg_str_in_use(GLOBAL_PAGES_qg_sol_fr) == 1 ? " ": "*", Pg_str_in_use(GLOBAL_PAGES_qg_sol_fr)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_qg_sol_fr) * sizeof(struct query_goal_solution_frame); - fprintf(Yap_stdout, "%s Query goal answer frames: %10ld structs in use\n", - Pg_str_in_use(GLOBAL_PAGES_qg_ans_fr) == 1 ? " ": "*", Pg_str_in_use(GLOBAL_PAGES_qg_ans_fr)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_qg_ans_fr) * sizeof(struct query_goal_answer_frame); -#ifdef TABLING_INNER_CUTS - fprintf(Yap_stdout, "%s Table subgoal solution frames: %10ld structs in use\n", - Pg_str_in_use(GLOBAL_PAGES_tg_sol_fr) == 0 ? " ": "*", Pg_str_in_use(GLOBAL_PAGES_tg_sol_fr)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_tg_sol_fr) * sizeof(struct table_subgoal_solution_frame); - fprintf(Yap_stdout, "%s Table subgoal answer frames: %10ld structs in use\n", - Pg_str_in_use(GLOBAL_PAGES_tg_ans_fr) == 0 ? " ": "*", Pg_str_in_use(GLOBAL_PAGES_tg_ans_fr)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_tg_ans_fr) * sizeof(struct table_subgoal_answer_frame); -#endif /* TABLING_INNER_CUTS */ - fprintf(Yap_stdout, " Table entries: %10ld structs in use\n", Pg_str_in_use(GLOBAL_PAGES_tab_ent)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_tab_ent) * sizeof(struct table_entry); - fprintf(Yap_stdout, " Subgoal frames: %10ld structs in use\n", Pg_str_in_use(GLOBAL_PAGES_sg_fr)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_sg_fr) * sizeof(struct subgoal_frame); - fprintf(Yap_stdout, " Subgoal trie nodes: %10ld structs in use\n", Pg_str_in_use(GLOBAL_PAGES_sg_node)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_sg_node) * sizeof(struct subgoal_trie_node); - fprintf(Yap_stdout, " Answer trie nodes: %10ld structs in use\n", Pg_str_in_use(GLOBAL_PAGES_ans_node)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_ans_node) * sizeof(struct answer_trie_node); -#ifdef GLOBAL_TRIE - fprintf(Yap_stderr, " Global trie nodes: %10ld structs in use\n", Pg_str_in_use(GLOBAL_PAGES_gt_node)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_gt_node) * sizeof(struct global_trie_node); -#endif /* GLOBAL_TRIE */ - fprintf(Yap_stdout, " Subgoal trie hashes: %10ld structs in use\n", Pg_str_in_use(GLOBAL_PAGES_sg_hash)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_sg_hash) * sizeof(struct subgoal_trie_hash); - fprintf(Yap_stdout, " Answer trie hashes: %10ld structs in use\n", Pg_str_in_use(GLOBAL_PAGES_ans_hash)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_ans_hash) * sizeof(struct answer_trie_hash); -#ifdef GLOBAL_TRIE - fprintf(Yap_stderr, " Global trie hashes: %10ld structs in use\n", Pg_str_in_use(GLOBAL_PAGES_gt_hash)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_gt_hash) * sizeof(struct global_trie_hash); -#endif /* GLOBAL_TRIE */ - fprintf(Yap_stdout, "%s Dependency frames: %10ld structs in use\n", - Pg_str_in_use(GLOBAL_PAGES_dep_fr) == 1 ? " ": "*", Pg_str_in_use(GLOBAL_PAGES_dep_fr)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_dep_fr) * sizeof(struct dependency_frame); - fprintf(Yap_stdout, "%s Suspension frames: %10ld structs in use\n", - Pg_str_in_use(GLOBAL_PAGES_susp_fr) == 0 ? " ": "*", Pg_str_in_use(GLOBAL_PAGES_susp_fr)); - bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_susp_fr) * sizeof(struct suspension_frame); - fprintf(Yap_stdout, " Total memory in use: %10ld bytes\n", bytes_in_use); -#endif /* MEMORY_ALLOC_SCHEME */ - return (TRUE); -} -#endif /* YAPOR && TABLING */ - - -#if defined(DEBUG_YAPOR) || defined(DEBUG_TABLING) -static -int p_debug_prolog(void) { - Term t; - t = Deref(ARG1); - if (IsAtomTerm(t)) { - char *s; - s = RepAtom(AtomOfTerm(t))->StrOfAE; -#ifdef DEBUG_YAPOR - fprintf(Yap_stderr, "W%d: %s\n", worker_id, s); -#else /* DEBUG_TABLING */ - fprintf(Yap_stderr, "%s\n", s); -#endif - return(TRUE); - } else { - return (FALSE); - } -} -#endif /* DEBUG_YAPOR || DEBUG_TABLING */ - - - -/* ----------------------------- ** -** Auxiliary functions ** -** ----------------------------- */ - -#ifdef SHM_MEMORY_ALLOC_SCHEME -static -void shm_pages(long pages_in_use, long bytes_in_use) { - long cont = 0; - pg_hd_ptr pg_hd; - - pg_hd = Pg_free_pg(GLOBAL_PAGES_void); - while (pg_hd) { - cont++; - pg_hd = PgHd_next(pg_hd); - } - fprintf(Yap_stdout, "%s Total memory in use: %8ld pages %10ld bytes\n", - Pg_str_in_use(GLOBAL_PAGES_void) == pages_in_use && - Pg_pg_alloc(GLOBAL_PAGES_void) - pages_in_use == cont ? " ": "*", - Pg_str_in_use(GLOBAL_PAGES_void), bytes_in_use); - fprintf(Yap_stdout, " Total memory allocated: %8ld pages %10ld bytes\n", - Pg_pg_alloc(GLOBAL_PAGES_void), Pg_pg_alloc(GLOBAL_PAGES_void) * Yap_page_size); - return; -} - - -#ifdef YAPOR -static -void shm_or_frames(long *pages_in_use, long *bytes_in_use) { - long cont = 0; - pg_hd_ptr pg_hd; - or_fr_ptr aux_ptr; - - pg_hd = Pg_free_pg(GLOBAL_PAGES_or_fr); - while (pg_hd) { - aux_ptr = PgHd_free_str(pg_hd); - while (aux_ptr) { - cont++; - aux_ptr = OrFr_next(aux_ptr); - } - pg_hd = PgHd_next(pg_hd); - } - fprintf(Yap_stdout, "%s Or-frames: %8ld pages %10ld structs in use\n", - Pg_str_free(GLOBAL_PAGES_or_fr) == cont && - Pg_str_in_use(GLOBAL_PAGES_or_fr) == 1 ? " ": "*", - Pg_pg_alloc(GLOBAL_PAGES_or_fr), Pg_str_in_use(GLOBAL_PAGES_or_fr)); - *pages_in_use += Pg_pg_alloc(GLOBAL_PAGES_or_fr); - *bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_or_fr) * sizeof(struct or_frame); - return; -} - - -static -void shm_query_goal_solution_frames(long *pages_in_use, long *bytes_in_use) { - long cont = 0; - pg_hd_ptr pg_hd; - qg_sol_fr_ptr aux_ptr; - - pg_hd = Pg_free_pg(GLOBAL_PAGES_qg_sol_fr); - while (pg_hd) { - aux_ptr = PgHd_free_str(pg_hd); - while (aux_ptr) { - cont++; - aux_ptr = SolFr_next(aux_ptr); - } - pg_hd = PgHd_next(pg_hd); - } - fprintf(Yap_stdout, "%s Query goal solution frames: %8ld pages %10ld structs in use\n", - Pg_str_free(GLOBAL_PAGES_qg_sol_fr) == cont && - Pg_str_in_use(GLOBAL_PAGES_qg_sol_fr) == 0 ? " ": "*", - Pg_pg_alloc(GLOBAL_PAGES_qg_sol_fr), Pg_str_in_use(GLOBAL_PAGES_qg_sol_fr)); - *pages_in_use += Pg_pg_alloc(GLOBAL_PAGES_qg_sol_fr); - *bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_qg_sol_fr) * sizeof(struct query_goal_solution_frame); - return; -} - - -static -void shm_query_goal_answer_frames(long *pages_in_use, long *bytes_in_use) { - long cont = 0; - pg_hd_ptr pg_hd; - qg_ans_fr_ptr aux_ptr; - - pg_hd = Pg_free_pg(GLOBAL_PAGES_qg_ans_fr); - while (pg_hd) { - aux_ptr = PgHd_free_str(pg_hd); - while (aux_ptr) { - cont++; - aux_ptr = AnsFr_next(aux_ptr); - } - pg_hd = PgHd_next(pg_hd); - } - fprintf(Yap_stdout, "%s Query goal answer frames: %8ld pages %10ld structs in use\n", - Pg_str_free(GLOBAL_PAGES_qg_ans_fr) == cont && - Pg_str_in_use(GLOBAL_PAGES_qg_ans_fr) == 0 ? " ": "*", - Pg_pg_alloc(GLOBAL_PAGES_qg_ans_fr), Pg_str_in_use(GLOBAL_PAGES_qg_ans_fr)); - *pages_in_use += Pg_pg_alloc(GLOBAL_PAGES_qg_ans_fr); - *bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_qg_ans_fr) * sizeof(struct query_goal_answer_frame); - return; -} -#endif /* YAPOR */ - - -#ifdef TABLING_INNER_CUTS -static -void shm_table_subgoal_solution_frames(long *pages_in_use, long *bytes_in_use) { - long cont = 0; - pg_hd_ptr pg_hd; - tg_sol_fr_ptr aux_ptr; - - pg_hd = Pg_free_pg(GLOBAL_PAGES_tg_sol_fr); - while (pg_hd) { - aux_ptr = PgHd_free_str(pg_hd); - while (aux_ptr) { - cont++; - aux_ptr = SolFr_next(aux_ptr); - } - pg_hd = PgHd_next(pg_hd); - } - fprintf(Yap_stdout, "%s Table subgoal solution frames: %8ld pages %10ld structs in use\n", - Pg_str_free(GLOBAL_PAGES_tg_sol_fr) == cont && - Pg_str_in_use(GLOBAL_PAGES_tg_sol_fr) == 0 ? " ": "*", - Pg_pg_alloc(GLOBAL_PAGES_tg_sol_fr), Pg_str_in_use(GLOBAL_PAGES_tg_sol_fr)); - *pages_in_use += Pg_pg_alloc(GLOBAL_PAGES_tg_sol_fr); - *bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_tg_sol_fr) * sizeof(struct table_subgoal_solution_frame); - return; -} - - -static -void shm_table_subgoal_answer_frames(long *pages_in_use, long *bytes_in_use) { - long cont = 0; - pg_hd_ptr pg_hd; - tg_ans_fr_ptr aux_ptr; - - pg_hd = Pg_free_pg(GLOBAL_PAGES_tg_ans_fr); - while (pg_hd) { - aux_ptr = PgHd_free_str(pg_hd); - while (aux_ptr) { - cont++; - aux_ptr = AnsFr_next(aux_ptr); - } - pg_hd = PgHd_next(pg_hd); - } - fprintf(Yap_stdout, "%s Table subgoal answer frames: %8ld pages %10ld structs in use\n", - Pg_str_free(GLOBAL_PAGES_tg_ans_fr) == cont && - Pg_str_in_use(GLOBAL_PAGES_tg_ans_fr) == 0 ? " ": "*", - Pg_pg_alloc(GLOBAL_PAGES_tg_ans_fr), Pg_str_in_use(GLOBAL_PAGES_tg_ans_fr)); - *pages_in_use += Pg_pg_alloc(GLOBAL_PAGES_tg_ans_fr); - *bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_tg_ans_fr) * sizeof(struct table_subgoal_answer_frame); - return; -} -#endif /* TABLING_INNER_CUTS */ - - -#ifdef TABLING -static -void shm_table_entries(long *pages_in_use, long *bytes_in_use) { - long cont = 0; +#ifdef DEBUG_TABLING pg_hd_ptr pg_hd; tab_ent_ptr aux_ptr; + long cont = 0; - aux_ptr = GLOBAL_root_tab_ent; - while(aux_ptr) { - cont++; - aux_ptr = TabEnt_next(aux_ptr); - } pg_hd = Pg_free_pg(GLOBAL_PAGES_tab_ent); while (pg_hd) { aux_ptr = PgHd_free_str(pg_hd); @@ -1173,28 +1043,25 @@ void shm_table_entries(long *pages_in_use, long *bytes_in_use) { } pg_hd = PgHd_next(pg_hd); } - fprintf(Yap_stdout, "%s Table entries: %8ld pages %10ld structs in use\n", - Pg_str_free(GLOBAL_PAGES_tab_ent) + Pg_str_in_use(GLOBAL_PAGES_tab_ent) == cont ? " ": "*", - Pg_pg_alloc(GLOBAL_PAGES_tab_ent), Pg_str_in_use(GLOBAL_PAGES_tab_ent)); - *pages_in_use += Pg_pg_alloc(GLOBAL_PAGES_tab_ent); - *bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_tab_ent) * sizeof(struct table_entry); - return; + TABLING_ERROR_CHECKING(statistics_table_entries, Pg_str_free(GLOBAL_PAGES_tab_ent) != cont); +#endif /* DEBUG_TABLING */ + fprintf(Yap_stdout, " Table entries: %10ld bytes (%ld pages and %ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_tab_ent) * sizeof(struct table_entry), Pg_pg_alloc(GLOBAL_PAGES_tab_ent), Pg_str_in_use(GLOBAL_PAGES_tab_ent)); +#else + fprintf(Yap_stdout, " Table entries: %10ld bytes (%ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_tab_ent) * sizeof(struct table_entry), Pg_str_in_use(GLOBAL_PAGES_tab_ent)); +#endif /* SHM_MEMORY_ALLOC_SCHEME */ + return Pg_str_in_use(GLOBAL_PAGES_tab_ent) * sizeof(struct table_entry); } -static -void shm_subgoal_frames(long *pages_in_use, long *bytes_in_use) { - long cont = 0; +static inline long show_statistics_subgoal_frames(void) { +#ifdef SHM_MEMORY_ALLOC_SCHEME +#ifdef DEBUG_TABLING pg_hd_ptr pg_hd; sg_fr_ptr aux_ptr; + long cont = 0; -#ifdef LIMIT_TABLING - aux_ptr = GLOBAL_first_sg_fr; - while(aux_ptr) { - cont++; - aux_ptr = SgFr_next(aux_ptr); - } -#endif /* LIMIT_TABLING */ pg_hd = Pg_free_pg(GLOBAL_PAGES_sg_fr); while (pg_hd) { aux_ptr = PgHd_free_str(pg_hd); @@ -1204,119 +1071,24 @@ void shm_subgoal_frames(long *pages_in_use, long *bytes_in_use) { } pg_hd = PgHd_next(pg_hd); } - fprintf(Yap_stdout, "%s Subgoal frames: %8ld pages %10ld structs in use\n", -#ifdef LIMIT_TABLING - Pg_str_in_use(GLOBAL_PAGES_sg_fr) + -#endif /* LIMIT_TABLING */ - Pg_str_free(GLOBAL_PAGES_sg_fr) == cont ? " ": "*", - Pg_pg_alloc(GLOBAL_PAGES_sg_fr), Pg_str_in_use(GLOBAL_PAGES_sg_fr)); - *pages_in_use += Pg_pg_alloc(GLOBAL_PAGES_sg_fr); - *bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_sg_fr) * sizeof(struct subgoal_frame); - return; + TABLING_ERROR_CHECKING(statistics_subgoal_frames, Pg_str_free(GLOBAL_PAGES_sg_fr) != cont); +#endif /* DEBUG_TABLING */ + fprintf(Yap_stdout, " Subgoal frames: %10ld bytes (%ld pages and %ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_sg_fr) * sizeof(struct subgoal_frame), Pg_pg_alloc(GLOBAL_PAGES_sg_fr), Pg_str_in_use(GLOBAL_PAGES_sg_fr)); +#else + fprintf(Yap_stdout, " Subgoal frames: %10ld bytes (%ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_sg_fr) * sizeof(struct subgoal_frame), Pg_str_in_use(GLOBAL_PAGES_sg_fr)); +#endif /* SHM_MEMORY_ALLOC_SCHEME */ + return Pg_str_in_use(GLOBAL_PAGES_sg_fr) * sizeof(struct subgoal_frame); } -static -void shm_subgoal_trie_nodes(long *pages_in_use, long *bytes_in_use) { - long cont = 0; - pg_hd_ptr pg_hd; - sg_node_ptr aux_ptr; - - pg_hd = Pg_free_pg(GLOBAL_PAGES_sg_node); - while (pg_hd) { - aux_ptr = PgHd_free_str(pg_hd); - while (aux_ptr) { - cont++; - aux_ptr = TrNode_next(aux_ptr); - } - pg_hd = PgHd_next(pg_hd); - } - fprintf(Yap_stdout, "%s Subgoal trie nodes: %8ld pages %10ld structs in use\n", - Pg_str_free(GLOBAL_PAGES_sg_node) == cont ? " ": "*", - Pg_pg_alloc(GLOBAL_PAGES_sg_node), Pg_str_in_use(GLOBAL_PAGES_sg_node)); - *pages_in_use += Pg_pg_alloc(GLOBAL_PAGES_sg_node); - *bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_sg_node) * sizeof(struct subgoal_trie_node); - return; -} - - -static -void shm_answer_trie_nodes(long *pages_in_use, long *bytes_in_use) { - long cont = 0; - pg_hd_ptr pg_hd; - ans_node_ptr aux_ptr; - - pg_hd = Pg_free_pg(GLOBAL_PAGES_ans_node); - while (pg_hd) { - aux_ptr = PgHd_free_str(pg_hd); - while (aux_ptr) { - cont++; - aux_ptr = TrNode_next(aux_ptr); - } - pg_hd = PgHd_next(pg_hd); - } - fprintf(Yap_stdout, "%s Answer trie nodes: %8ld pages %10ld structs in use\n", - Pg_str_free(GLOBAL_PAGES_ans_node) == cont ? " ": "*", - Pg_pg_alloc(GLOBAL_PAGES_ans_node), Pg_str_in_use(GLOBAL_PAGES_ans_node)); - *pages_in_use += Pg_pg_alloc(GLOBAL_PAGES_ans_node); - *bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_ans_node) * sizeof(struct answer_trie_node); - return; -} - - -static -void shm_subgoal_trie_hashes(long *pages_in_use, long *bytes_in_use) { - long cont = 0; - pg_hd_ptr pg_hd; - sg_hash_ptr aux_ptr; - - pg_hd = Pg_free_pg(GLOBAL_PAGES_sg_hash); - while (pg_hd) { - aux_ptr = PgHd_free_str(pg_hd); - while (aux_ptr) { - cont++; - aux_ptr = Hash_next(aux_ptr); - } - pg_hd = PgHd_next(pg_hd); - } - fprintf(Yap_stdout, "%s Subgoal trie hashes: %8ld pages %10ld structs in use\n", - Pg_str_free(GLOBAL_PAGES_sg_hash) == cont ? " ": "*", - Pg_pg_alloc(GLOBAL_PAGES_sg_hash), Pg_str_in_use(GLOBAL_PAGES_sg_hash)); - *pages_in_use += Pg_pg_alloc(GLOBAL_PAGES_sg_hash); - *bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_sg_hash) * sizeof(struct subgoal_trie_hash); - return; -} - - -static -void shm_answer_trie_hashes(long *pages_in_use, long *bytes_in_use) { - long cont = 0; - pg_hd_ptr pg_hd; - ans_hash_ptr aux_ptr; - - pg_hd = Pg_free_pg(GLOBAL_PAGES_ans_hash); - while (pg_hd) { - aux_ptr = PgHd_free_str(pg_hd); - while (aux_ptr) { - cont++; - aux_ptr = Hash_next(aux_ptr); - } - pg_hd = PgHd_next(pg_hd); - } - fprintf(Yap_stdout, "%s Answer trie hashes: %8ld pages %10ld structs in use\n", - Pg_str_free(GLOBAL_PAGES_ans_hash) == cont ? " ": "*", - Pg_pg_alloc(GLOBAL_PAGES_ans_hash), Pg_str_in_use(GLOBAL_PAGES_ans_hash)); - *pages_in_use += Pg_pg_alloc(GLOBAL_PAGES_ans_hash); - *bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_ans_hash) * sizeof(struct answer_trie_hash); - return; -} - - -static -void shm_dependency_frames(long *pages_in_use, long *bytes_in_use) { - long cont = 0; +static inline long show_statistics_dependency_frames(void) { +#ifdef SHM_MEMORY_ALLOC_SCHEME +#ifdef DEBUG_TABLING pg_hd_ptr pg_hd; dep_fr_ptr aux_ptr; + long cont = 0; pg_hd = Pg_free_pg(GLOBAL_PAGES_dep_fr); while (pg_hd) { @@ -1327,22 +1099,137 @@ void shm_dependency_frames(long *pages_in_use, long *bytes_in_use) { } pg_hd = PgHd_next(pg_hd); } - fprintf(Yap_stdout, "%s Dependency frames: %8ld pages %10ld structs in use\n", - Pg_str_free(GLOBAL_PAGES_dep_fr) == cont && - Pg_str_in_use(GLOBAL_PAGES_dep_fr) == 1 ? " ": "*", - Pg_pg_alloc(GLOBAL_PAGES_dep_fr), Pg_str_in_use(GLOBAL_PAGES_dep_fr)); - *pages_in_use += Pg_pg_alloc(GLOBAL_PAGES_dep_fr); - *bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_dep_fr) * sizeof(struct dependency_frame); - return; + TABLING_ERROR_CHECKING(statistics_dependency_frames, Pg_str_free(GLOBAL_PAGES_dep_fr) != cont); +#endif /* DEBUG_TABLING */ + fprintf(Yap_stdout, " Dependency frames: %10ld bytes (%ld pages and %ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_dep_fr) * sizeof(struct dependency_frame), Pg_pg_alloc(GLOBAL_PAGES_dep_fr), Pg_str_in_use(GLOBAL_PAGES_dep_fr)); +#else + fprintf(Yap_stdout, " Dependency frames: %10ld bytes (%ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_dep_fr) * sizeof(struct dependency_frame), Pg_str_in_use(GLOBAL_PAGES_dep_fr)); +#endif /* SHM_MEMORY_ALLOC_SCHEME */ + return Pg_str_in_use(GLOBAL_PAGES_dep_fr) * sizeof(struct dependency_frame); +} + + +static inline long show_statistics_subgoal_trie_nodes(void) { +#ifdef SHM_MEMORY_ALLOC_SCHEME +#ifdef DEBUG_TABLING + pg_hd_ptr pg_hd; + sg_node_ptr aux_ptr; + long cont = 0; + + pg_hd = Pg_free_pg(GLOBAL_PAGES_sg_node); + while (pg_hd) { + aux_ptr = PgHd_free_str(pg_hd); + while (aux_ptr) { + cont++; + aux_ptr = TrNode_next(aux_ptr); + } + pg_hd = PgHd_next(pg_hd); + } + TABLING_ERROR_CHECKING(statistics_subgoal_trie_nodes, Pg_str_free(GLOBAL_PAGES_sg_node) != cont); +#endif /* DEBUG_TABLING */ + fprintf(Yap_stdout, " Subgoal trie nodes: %10ld bytes (%ld pages and %ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_sg_node) * sizeof(struct subgoal_trie_node), Pg_pg_alloc(GLOBAL_PAGES_sg_node), Pg_str_in_use(GLOBAL_PAGES_sg_node)); +#else + fprintf(Yap_stdout, " Subgoal trie nodes: %10ld bytes (%ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_sg_node) * sizeof(struct subgoal_trie_node), Pg_str_in_use(GLOBAL_PAGES_sg_node)); +#endif /* SHM_MEMORY_ALLOC_SCHEME */ + return Pg_str_in_use(GLOBAL_PAGES_sg_node) * sizeof(struct subgoal_trie_node); +} + + +static inline long show_statistics_answer_trie_nodes(void) { +#ifdef SHM_MEMORY_ALLOC_SCHEME +#ifdef DEBUG_TABLING + pg_hd_ptr pg_hd; + ans_node_ptr aux_ptr; + long cont = 0; + + pg_hd = Pg_free_pg(GLOBAL_PAGES_ans_node); + while (pg_hd) { + aux_ptr = PgHd_free_str(pg_hd); + while (aux_ptr) { + cont++; + aux_ptr = TrNode_next(aux_ptr); + } + pg_hd = PgHd_next(pg_hd); + } + TABLING_ERROR_CHECKING(statistics_answer_trie_nodes, Pg_str_free(GLOBAL_PAGES_ans_node) != cont); +#endif /* DEBUG_TABLING */ + fprintf(Yap_stdout, " Answer trie nodes: %10ld bytes (%ld pages and %ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_ans_node) * sizeof(struct answer_trie_node), Pg_pg_alloc(GLOBAL_PAGES_ans_node), Pg_str_in_use(GLOBAL_PAGES_ans_node)); +#else + fprintf(Yap_stdout, " Answer trie nodes: %10ld bytes (%ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_ans_node) * sizeof(struct answer_trie_node), Pg_str_in_use(GLOBAL_PAGES_ans_node)); +#endif /* SHM_MEMORY_ALLOC_SCHEME */ + return Pg_str_in_use(GLOBAL_PAGES_ans_node) * sizeof(struct answer_trie_node); +} + + +static inline long show_statistics_subgoal_trie_hashes(void) { +#ifdef SHM_MEMORY_ALLOC_SCHEME +#ifdef DEBUG_TABLING + pg_hd_ptr pg_hd; + sg_hash_ptr aux_ptr; + long cont = 0; + + pg_hd = Pg_free_pg(GLOBAL_PAGES_sg_hash); + while (pg_hd) { + aux_ptr = PgHd_free_str(pg_hd); + while (aux_ptr) { + cont++; + aux_ptr = Hash_next(aux_ptr); + } + pg_hd = PgHd_next(pg_hd); + } + TABLING_ERROR_CHECKING(statistics_subgoal_trie_hashes, Pg_str_free(GLOBAL_PAGES_sg_hash) != cont); +#endif /* DEBUG_TABLING */ + fprintf(Yap_stdout, " Subgoal trie hashes: %10ld bytes (%ld pages and %ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_sg_hash) * sizeof(struct subgoal_trie_hash), Pg_pg_alloc(GLOBAL_PAGES_sg_hash), Pg_str_in_use(GLOBAL_PAGES_sg_hash)); +#else + fprintf(Yap_stdout, " Subgoal trie hashes: %10ld bytes (%ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_sg_hash) * sizeof(struct subgoal_trie_hash), Pg_str_in_use(GLOBAL_PAGES_sg_hash)); +#endif /* SHM_MEMORY_ALLOC_SCHEME */ + return Pg_str_in_use(GLOBAL_PAGES_sg_hash) * sizeof(struct subgoal_trie_hash); +} + + +static inline long show_statistics_answer_trie_hashes(void) { +#ifdef SHM_MEMORY_ALLOC_SCHEME +#ifdef DEBUG_TABLING + pg_hd_ptr pg_hd; + ans_hash_ptr aux_ptr; + long cont = 0; + + pg_hd = Pg_free_pg(GLOBAL_PAGES_ans_hash); + while (pg_hd) { + aux_ptr = PgHd_free_str(pg_hd); + while (aux_ptr) { + cont++; + aux_ptr = Hash_next(aux_ptr); + } + pg_hd = PgHd_next(pg_hd); + } + TABLING_ERROR_CHECKING(statistics_answer_trie_hashes, Pg_str_free(GLOBAL_PAGES_ans_hash) != cont); +#endif /* DEBUG_TABLING */ + fprintf(Yap_stdout, " Answer trie hashes: %10ld bytes (%ld pages and %ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_ans_hash) * sizeof(struct answer_trie_hash), Pg_pg_alloc(GLOBAL_PAGES_ans_hash), Pg_str_in_use(GLOBAL_PAGES_ans_hash)); +#else + fprintf(Yap_stdout, " Answer trie hashes: %10ld bytes (%ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_ans_hash) * sizeof(struct answer_trie_hash), Pg_str_in_use(GLOBAL_PAGES_ans_hash)); +#endif /* SHM_MEMORY_ALLOC_SCHEME */ + return Pg_str_in_use(GLOBAL_PAGES_ans_hash) * sizeof(struct answer_trie_hash); } #ifdef GLOBAL_TRIE -static -void shm_global_trie_nodes(long *pages_in_use, long *bytes_in_use) { - long cont = 0; +static inline long show_statistics_global_trie_nodes(void) { +#ifdef SHM_MEMORY_ALLOC_SCHEME +#ifdef DEBUG_TABLING pg_hd_ptr pg_hd; gt_node_ptr aux_ptr; + long cont = 0; pg_hd = Pg_free_pg(GLOBAL_PAGES_gt_node); while (pg_hd) { @@ -1353,20 +1240,24 @@ void shm_global_trie_nodes(long *pages_in_use, long *bytes_in_use) { } pg_hd = PgHd_next(pg_hd); } - fprintf(Yap_stderr, "%s Global trie nodes: %8ld pages %10ld structs in use\n", - Pg_str_free(GLOBAL_PAGES_gt_node) == cont ? " ": "*", - Pg_pg_alloc(GLOBAL_PAGES_gt_node), Pg_str_in_use(GLOBAL_PAGES_gt_node)); - *pages_in_use += Pg_pg_alloc(GLOBAL_PAGES_gt_node); - *bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_gt_node) * sizeof(struct global_trie_node); - return; + TABLING_ERROR_CHECKING(statistics_global_trie_nodes, Pg_str_free(GLOBAL_PAGES_gt_node) != cont); +#endif /* DEBUG_TABLING */ + fprintf(Yap_stdout, " Global trie nodes: %10ld bytes (%ld pages and %ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_gt_node) * sizeof(struct global_trie_node), Pg_pg_alloc(GLOBAL_PAGES_gt_node), Pg_str_in_use(GLOBAL_PAGES_gt_node)); +#else + fprintf(Yap_stdout, " Global trie nodes: %10ld bytes (%ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_gt_node) * sizeof(struct global_trie_node), Pg_str_in_use(GLOBAL_PAGES_gt_node)); +#endif /* SHM_MEMORY_ALLOC_SCHEME */ + return Pg_str_in_use(GLOBAL_PAGES_gt_node) * sizeof(struct global_trie_node); } -static -void shm_global_trie_hashes(long *pages_in_use, long *bytes_in_use) { - long cont = 0; +static inline long show_statistics_global_trie_hashes(void) { +#ifdef SHM_MEMORY_ALLOC_SCHEME +#ifdef DEBUG_TABLING pg_hd_ptr pg_hd; gt_hash_ptr aux_ptr; + long cont = 0; pg_hd = Pg_free_pg(GLOBAL_PAGES_gt_hash); while (pg_hd) { @@ -1377,23 +1268,113 @@ void shm_global_trie_hashes(long *pages_in_use, long *bytes_in_use) { } pg_hd = PgHd_next(pg_hd); } - fprintf(Yap_stderr, "%s Global trie hashes: %8ld pages %10ld structs in use\n", - Pg_str_free(GLOBAL_PAGES_gt_hash) == cont ? " ": "*", - Pg_pg_alloc(GLOBAL_PAGES_gt_hash), Pg_str_in_use(GLOBAL_PAGES_gt_hash)); - *pages_in_use += Pg_pg_alloc(GLOBAL_PAGES_gt_hash); - *bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_gt_hash) * sizeof(struct global_trie_hash); - return; + TABLING_ERROR_CHECKING(statistics_global_trie_hashes, Pg_str_free(GLOBAL_PAGES_gt_hash) != cont); +#endif /* DEBUG_TABLING */ + fprintf(Yap_stdout, " Global trie hashes: %10ld bytes (%ld pages and %ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_gt_hash) * sizeof(struct global_trie_hash), Pg_pg_alloc(GLOBAL_PAGES_gt_hash), Pg_str_in_use(GLOBAL_PAGES_gt_hash)); +#else + fprintf(Yap_stdout, " Global trie hashes: %10ld bytes (%ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_gt_hash) * sizeof(struct global_trie_hash), Pg_str_in_use(GLOBAL_PAGES_gt_hash)); +#endif /* SHM_MEMORY_ALLOC_SCHEME */ + return Pg_str_in_use(GLOBAL_PAGES_gt_hash) * sizeof(struct global_trie_hash); } #endif /* GLOBAL_TRIE */ #endif /* TABLING */ -#if defined(YAPOR) && defined(TABLING) -static -void shm_suspension_frames(long *pages_in_use, long *bytes_in_use) { +#ifdef YAPOR +static inline long show_statistics_or_frames(void) { +#ifdef SHM_MEMORY_ALLOC_SCHEME +#ifdef DEBUG_YAPOR + pg_hd_ptr pg_hd; + or_fr_ptr aux_ptr; long cont = 0; + + pg_hd = Pg_free_pg(GLOBAL_PAGES_or_fr); + while (pg_hd) { + aux_ptr = PgHd_free_str(pg_hd); + while (aux_ptr) { + cont++; + aux_ptr = OrFr_next(aux_ptr); + } + pg_hd = PgHd_next(pg_hd); + } + YAPOR_ERROR_CHECKING(statistics_or_frames, Pg_str_free(GLOBAL_PAGES_or_fr) != cont); +#endif /* DEBUG_YAPOR */ + fprintf(Yap_stdout, " Or-frames: %10ld bytes (%ld pages and %ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_or_fr) * sizeof(struct or_frame), Pg_pg_alloc(GLOBAL_PAGES_or_fr), Pg_str_in_use(GLOBAL_PAGES_or_fr)); +#else + fprintf(Yap_stdout, " Or-frames: %10ld bytes (%ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_or_fr) * sizeof(struct or_frame), Pg_str_in_use(GLOBAL_PAGES_or_fr)); +#endif /* SHM_MEMORY_ALLOC_SCHEME */ + return Pg_str_in_use(GLOBAL_PAGES_or_fr) * sizeof(struct or_frame); +} + + +static inline long show_statistics_query_goal_solution_frames(void) { +#ifdef SHM_MEMORY_ALLOC_SCHEME +#ifdef DEBUG_YAPOR + pg_hd_ptr pg_hd; + qg_sol_fr_ptr aux_ptr; + long cont = 0; + + pg_hd = Pg_free_pg(GLOBAL_PAGES_qg_sol_fr); + while (pg_hd) { + aux_ptr = PgHd_free_str(pg_hd); + while (aux_ptr) { + cont++; + aux_ptr = SolFr_next(aux_ptr); + } + pg_hd = PgHd_next(pg_hd); + } + YAPOR_ERROR_CHECKING(statistics_query_goal_solution_frames, Pg_str_free(GLOBAL_PAGES_qg_sol_fr) != cont); +#endif /* DEBUG_YAPOR */ + fprintf(Yap_stdout, " Query goal solution frames: %10ld bytes (%ld pages and %ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_qg_sol_fr) * sizeof(struct query_goal_solution_frame), Pg_pg_alloc(GLOBAL_PAGES_qg_sol_fr), Pg_str_in_use(GLOBAL_PAGES_qg_sol_fr)); +#else + fprintf(Yap_stdout, " Query goal solution frames: %10ld bytes (%ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_qg_sol_fr) * sizeof(struct query_goal_solution_frame), Pg_str_in_use(GLOBAL_PAGES_qg_sol_fr)); +#endif /* SHM_MEMORY_ALLOC_SCHEME */ + return Pg_str_in_use(GLOBAL_PAGES_qg_sol_fr) * sizeof(struct query_goal_solution_frame); +} + + +static inline long show_statistics_query_goal_answer_frames(void) { +#ifdef SHM_MEMORY_ALLOC_SCHEME +#ifdef DEBUG_YAPOR + pg_hd_ptr pg_hd; + qg_ans_fr_ptr aux_ptr; + long cont = 0; + + pg_hd = Pg_free_pg(GLOBAL_PAGES_qg_ans_fr); + while (pg_hd) { + aux_ptr = PgHd_free_str(pg_hd); + while (aux_ptr) { + cont++; + aux_ptr = AnsFr_next(aux_ptr); + } + pg_hd = PgHd_next(pg_hd); + } + YAPOR_ERROR_CHECKING(statistics_query_goal_answer_frames, Pg_str_free(GLOBAL_PAGES_qg_ans_fr) != cont); +#endif /* DEBUG_YAPOR */ + fprintf(Yap_stdout, " Query goal answer frames: %10ld bytes (%ld pages and %ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_qg_ans_fr) * sizeof(struct query_goal_answer_frame), Pg_pg_alloc(GLOBAL_PAGES_qg_ans__fr), Pg_str_in_use(GLOBAL_PAGES_qg_ans_fr)); +#else + fprintf(Yap_stdout, " Query goal answer frames: %10ld bytes (%ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_qg_ans_fr) * sizeof(struct query_goal_answer_frame), Pg_str_in_use(GLOBAL_PAGES_qg_ans_fr)); +#endif /* SHM_MEMORY_ALLOC_SCHEME */ + return Pg_str_in_use(GLOBAL_PAGES_qg_ans_fr) * sizeof(struct query_goal_answer_frame); +} +#endif /* YAPOR */ + + +#if defined(YAPOR) && defined(TABLING) +static inline long show_statistics_suspension_frames(void) { +#ifdef SHM_MEMORY_ALLOC_SCHEME +#ifdef DEBUG_OPTYAP pg_hd_ptr pg_hd; susp_fr_ptr aux_ptr; + long cont = 0; pg_hd = Pg_free_pg(GLOBAL_PAGES_susp_fr); while (pg_hd) { @@ -1404,14 +1385,73 @@ void shm_suspension_frames(long *pages_in_use, long *bytes_in_use) { } pg_hd = PgHd_next(pg_hd); } - fprintf(Yap_stdout, "%s Suspension frames: %8ld pages %10ld structs in use\n", - Pg_str_free(GLOBAL_PAGES_susp_fr) == cont && - Pg_str_in_use(GLOBAL_PAGES_susp_fr) == 0 ? " ": "*", - Pg_pg_alloc(GLOBAL_PAGES_susp_fr), Pg_str_in_use(GLOBAL_PAGES_susp_fr)); - *pages_in_use += Pg_pg_alloc(GLOBAL_PAGES_susp_fr); - *bytes_in_use += Pg_str_in_use(GLOBAL_PAGES_susp_fr) * sizeof(struct suspension_frame); - return; -} -#endif /* YAPOR && TABLING */ + OPTYAP_ERROR_CHECKING(statistics_suspension_frames, Pg_str_free(GLOBAL_PAGES_susp_fr) != cont); +#endif /* DEBUG_OPTYAP */ + fprintf(Yap_stdout, " Suspension frames: %10ld bytes (%ld pages and %ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_susp_fr) * sizeof(struct suspension_frame), Pg_pg_alloc(GLOBAL_PAGES_susp_fr), Pg_str_in_use(GLOBAL_PAGES_susp_fr)); +#else + fprintf(Yap_stdout, " Suspension frames: %10ld bytes (%ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_susp_fr) * sizeof(struct suspension_frame), Pg_str_in_use(GLOBAL_PAGES_susp_fr)); #endif /* SHM_MEMORY_ALLOC_SCHEME */ + return Pg_str_in_use(GLOBAL_PAGES_susp_fr) * sizeof(struct suspension_frame); +} + + +#ifdef TABLING_INNER_CUTS +static inline long show_statistics_table_subgoal_solution_frames(void) { +#ifdef SHM_MEMORY_ALLOC_SCHEME +#ifdef DEBUG_OPTYAP + pg_hd_ptr pg_hd; + tg_sol_fr_ptr aux_ptr; + long cont = 0; + + pg_hd = Pg_free_pg(GLOBAL_PAGES_tg_sol_fr); + while (pg_hd) { + aux_ptr = PgHd_free_str(pg_hd); + while (aux_ptr) { + cont++; + aux_ptr = SolFr_next(aux_ptr); + } + pg_hd = PgHd_next(pg_hd); + } + OPTYAP_ERROR_CHECKING(statistics_table_subgoal_solution_frames, Pg_str_free(GLOBAL_PAGES_tg_sol_fr) != cont); +#endif /* DEBUG_OPTYAP */ + fprintf(Yap_stdout, " Table subgoal solution frames: %10ld bytes (%ld pages and %ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_tg_sol_fr) * sizeof(struct table_subgoal_solution_frame), Pg_pg_alloc(GLOBAL_PAGES_tg_sol_fr), Pg_str_in_use(GLOBAL_PAGES_tg_sol_fr)); +#else + fprintf(Yap_stdout, " Table subgoal solution frames: %10ld bytes (%ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_tg_sol_fr) * sizeof(struct table_subgoal_solution_frame), Pg_str_in_use(GLOBAL_PAGES_tg_sol_fr)); +#endif /* SHM_MEMORY_ALLOC_SCHEME */ + return Pg_str_in_use(GLOBAL_PAGES_tg_sol_fr) * sizeof(struct table_subgoal_solution_frame); +} + + +static inline long show_statistics_table_subgoal_answer_frames(void) { +#ifdef SHM_MEMORY_ALLOC_SCHEME +#ifdef DEBUG_OPTYAP + pg_hd_ptr pg_hd; + tg_ans_fr_ptr aux_ptr; + long cont = 0; + + pg_hd = Pg_free_pg(GLOBAL_PAGES_tg_ans_fr); + while (pg_hd) { + aux_ptr = PgHd_free_str(pg_hd); + while (aux_ptr) { + cont++; + aux_ptr = AnsFr_next(aux_ptr); + } + pg_hd = PgHd_next(pg_hd); + } + OPTYAP_ERROR_CHECKING(statistics_table_subgoal_answer_frames, Pg_str_free(GLOBAL_PAGES_tg_ans_fr) != cont); +#endif /* DEBUG_OPTYAP */ + fprintf(Yap_stdout, " Table subgoal answer frames: %10ld bytes (%ld pages and %ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_tg_ans_fr) * sizeof(struct table_subgoal_answer_frame), Pg_pg_alloc(GLOBAL_PAGES_tg_ans_fr), Pg_str_in_use(GLOBAL_PAGES_tg_ans_fr)); +#else + fprintf(Yap_stdout, " Table subgoal answer frames: %10ld bytes (%ld structs in use)\n", + Pg_str_in_use(GLOBAL_PAGES_tg_ans_fr) * sizeof(struct table_subgoal_answer_frame), Pg_str_in_use(GLOBAL_PAGES_tg_ans_fr)); +#endif /* SHM_MEMORY_ALLOC_SCHEME */ + return Pg_str_in_use(GLOBAL_PAGES_tg_ans_fr) * sizeof(struct table_subgoal_answer_frame); +} +#endif /* TABLING_INNER_CUTS */ +#endif /* YAPOR && TABLING */ #endif /* YAPOR || TABLING */ diff --git a/pl/boot.yap b/pl/boot.yap index f96b4f7a6..0e791c041 100755 --- a/pl/boot.yap +++ b/pl/boot.yap @@ -121,13 +121,13 @@ true :- true. nb_setval('$included_file',[]). '$init_or_threads' :- - '$yapor_threads'(W), !, + '$c_yapor_threads'(W), !, '$start_orp_threads'(W). '$init_or_threads'. '$start_orp_threads'(1) :- !. '$start_orp_threads'(W) :- - thread_create('$worker',_,[detached(true)]), + thread_create('$c_worker',_,[detached(true)]), W1 is W-1, '$start_orp_threads'(W1). @@ -500,9 +500,9 @@ true :- true. % *************************** '$query'(G,V) :- - \+ '$undefined'('$yapor_on', prolog), - '$yapor_on', - \+ '$undefined'('$start_yapor', prolog), + \+ '$undefined'('$c_yapor_on', prolog), + '$c_yapor_on', + \+ '$undefined'('$c_start_yapor', prolog), '$parallelizable'(G), !, '$parallel_query'(G,V), fail. diff --git a/pl/flags.yap b/pl/flags.yap index 3e8183120..d49b86d8a 100644 --- a/pl/flags.yap +++ b/pl/flags.yap @@ -542,7 +542,7 @@ yap_flag(system_options,X) :- '$system_options'(low_level_tracer) :- \+ '$undefined'(start_low_level_trace, prolog). '$system_options'(or_parallelism) :- - \+ '$undefined'('$yapor_on', prolog). + \+ '$undefined'('$c_yapor_on', prolog). '$system_options'(rational_trees) :- '$yap_has_rational_trees'. '$system_options'(readline) :- diff --git a/pl/tabling.yap b/pl/tabling.yap index 564d5cde0..20f694b2c 100644 --- a/pl/tabling.yap +++ b/pl/tabling.yap @@ -1,27 +1,30 @@ -/************************************************************************* -* * -* YAP Prolog * -* * -* Yap Prolog was developed at NCCUP - Universidade do Porto * -* * -* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 * -* * -************************************************************************** -* * -* File: tabling.yap * -* Last rev: 8/2/88 * -* mods: * -* comments: support tabling predicates * -* * -*************************************************************************/ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% %% +%% The YapTab/YapOr/OPTYap systems %% +%% %% +%% YapTab extends the Yap Prolog engine to support sequential tabling %% +%% YapOr extends the Yap Prolog engine to support or-parallelism %% +%% OPTYap extends the Yap Prolog engine to support or-parallel tabling %% +%% %% +%% %% +%% Yap Prolog was developed at University of Porto, Portugal %% +%% %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -:- meta_predicate table(:), is_tabled(:), tabling_mode(:), abolish_table(:), show_table(:), table_statistics(:). +:- meta_predicate + table(:), + is_tabled(:), + tabling_mode(:), + abolish_table(:), + show_table(:), + table_statistics(:), + table_statistics(:,:). -/****************** -* table/1 * -******************/ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% table/1 %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% table(Pred) :- '$current_module'(Mod), @@ -64,9 +67,9 @@ table(Pred) :- -/********************** -* is_tabled/1 * -**********************/ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% is_tabled/1 %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% is_tabled(Pred) :- '$current_module'(Mod), @@ -95,9 +98,9 @@ is_tabled(Pred) :- -/************************* -* tabling_mode/2 * -*************************/ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% tabling_mode/2 %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% tabling_mode(Pred,Options) :- '$current_module'(Mod), @@ -123,7 +126,6 @@ tabling_mode(Pred,Options) :- ( Flags /\ 0x000040 =\= 0, !, '$set_tabling_mode'(Mod,PredFunctor,Options) ; -write(icardioi),nl, '$do_error'(domain_error(table,Mod:PredName/PredArity),tabling_mode(Mod:PredName/PredArity,Options)) ). '$do_tabling_mode'(Mod,Pred,Options) :- @@ -146,7 +148,7 @@ write(icardioi),nl, functor(PredFunctor,PredName,PredArity), '$do_error'(domain_error(flag_value,tabling_mode+Options),tabling_mode(Mod:PredName/PredArity,Options)). -% should match with code in OPTYap/opt.preds.c +%% should match with code in OPTYap/opt.preds.c '$transl_to_pred_flag_tabling_mode'(1,batched). '$transl_to_pred_flag_tabling_mode'(2,local). '$transl_to_pred_flag_tabling_mode'(3,exec_answers). @@ -156,9 +158,9 @@ write(icardioi),nl, -/************************** -* abolish_table/1 * -**************************/ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% abolish_table/1 %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% abolish_table(Pred) :- '$current_module'(Mod), @@ -191,9 +193,9 @@ abolish_table(Pred) :- -/*********************** -* show_table/1 * -***********************/ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% show_table/1 %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% show_table(Pred) :- '$current_module'(Mod), @@ -226,9 +228,9 @@ show_table(Pred) :- -/***************************** -* table_statistics/1 * -*****************************/ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% table_statistics/1 %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% table_statistics(Pred) :- '$current_module'(Mod), @@ -258,3 +260,33 @@ table_statistics(Pred) :- ). '$do_table_statistics'(Mod,Pred) :- '$do_error'(type_error(callable,Mod:Pred),table_statistics(Mod:Pred)). + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% tabling_statistics/2 %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% should match with code in OPTYap/opt.preds.c +tabling_statistics(total_memory,[BytesInUse,BytesAllocated]) :- + '$c_get_optyap_statistics'(0,BytesInUse,BytesAllocated). +tabling_statistics(table_entries,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(1,BytesInUse,StructsInUse). +tabling_statistics(subgoal_frames,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(2,BytesInUse,StructsInUse). +tabling_statistics(dependency_frames,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(3,BytesInUse,StructsInUse). +tabling_statistics(subgoal_trie_nodes,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(6,BytesInUse,StructsInUse). +tabling_statistics(answer_trie_nodes,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(7,BytesInUse,StructsInUse). +tabling_statistics(subgoal_trie_hashes,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(8,BytesInUse,StructsInUse). +tabling_statistics(answer_trie_hashes,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(9,BytesInUse,StructsInUse). +tabling_statistics(global_trie_nodes,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(10,BytesInUse,StructsInUse). +tabling_statistics(global_trie_hashes,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(11,BytesInUse,StructsInUse). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/pl/yapor.yap b/pl/yapor.yap index b81f31b6a..1e7242f21 100644 --- a/pl/yapor.yap +++ b/pl/yapor.yap @@ -1,122 +1,222 @@ -/************************************************************************* -* * -* YAP Prolog * -* * -* Yap Prolog was developed at NCCUP - Universidade do Porto * -* * -* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 * -* * -************************************************************************** -* * -* File: yapor.yap * -* Last rev: 8/2/88 * -* mods: * -* comments: support or-parallelism * -* * -*************************************************************************/ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% %% +%% The YapTab/YapOr/OPTYap systems %% +%% %% +%% YapTab extends the Yap Prolog engine to support sequential tabling %% +%% YapOr extends the Yap Prolog engine to support or-parallelism %% +%% OPTYap extends the Yap Prolog engine to support or-parallel tabling %% +%% %% +%% %% +%% Yap Prolog was developed at University of Porto, Portugal %% +%% %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -'$parallel_query'(G,[]) :- !, '$start_yapor', '$execute'(G), !, -'$parallel_yes_answer'. -'$parallel_query'(G,V) :- '$start_yapor', '$execute'(G), '$parallel_new_answer'(V). +:- meta_predicate + or_statistics(:,:), + opt_statistics(:,:), + default_sequential(:). -% *************************** -% * -------- YAPOR -------- * -% *************************** + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% or_statistics/2 %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +or_statistics(total_memory,[BytesInUse,BytesAllocated]) :- + '$c_get_optyap_statistics'(0,BytesInUse,BytesAllocated). +or_statistics(or_frames,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(4,BytesInUse,StructsInUse). +or_statistics(query_goal_solution_frames,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(12,BytesInUse,StructsInUse). +or_statistics(query_goal_answer_frames,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(13,BytesInUse,StructsInUse). + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% opt_statistics/2 %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +opt_statistics(total_memory,[BytesInUse,BytesAllocated]) :- + '$c_get_optyap_statistics'(0,BytesInUse,BytesAllocated). +opt_statistics(table_entries,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(1,BytesInUse,StructsInUse). +opt_statistics(subgoal_frames,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(2,BytesInUse,StructsInUse). +opt_statistics(dependency_frames,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(3,BytesInUse,StructsInUse). +opt_statistics(or_frames,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(4,BytesInUse,StructsInUse). +opt_statistics(suspension_frames,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(5,BytesInUse,StructsInUse). +opt_statistics(subgoal_trie_nodes,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(6,BytesInUse,StructsInUse). +opt_statistics(answer_trie_nodes,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(7,BytesInUse,StructsInUse). +opt_statistics(subgoal_trie_hashes,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(8,BytesInUse,StructsInUse). +opt_statistics(answer_trie_hashes,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(9,BytesInUse,StructsInUse). +opt_statistics(global_trie_nodes,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(10,BytesInUse,StructsInUse). +opt_statistics(global_trie_hashes,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(11,BytesInUse,StructsInUse). +opt_statistics(query_goal_solution_frames,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(12,BytesInUse,StructsInUse). +opt_statistics(query_goal_answer_frames,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(13,BytesInUse,StructsInUse). +opt_statistics(table_subgoal_solution_frames,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(14,BytesInUse,StructsInUse). +opt_statistics(table_subgoal_answer_frames,[BytesInUse,StructsInUse]) :- + '$c_get_optyap_statistics'(15,BytesInUse,StructsInUse). + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% default_sequential/1 %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% default_sequential(X) :- - '$default_sequential'(X), !. + '$c_default_sequential'(X), !. default_sequential(_). + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% $parallel_query/2 %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +'$parallel_query'(G,[]) :- !, + '$c_start_yapor', + '$execute'(G), !, + '$c_parallel_yes_answer'. +'$parallel_query'(G,V) :- + '$c_start_yapor', + '$execute'(G), + '$c_parallel_new_answer'(V). + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% $sequential/0 %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + '$sequential' :- - '$default_sequential'(X), - '$initialization'('$default_sequential'(X)), - '$default_sequential'(on). + '$c_default_sequential'(X), + '$initialization'('$c_default_sequential'(X)), + '$c_default_sequential'(on). + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% $parallel/0 %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '$parallel' :- - '$default_sequential'(X), - '$initialization'('$default_sequential'(X)), - '$default_sequential'(off). - -'$sequential_directive'(X,_) :- var(X), !, - write(user_error, '[ Error: argument to sequential/1 should be a predicate ]'), - nl(user_error), - fail. -'$sequential_directive'((A,B),M) :- !, - '$sequential_directive'(A,M), '$sequential_directive'(B,M). -'$sequential_directive'(M:A,_) :- !, - '$sequential_directive'(A,M). -'$sequential_directive'(A/N,M) :- integer(N), atom(A), !, - functor(T,A,N), - '$flags'(T,M,F,F), - ( - X is F /\ 0x00000020, X =\= 0, !, - write(user_error, '[ Warning: '), - write(user_error, M:A/N), - write(user_error, ' is already declared as sequential ]'), - nl(user_error) - ; - X is F /\ 0x1991F880, X =:= 0, !, '$sequential'(T,M) - ; - write(user_error, '[ Error: '), - write(user_error, M:A/N), - write(user_error, ' cannot be declared as sequential ]'), - nl(user_error), - fail - ). -'$sequential_directive'(X,_) :- write(user_error, '[ Error: '), - write(user_error, X), - write(user_error, ' is an invalid argument to sequential/1 ]'), - nl(user_error), - fail. - -'$parallel_directive'(X,M) :- var(X), !, - '$do_error'(instantiation_error,parallel(M:X)). -'$parallel_directive'((A,B),M) :- !, - '$parallel_directive'(A,M), - 'parallel_directive'(B,M). -'$parallel_directive'(M:A,_) :- !, - '$parallel_directive'(A,M). -'$parallel_directive'(A/N,M) :- integer(N), atom(A), !, - functor(T,A,N), '$flags'(T,M,F,F), - ( - NF is F /\ 0x00000020, '$flags'(T,F,NF) ; - write(user_error, '[ Warning: '), - write(user_error, M:A/N), - write(user_error, ' is already declared as sequential ]'), - nl(user_error) - ; - X is F /\ 0x1991FC80, X =:= 0, !, '$sequential'(T) - ; - write(user_error, '[ Error: '), - write(user_error, M:A/N), - write(user_error, ' cannot be declared as parallel ]'), - nl(user_error), - fail - ). -'$parallel_directive'(X,_) :- write(user_error, '[ Error: '), - write(user_error, X), - write(user_error, ' is an invalid argument to parallel/1 ]'), - nl(user_error), - fail. + '$c_default_sequential'(X), + '$initialization'('$c_default_sequential'(X)), + '$c_default_sequential'(off). -% -% do not try to run consult in the parallel system. -% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% $sequential_directive/2 %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +'$sequential_directive'(Pred,Mod) :- + var(Pred), !, + '$do_error'(instantiation_error,sequential(Mod:Pred)). +'$sequential_directive'(Mod:Pred,_) :- !, + '$sequential_directive'(Pred,Mod). +'$sequential_directive'((Pred1,Pred2),Mod) :- !, + '$sequential_directive'(Pred1,Mod), + '$sequential_directive'(Pred2,Mod). +'$sequential_directive'(PredName/PredArity,Mod) :- + atom(PredName), integer(PredArity), + functor(PredFunctor,PredName,PredArity), !, + '$flags'(PredFunctor,Mod,Flags,Flags), + ( + Flags /\ 0x1991F880 =:= 0, !, + ( + Flags /\ 0x00000020 =\= 0, !, + write(user_error, '[ Warning: '), + write(user_error, Mod:PredName/PredArity), + write(user_error, ' is already declared as sequential ]'), + nl(user_error) + ; + NewFlags is Flags \/ 0x00000020, + '$flags'(PredFunctor,Mod,Flags,NewFlags) + ), + ; + write(user_error, '[ Error: '), + write(user_error, Mod:PredName/PredArity), + write(user_error, ' cannot be declared as sequential ]'), + nl(user_error), + fail + ). +'$sequential_directive'(Pred,Mod) :- + '$do_error'(type_error(callable,Mod:Pred),sequential(Mod:Pred)). + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% $parallel_directive/2 %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +'$parallel_directive'(Pred,Mod) :- + var(Pred), !, + '$do_error'(instantiation_error,parallel(Mod:Pred)). +'$parallel_directive'((Pred1,Pred2),Mod) :- !, + '$parallel_directive'(Pred1,Mod), + '$parallel_directive'(Pred2,Mod). +'$parallel_directive'(Mod:Pred,_) :- !, + '$parallel_directive'(Pred,Mod). +'$parallel_directive'(PredName/PredArity,Mod) :- + atom(PredName), integer(PredArity), + functor(PredFunctor,PredName,PredArity), !, + '$flags'(PredFunctor,Mod,Flags,Flags), + ( + Flags /\ 0x1991F880 =:= 0, !, + ( + Flags /\ 0x00000020 =:= 0, !, + write(user_error, '[ Warning: '), + write(user_error, Mod:PredName/PredArity), + write(user_error, ' is already declared as parallel ]'), + nl(user_error) + ; + NewFlags is Flags /\ 0xffffffdf, + '$flags'(PredFunctor,Mod,Flags,NewFlags) + ), + ; + write(user_error, '[ Error: '), + write(user_error, Mod:PredName/PredArity), + write(user_error, ' cannot be declared as parallel ]'), + nl(user_error), + fail + ). +'$parallel_directive'(Pred,Mod) :- + '$do_error'(type_error(callable,Mod:Pred),parallel(Mod:Pred)). + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% $parallelizable/1 %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + '$parallelizable'(_) :- - nb_getval('$consulting_file',S), S\=[], !, fail. + nb_getval('$consulting_file',S), S\=[], !, fail. '$parallelizable'((G1,G2)) :- !, - '$parallelizable'(G1), - '$parallelizable'(G2). + '$parallelizable'(G1), + '$parallelizable'(G2). '$parallelizable'((G1;G2)) :- !, - '$parallelizable'(G1), - '$parallelizable'(G2). + '$parallelizable'(G1), + '$parallelizable'(G2). '$parallelizable'((G1|G2)) :- !, - '$parallelizable'(G1), - '$parallelizable'(G2). + '$parallelizable'(G1), + '$parallelizable'(G2). '$parallelizable'((G1->G2)) :- !, - '$parallelizable'(G1), - '$parallelizable'(G2). + '$parallelizable'(G1), + '$parallelizable'(G2). '$parallelizable'([]) :- !, fail. '$parallelizable'([_|_]) :- !, fail. '$parallelizable'(consult(_)) :- !, fail. @@ -125,5 +225,4 @@ default_sequential(_). '$parallelizable'(use_module(_)) :- !, fail. '$parallelizable'(_). - - +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \ No newline at end of file