19#if defined(YAPOR) || defined(TABLING)
32#include "tab.macros.h"
37static Int p_freeze_choice_point(USES_REGS1);
38static Int p_wake_choice_point(USES_REGS1);
39static Int p_abolish_frozen_choice_points_until(USES_REGS1);
40static Int p_abolish_frozen_choice_points_all(USES_REGS1);
41static Int p_table(USES_REGS1);
42static Int p_tabling_mode(USES_REGS1);
43static Int p_abolish_table(USES_REGS1);
44static Int p_abolish_all_tables(USES_REGS1);
45static Int p_show_tabled_predicates(USES_REGS1);
46static Int p_show_table(USES_REGS1);
47static Int p_show_all_tables(USES_REGS1);
48static Int p_show_global_trie(USES_REGS1);
49static Int p_show_statistics_table(USES_REGS1);
50static Int p_show_statistics_tabling(USES_REGS1);
51static Int p_show_statistics_global_trie(USES_REGS1);
54static Int p_yapor_workers(USES_REGS1);
56static Int p_parallel_mode(USES_REGS1);
57static Int p_yapor_start(USES_REGS1);
58static Int p_worker(USES_REGS1);
59static Int p_parallel_new_answer(USES_REGS1);
60static Int p_parallel_get_answers(USES_REGS1);
61static Int p_show_statistics_or(USES_REGS1);
63#if defined(YAPOR) && defined(TABLING)
64static Int p_show_statistics_opt(USES_REGS1);
66static Int p_get_optyap_statistics(USES_REGS1);
69static inline realtime current_time(
void);
73static inline struct page_statistics show_statistics_table_entries(FILE *out);
74#if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
75static inline struct page_statistics show_statistics_subgoal_entries(FILE *out);
77static inline struct page_statistics show_statistics_subgoal_frames(FILE *out);
78static inline struct page_statistics
79show_statistics_dependency_frames(FILE *out);
80static inline struct page_statistics
81show_statistics_subgoal_trie_nodes(FILE *out);
82static inline struct page_statistics
83show_statistics_subgoal_trie_hashes(FILE *out);
84static inline struct page_statistics
85show_statistics_answer_trie_nodes(FILE *out);
86static inline struct page_statistics
87show_statistics_answer_trie_hashes(FILE *out);
88#if defined(THREADS_FULL_SHARING)
89static inline struct page_statistics
90show_statistics_answer_ref_nodes(FILE *out);
92static inline struct page_statistics
93show_statistics_global_trie_nodes(FILE *out);
94static inline struct page_statistics
95show_statistics_global_trie_hashes(FILE *out);
98static inline struct page_statistics show_statistics_or_frames(FILE *out);
99static inline struct page_statistics
100show_statistics_query_goal_solution_frames(FILE *out);
101static inline struct page_statistics
102show_statistics_query_goal_answer_frames(FILE *out);
104#if defined(YAPOR) && defined(TABLING)
105static inline struct page_statistics
106show_statistics_suspension_frames(FILE *out);
107#ifdef TABLING_INNER_CUTS
108static inline struct page_statistics
109show_statistics_table_subgoal_solution_frames(FILE *out);
110static inline struct page_statistics
111show_statistics_table_subgoal_answer_frames(FILE *out);
119struct page_statistics {
120#ifdef USE_PAGES_MALLOC
123 size_t structs_in_use;
127#define PgEnt_bytes_in_use(STATS) STATS.bytes_in_use
129#ifdef USE_PAGES_MALLOC
131#define CHECK_PAGE_FREE_STRUCTS(STR_TYPE, PAGE) \
136 pg_hd = PgEnt_first(PAGE); \
138 aux_ptr = PgHd_first_str(pg_hd); \
141 aux_ptr = aux_ptr->next; \
143 pg_hd = PgHd_next(pg_hd); \
145 TABLING_ERROR_CHECKING(CHECK_PAGE_FREE_STRUCTS, \
146 PgEnt_strs_free(PAGE) != cont); \
149#define CHECK_PAGE_FREE_STRUCTS(STR_TYPE, PAGE)
151#define INIT_PAGE_STATS(STATS) \
152 PgEnt_pages_in_use(STATS) = 0; \
153 PgEnt_strs_in_use(STATS) = 0
154#define INCREMENT_PAGE_STATS(STATS, PAGE) \
155 PgEnt_pages_in_use(STATS) += PgEnt_pages_in_use(PAGE); \
156 PgEnt_strs_in_use(STATS) += PgEnt_strs_in_use(PAGE)
157#define INCREMENT_AUX_STATS(STATS, BYTES, PAGES) \
158 BYTES += PgEnt_bytes_in_use(STATS); \
159 PAGES += PgEnt_pages_in_use(STATS)
160#define SHOW_PAGE_STATS_MSG(STR_NAME) \
161 " " STR_NAME " %10" Int_F " bytes (%ld pages and %ld structs in use)\n"
162#define SHOW_PAGE_STATS_ARGS(STATS, STR_TYPE) \
163 PgEnt_strs_in_use(STATS) * sizeof(STR_TYPE), PgEnt_pages_in_use(STATS), \
164 PgEnt_strs_in_use(STATS)
166#define CHECK_PAGE_FREE_STRUCTS(STR_TYPE, PAGE)
167#define INIT_PAGE_STATS(STATS) PgEnt_strs_in_use(STATS) = 0
168#define INCREMENT_PAGE_STATS(STATS, PAGE) \
169 PgEnt_strs_in_use(STATS) += PgEnt_strs_in_use(PAGE)
170#define INCREMENT_AUX_STATS(STATS, BYTES, PAGES) \
171 BYTES += PgEnt_bytes_in_use(STATS)
172#define SHOW_PAGE_STATS_MSG(STR_NAME) \
173 " %s %10" Int_F "s bytes (%" Sizet_F " ; structs in use)\n", STR_NAME
174#define SHOW_PAGE_STATS_ARGS(STATS, STR_TYPE) \
175 PgEnt_strs_in_use(STATS) * sizeof(STR_TYPE), PgEnt_strs_in_use(STATS)
178#if defined(THREADS) && defined(TABLING)
179#define GET_ALL_PAGE_STATS(STATS, STR_TYPE, _PAGES) \
180 LOCK(GLOBAL_ThreadHandlesLock); \
181 CHECK_PAGE_FREE_STRUCTS(STR_TYPE, GLOBAL##_PAGES); \
182 INCREMENT_PAGE_STATS(STATS, GLOBAL##_PAGES); \
185 for (wid = 0; wid < MAX_THREADS; wid++) { \
186 if (!Yap_local[wid]) \
188 if (REMOTE_ThreadHandle(wid).in_use) { \
189 CHECK_PAGE_FREE_STRUCTS(STR_TYPE, REMOTE##_PAGES(wid)); \
190 INCREMENT_PAGE_STATS(STATS, REMOTE##_PAGES(wid)); \
194 UNLOCK(GLOBAL_ThreadHandlesLock)
196#define GET_ALL_PAGE_STATS(STATS, STR_TYPE, _PAGES) \
197 CHECK_PAGE_FREE_STRUCTS(STR_TYPE, GLOBAL##_PAGES); \
198 INCREMENT_PAGE_STATS(STATS, GLOBAL##_PAGES)
201#define GET_PAGE_STATS(STATS, STR_TYPE, _PAGES) \
202 INIT_PAGE_STATS(STATS); \
203 GET_ALL_PAGE_STATS(STATS, STR_TYPE, _PAGES); \
204 PgEnt_bytes_in_use(STATS) = PgEnt_strs_in_use(STATS) * sizeof(STR_TYPE)
205#define SHOW_PAGE_STATS(OUT_STREAM, STR_TYPE, _PAGES, STR_NAME) \
207 struct page_statistics stats; \
208 GET_PAGE_STATS(stats, STR_TYPE, _PAGES); \
209 fprintf(OUT_STREAM, SHOW_PAGE_STATS_MSG(STR_NAME), \
210 SHOW_PAGE_STATS_ARGS(stats, STR_TYPE)); \
218void Yap_init_optyap_preds(
void) {
219 Yap_InitCPred(
"$c_yapor_workers", 1, p_yapor_workers,
220 SafePredFlag | SyncPredFlag);
222 Yap_InitCPred(
"freeze_choice_point", 1, p_freeze_choice_point,
223 SafePredFlag | SyncPredFlag);
224 Yap_InitCPred(
"wake_choice_point", 1, p_wake_choice_point,
225 SafePredFlag | SyncPredFlag);
226 Yap_InitCPred(
"abolish_frozen_choice_points", 1,
227 p_abolish_frozen_choice_points_until,
228 SafePredFlag | SyncPredFlag);
229 Yap_InitCPred(
"abolish_frozen_choice_points", 0,
230 p_abolish_frozen_choice_points_all,
231 SafePredFlag | SyncPredFlag);
232 Yap_InitCPred(
"$c_table", 3, p_table, SafePredFlag | SyncPredFlag);
233 Yap_InitCPred(
"$c_tabling_mode", 3, p_tabling_mode,
234 SafePredFlag | SyncPredFlag);
235 Yap_InitCPred(
"$c_abolish_table", 2, p_abolish_table,
236 SafePredFlag | SyncPredFlag);
237 Yap_InitCPred(
"abolish_all_tables", 0, p_abolish_all_tables,
238 SafePredFlag | SyncPredFlag);
247 Yap_InitCPred(
"show_tabled_predicates", 1, p_show_tabled_predicates,
248 SafePredFlag | SyncPredFlag);
249 Yap_InitCPred(
"$c_show_table", 3, p_show_table, SafePredFlag | SyncPredFlag);
250 Yap_InitCPred(
"show_all_tables", 1, p_show_all_tables,
251 SafePredFlag | SyncPredFlag);
252 Yap_InitCPred(
"show_global_trie", 1, p_show_global_trie,
253 SafePredFlag | SyncPredFlag);
254 Yap_InitCPred(
"$c_table_statistics", 3, p_show_statistics_table,
255 SafePredFlag | SyncPredFlag);
256 Yap_InitCPred(
"tabling_statistics", 1, p_show_statistics_tabling,
257 SafePredFlag | SyncPredFlag);
258 Yap_InitCPred(
"global_trie_statistics", 1, p_show_statistics_global_trie,
259 SafePredFlag | SyncPredFlag);
262 Yap_InitCPred(
"parallel_mode", 1, p_parallel_mode,
263 SafePredFlag | SyncPredFlag);
264 Yap_InitCPred(
"$c_yapor_start", 0, p_yapor_start,
265 SafePredFlag | SyncPredFlag);
266 Yap_InitCPred(
"$c_worker", 0, p_worker, SafePredFlag | SyncPredFlag);
267 Yap_InitCPred(
"$c_parallel_new_answer", 1, p_parallel_new_answer,
268 SafePredFlag | SyncPredFlag);
269 Yap_InitCPred(
"$c_parallel_get_answers", 1, p_parallel_get_answers,
270 SafePredFlag | SyncPredFlag);
271 Yap_InitCPred(
"or_statistics", 1, p_show_statistics_or,
272 SafePredFlag | SyncPredFlag);
274#if defined(YAPOR) && defined(TABLING)
275 Yap_InitCPred(
"opt_statistics", 1, p_show_statistics_opt,
276 SafePredFlag | SyncPredFlag);
278 Yap_InitCPred(
"$c_get_optyap_statistics", 3, p_get_optyap_statistics,
279 SafePredFlag | SyncPredFlag);
283void finish_yapor(
void) {
284 GLOBAL_execution_time = current_time() - GLOBAL_execution_time;
285 GLOBAL_parallel_mode = PARALLEL_MODE_ON;
295static Int p_freeze_choice_point(USES_REGS1) {
296 if (IsVarTerm(Deref(ARG1))) {
297 Int offset = freeze_current_cp();
298 return Yap_unify(ARG1, MkIntegerTerm(offset));
303static Int p_wake_choice_point(USES_REGS1) {
304 Term term_offset = Deref(ARG1);
305 if (IsIntegerTerm(term_offset))
306 wake_frozen_cp(IntegerOfTerm(term_offset));
310static Int p_abolish_frozen_choice_points_until(USES_REGS1) {
311 Term term_offset = Deref(ARG1);
312 if (IsIntegerTerm(term_offset))
313 abolish_frozen_cps_until(IntegerOfTerm(term_offset));
317static Int p_abolish_frozen_choice_points_all(USES_REGS1) {
318 abolish_frozen_cps_all();
322static Int p_table(USES_REGS1) {
328#ifdef MODE_DIRECTED_TABLING
329 int *mode_directed = NULL;
338 pe = RepPredProp(PredPropByAtom(at, mod));
340 }
else if (IsApplTerm(t)) {
341 at = NameOfFunctor(FunctorOfTerm(t));
342 pe = RepPredProp(PredPropByFunc(FunctorOfTerm(t), mod));
343 arity = ArityOfFunctor(FunctorOfTerm(t));
346 if (list != TermNil) {
347#ifndef MODE_DIRECTED_TABLING
348 Yap_Error(SYSTEM_ERROR_COMPILER, TermNil,
"invalid tabling declaration for "
349 "%s/%d (mode directed tabling "
351 AtomName(at), arity);
366 int pos_sum_last = 0;
369 int *aux_mode_directed;
371 aux_mode_directed = malloc(arity *
sizeof(
int));
372 for (i = 0; i < arity; i++) {
373 int mode = IntOfTerm(HeadOfTerm(list));
374 if (mode == MODE_DIRECTED_INDEX)
376 else if (mode == MODE_DIRECTED_MIN || mode == MODE_DIRECTED_MAX)
378 else if (mode == MODE_DIRECTED_ALL)
380 else if (mode == MODE_DIRECTED_SUM || mode == MODE_DIRECTED_LAST) {
382 free(aux_mode_directed);
383 Yap_Error(SYSTEM_ERROR_COMPILER, TermNil,
384 "invalid tabling declaration for %s/%d (more than one "
385 "argument with modes 'sum' and/or 'last')",
386 AtomName(at), arity);
391 aux_mode_directed[i] = mode;
392 list = TailOfTerm(list);
394 pos_first = pos_index + pos_min_max + pos_all + pos_sum_last;
395 pos_sum_last = pos_index + pos_min_max + pos_all;
396 pos_all = pos_index + pos_min_max;
397 pos_min_max = pos_index;
399 ALLOC_BLOCK(mode_directed, arity *
sizeof(
int),
int);
400 for (i = 0; i < arity; i++) {
402 if (aux_mode_directed[i] == MODE_DIRECTED_INDEX)
403 aux_pos = pos_index++;
404 else if (aux_mode_directed[i] == MODE_DIRECTED_MIN ||
405 aux_mode_directed[i] == MODE_DIRECTED_MAX)
406 aux_pos = pos_min_max++;
407 else if (aux_mode_directed[i] == MODE_DIRECTED_ALL)
409 else if (aux_mode_directed[i] == MODE_DIRECTED_SUM ||
410 aux_mode_directed[i] == MODE_DIRECTED_LAST)
411 aux_pos = pos_sum_last++;
412 else if (aux_mode_directed[i] == MODE_DIRECTED_FIRST)
413 aux_pos = pos_first++;
414 mode_directed[aux_pos] = MODE_DIRECTED_SET(i, aux_mode_directed[i]);
416 free(aux_mode_directed);
419 if (pe->PredFlags & TabledPredFlag)
421 if (pe->cs.p_code.FirstClause)
423 if (!(pe->PredFlags & TabledPredFlag)) {
424 pe->PredFlags |= TabledPredFlag;
425 new_table_entry(tab_ent, pe, at, arity, mode_directed);
426 pe->TableOfPred = tab_ent;
431static Int p_tabling_mode(USES_REGS1) {
438 tab_ent = RepPredProp(PredPropByAtom(AtomOfTerm(t), mod))->TableOfPred;
439 else if (IsApplTerm(t))
440 tab_ent = RepPredProp(PredPropByFunc(FunctorOfTerm(t), mod))->TableOfPred;
443 tvalue = Deref(ARG3);
444 if (IsVarTerm(tvalue)) {
446 if (IsMode_LocalTrie(TabEnt_flags(tab_ent)))
447 t = MkPairTerm(MkAtomTerm(AtomLocalTrie), t);
448 else if (IsMode_GlobalTrie(TabEnt_flags(tab_ent)))
449 t = MkPairTerm(MkAtomTerm(AtomGlobalTrie), t);
450 if (IsMode_ExecAnswers(TabEnt_flags(tab_ent)))
451 t = MkPairTerm(MkAtomTerm(AtomExecAnswers), t);
452 else if (IsMode_LoadAnswers(TabEnt_flags(tab_ent)))
453 t = MkPairTerm(MkAtomTerm(AtomLoadAnswers), t);
454 if (IsMode_Batched(TabEnt_flags(tab_ent)))
455 t = MkPairTerm(MkAtomTerm(AtomBatched), t);
456 else if (IsMode_Local(TabEnt_flags(tab_ent)))
457 t = MkPairTerm(MkAtomTerm(AtomLocal), t);
458 if (IsMode_CoInductive(TabEnt_flags(tab_ent)))
459 t = MkPairTerm(MkAtomTerm(AtomCoInductive), t);
460 t = MkPairTerm(MkAtomTerm(AtomDefault), t);
461 t = MkPairTerm(t, TermNil);
462 if (IsMode_LocalTrie(TabEnt_mode(tab_ent)))
463 t = MkPairTerm(MkAtomTerm(AtomLocalTrie), t);
464 else if (IsMode_GlobalTrie(TabEnt_mode(tab_ent)))
465 t = MkPairTerm(MkAtomTerm(AtomGlobalTrie), t);
466 if (IsMode_ExecAnswers(TabEnt_mode(tab_ent)))
467 t = MkPairTerm(MkAtomTerm(AtomExecAnswers), t);
468 else if (IsMode_LoadAnswers(TabEnt_mode(tab_ent)))
469 t = MkPairTerm(MkAtomTerm(AtomLoadAnswers), t);
470 if (IsMode_Batched(TabEnt_mode(tab_ent)))
471 t = MkPairTerm(MkAtomTerm(AtomBatched), t);
472 else if (IsMode_Local(TabEnt_mode(tab_ent)))
473 t = MkPairTerm(MkAtomTerm(AtomLocal), t);
474 YapBind((CELL *)tvalue, t);
476 }
else if (IsIntTerm(tvalue)) {
477 Int value = IntOfTerm(tvalue);
479 SetMode_Batched(TabEnt_flags(tab_ent));
480 if (!IsMode_Local(LOCAL_TabMode)) {
481 SetMode_Batched(TabEnt_mode(tab_ent));
484 }
else if (value == 2) {
485 SetMode_Local(TabEnt_flags(tab_ent));
486 if (!IsMode_Batched(LOCAL_TabMode)) {
487 SetMode_Local(TabEnt_mode(tab_ent));
490 }
else if (value == 3) {
491 SetMode_ExecAnswers(TabEnt_flags(tab_ent));
492 if (!IsMode_LoadAnswers(LOCAL_TabMode)) {
493 SetMode_ExecAnswers(TabEnt_mode(tab_ent));
496 }
else if (value == 4) {
497 SetMode_LoadAnswers(TabEnt_flags(tab_ent));
498 if (!IsMode_ExecAnswers(LOCAL_TabMode)) {
499 SetMode_LoadAnswers(TabEnt_mode(tab_ent));
502 }
else if (value == 5) {
503 SetMode_LocalTrie(TabEnt_flags(tab_ent));
504 if (!IsMode_GlobalTrie(LOCAL_TabMode)) {
505 SetMode_LocalTrie(TabEnt_mode(tab_ent));
508 }
else if (value == 6) {
509 SetMode_GlobalTrie(TabEnt_flags(tab_ent));
510 if (!IsMode_LocalTrie(LOCAL_TabMode)) {
511 SetMode_GlobalTrie(TabEnt_mode(tab_ent));
514 }
else if (value == 7) {
516 SetMode_CoInductive(TabEnt_flags(tab_ent));
523static Int p_abolish_table(USES_REGS1) {
530 tab_ent = RepPredProp(PredPropByAtom(AtomOfTerm(t), mod))->TableOfPred;
531 else if (IsApplTerm(t))
532 tab_ent = RepPredProp(PredPropByFunc(FunctorOfTerm(t), mod))->TableOfPred;
535 abolish_table(tab_ent);
539static Int p_abolish_all_tables(USES_REGS1) {
542 tab_ent = GLOBAL_root_tab_ent;
544 abolish_table(tab_ent);
545 tab_ent = TabEnt_next(tab_ent);
550static Int p_show_tabled_predicates(USES_REGS1) {
553 Term t = Deref(ARG1);
555 if (!IsStreamTerm(t))
557 if (!(out = Yap_GetStreamHandle(t)->file))
559 tab_ent = GLOBAL_root_tab_ent;
560 fprintf(out,
"Tabled predicates\n");
562 fprintf(out,
" NONE\n");
565 fprintf(out,
" %s/%d\n", AtomName(TabEnt_atom(tab_ent)),
566 TabEnt_arity(tab_ent));
567 tab_ent = TabEnt_next(tab_ent);
573static Int p_show_table(USES_REGS1) {
576 Term t1 = Deref(ARG1);
579 if (!IsStreamTerm(t1))
581 if (!(out = Yap_GetStreamHandle(t1)->file))
586 tab_ent = RepPredProp(PredPropByAtom(AtomOfTerm(t), mod))->TableOfPred;
587 else if (IsApplTerm(t))
588 tab_ent = RepPredProp(PredPropByFunc(FunctorOfTerm(t), mod))->TableOfPred;
592 showTable(tab_ent, SHOW_MODE_STRUCTURE, out);
596static Int p_show_all_tables(USES_REGS1) {
598 Term t = Deref(ARG1);
601 if (!IsStreamTerm(t))
603 if (!(out = Yap_GetStreamHandle(t)->file))
605 tab_ent = GLOBAL_root_tab_ent;
607 showTable(tab_ent, SHOW_MODE_STRUCTURE, out);
608 tab_ent = TabEnt_next(tab_ent);
613static Int p_show_global_trie(USES_REGS1) {
614 Term t = Deref(ARG1);
617 if (!IsStreamTerm(t))
619 if (!(out = Yap_GetStreamHandle(t)->file))
621 showGlobalTrie(SHOW_MODE_STRUCTURE, out);
625static Int p_show_statistics_table(USES_REGS1) {
628 Term t1 = Deref(ARG1);
631 if (!IsStreamTerm(t1))
633 if (!(out = Yap_GetStreamHandle(t1)->file))
638 tab_ent = RepPredProp(PredPropByAtom(AtomOfTerm(t), mod))->TableOfPred;
639 else if (IsApplTerm(t))
640 tab_ent = RepPredProp(PredPropByFunc(FunctorOfTerm(t), mod))->TableOfPred;
645 showTable(tab_ent, SHOW_MODE_STATISTICS, out);
649static Int p_show_statistics_tabling(USES_REGS1) {
650 struct page_statistics stats;
651 long bytes, total_bytes = 0;
652#ifdef USE_PAGES_MALLOC
653 long total_pages = 0;
656 Term t = Deref(ARG1);
658 if (!IsStreamTerm(t))
660 if (!(out = Yap_GetStreamHandle(t)->file))
663 fprintf(out,
"Execution data structures\n");
664 stats = show_statistics_table_entries(out);
665 INCREMENT_AUX_STATS(stats, bytes, total_pages);
666#if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
667 stats = show_statistics_subgoal_entries(out);
668 INCREMENT_AUX_STATS(stats, bytes, total_pages);
670 stats = show_statistics_subgoal_frames(out);
671 INCREMENT_AUX_STATS(stats, bytes, total_pages);
672 stats = show_statistics_dependency_frames(out);
673 INCREMENT_AUX_STATS(stats, bytes, total_pages);
674 fprintf(out,
" Memory in use (I): %10ld bytes\n\n", bytes);
675 total_bytes += bytes;
677 fprintf(out,
"Local trie data structures\n");
678 stats = show_statistics_subgoal_trie_nodes(out);
679 INCREMENT_AUX_STATS(stats, bytes, total_pages);
680 stats = show_statistics_answer_trie_nodes(out);
681 INCREMENT_AUX_STATS(stats, bytes, total_pages);
682 stats = show_statistics_subgoal_trie_hashes(out);
683 INCREMENT_AUX_STATS(stats, bytes, total_pages);
684 stats = show_statistics_answer_trie_hashes(out);
685 INCREMENT_AUX_STATS(stats, bytes, total_pages);
686#if defined(THREADS_FULL_SHARING)
687 stats = show_statistics_answer_ref_nodes(out);
688 INCREMENT_AUX_STATS(stats, bytes, total_pages);
690 fprintf(out,
" Memory in use (II): %10ld bytes\n\n", bytes);
691 total_bytes += bytes;
693 fprintf(out,
"Global trie data structures\n");
694 stats = show_statistics_global_trie_nodes(out);
695 INCREMENT_AUX_STATS(stats, bytes, total_pages);
696 stats = show_statistics_global_trie_hashes(out);
697 INCREMENT_AUX_STATS(stats, bytes, total_pages);
698 fprintf(out,
" Memory in use (III): %10ld bytes\n\n", bytes);
699 total_bytes += bytes;
700#ifdef USE_PAGES_MALLOC
702 "Total memory in use (I+II+III): %10ld bytes (%ld pages in use)\n",
703 total_bytes, total_pages);
706 "Total memory allocated: %10ld bytes (%ld pages in total)\n",
707 PgEnt_pages_in_use(GLOBAL_pages_alloc) * Yap_page_size,
708 PgEnt_pages_in_use(GLOBAL_pages_alloc));
710 fprintf(out,
"Total memory in use (I+II+III): %10ld bytes\n", total_bytes);
716static Int p_show_statistics_global_trie(USES_REGS1) {
717 Term t = Deref(ARG1);
720 if (!IsStreamTerm(t))
722 if (!(out = Yap_GetStreamHandle(t)->file))
724 showGlobalTrie(SHOW_MODE_STATISTICS, out);
734static Int p_parallel_mode(USES_REGS1) {
739 if (GLOBAL_parallel_mode == PARALLEL_MODE_OFF)
740 ta = MkAtomTerm(Yap_LookupAtom(
"off"));
741 else if (GLOBAL_parallel_mode == PARALLEL_MODE_ON)
742 ta = MkAtomTerm(Yap_LookupAtom(
"on"));
744 ta = MkAtomTerm(Yap_LookupAtom(
"running"));
745 YapBind((CELL *)t, ta);
748 if (IsAtomTerm(t) && GLOBAL_parallel_mode != PARALLEL_MODE_RUNNING) {
750 s = RepAtom(AtomOfTerm(t))->StrOfAE;
751 if (strcmp(s,
"on") == 0) {
752 GLOBAL_parallel_mode = PARALLEL_MODE_ON;
755 if (strcmp(s,
"off") == 0) {
756 GLOBAL_parallel_mode = PARALLEL_MODE_OFF;
764static Int p_yapor_start(USES_REGS1) {
765#ifdef TIMESTAMP_CHECK
766 GLOBAL_timestamp = 0;
768 BITMAP_delete(GLOBAL_bm_idle_workers, 0);
769 BITMAP_clear(GLOBAL_bm_invisible_workers);
770 BITMAP_clear(GLOBAL_bm_requestable_workers);
771#ifdef TABLING_INNER_CUTS
772 BITMAP_clear(GLOBAL_bm_pruning_workers);
774 make_root_choice_point();
775 GLOBAL_parallel_mode = PARALLEL_MODE_RUNNING;
776 GLOBAL_execution_time = current_time();
777 BITMAP_clear(GLOBAL_bm_finished_workers);
781static Int p_yapor_workers(USES_REGS1) {
783 return Yap_unify(MkIntegerTerm(GLOBAL_number_workers), ARG1);
789static Int p_worker(USES_REGS1) {
790 CurrentModule = USER_MODULE;
791 P = GETWORK_FIRST_TIME;
795static Int p_parallel_new_answer(USES_REGS1) {
799 ALLOC_QG_ANSWER_FRAME(actual_answer);
800 AnsFr_answer(actual_answer) = Deref(ARG1);
801 AnsFr_next(actual_answer) = NULL;
802 leftmost_or_fr = CUT_leftmost_or_frame();
803 LOCK_OR_FRAME(leftmost_or_fr);
804 if (Get_LOCAL_prune_request()) {
805 UNLOCK_OR_FRAME(leftmost_or_fr);
806 FREE_QG_ANSWER_FRAME(actual_answer);
808 CUT_store_answer(leftmost_or_fr, actual_answer);
809 UNLOCK_OR_FRAME(leftmost_or_fr);
814static Int p_parallel_get_answers(USES_REGS1) {
817 if (OrFr_qg_solutions(LOCAL_top_or_fr)) {
819 aux_answer1 = SolFr_first(OrFr_qg_solutions(LOCAL_top_or_fr));
820 while (aux_answer1) {
821 t = MkPairTerm(AnsFr_answer(aux_answer1), t);
822 aux_answer2 = aux_answer1;
823 aux_answer1 = AnsFr_next(aux_answer1);
824 FREE_QG_ANSWER_FRAME(aux_answer2);
826 FREE_QG_SOLUTION_FRAME(OrFr_qg_solutions(LOCAL_top_or_fr));
827 OrFr_qg_solutions(LOCAL_top_or_fr) = NULL;
833static Int p_show_statistics_or(USES_REGS1) {
834 struct page_statistics stats;
835 long bytes, total_bytes = 0;
836#ifdef USE_PAGES_MALLOC
837 long total_pages = 0;
839 Term t = Deref(ARG1);
841 if (!IsStreamTerm(t))
843 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ bytes =
845 fprintf(out,
"Execution data structures\n");
846 stats = show_statistics_or_frames(out);
847 INCREMENT_AUX_STATS(stats, bytes, total_pages);
848 fprintf(out,
" Memory in use (I): %10ld bytes\n\n", bytes);
849 total_bytes += bytes;
851 fprintf(out,
"Cut support data structures\n");
852 stats = show_statistics_query_goal_solution_frames(out);
853 INCREMENT_AUX_STATS(stats, bytes, total_pages);
854 stats = show_statistics_query_goal_answer_frames(out);
855 INCREMENT_AUX_STATS(stats, bytes, total_pages);
856 fprintf(out,
" Memory in use (II): %10ld bytes\n\n", bytes);
857 total_bytes += bytes;
858#ifdef USE_PAGES_MALLOC
860 "Total memory in use (I+II): %10ld bytes (%ld pages in use)\n",
861 total_bytes, total_pages);
864 "Total memory allocated: %10ld bytes (%ld pages in total)\n",
865 PgEnt_pages_in_use(GLOBAL_pages_alloc) * Yap_page_size,
866 PgEnt_pages_in_use(GLOBAL_pages_alloc));
868 fprintf(out,
"Total memory in use (I+II): %10ld bytes\n", total_bytes);
870 PL_release_stream(out);
876static Int p_yapor_workers(USES_REGS1) {
return FALSE; }
883#if defined(YAPOR) && defined(TABLING)
884static Int p_show_statistics_opt(USES_REGS1) {
885 struct page_statistics stats;
886 long bytes, total_bytes = 0;
887#ifdef USE_PAGES_MALLOC
888 long total_pages = 0;
891 Term t = Deref(ARG1);
893 if (IsVarTerm(t) || !IsAtomTerm(t))
895 if (!(out = Yap_GetStreamHandle(AtomOfTerm(t))))
898 fprintf(out,
"Execution data structures\n");
899 stats = show_statistics_table_entries(out);
900 INCREMENT_AUX_STATS(stats, bytes, total_pages);
901#if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
902 stats = show_statistics_subgoal_entries(out);
903 INCREMENT_AUX_STATS(stats, bytes, total_pages);
905 stats = show_statistics_subgoal_frames(out);
906 INCREMENT_AUX_STATS(stats, bytes, total_pages);
907 stats = show_statistics_dependency_frames(out);
908 INCREMENT_AUX_STATS(stats, bytes, total_pages);
909 stats = show_statistics_or_frames(out);
910 INCREMENT_AUX_STATS(stats, bytes, total_pages);
911 stats = show_statistics_suspension_frames(out);
912 INCREMENT_AUX_STATS(stats, bytes, total_pages);
913 fprintf(out,
" Memory in use (I): %10ld bytes\n\n", bytes);
914 total_bytes += bytes;
916 fprintf(out,
"Local trie data structures\n");
917 stats = show_statistics_subgoal_trie_nodes(out);
918 INCREMENT_AUX_STATS(stats, bytes, total_pages);
919 stats = show_statistics_answer_trie_nodes(out);
920 INCREMENT_AUX_STATS(stats, bytes, total_pages);
921 stats = show_statistics_subgoal_trie_hashes(out);
922 INCREMENT_AUX_STATS(stats, bytes, total_pages);
923 stats = show_statistics_answer_trie_hashes(out);
924 INCREMENT_AUX_STATS(stats, bytes, total_pages);
925#if defined(THREADS_FULL_SHARING)
926 stats = show_statistics_answer_ref_nodes(out);
927 INCREMENT_AUX_STATS(stats, bytes, total_pages);
929 fprintf(out,
" Memory in use (II): %10ld bytes\n\n", bytes);
930 total_bytes += bytes;
932 fprintf(out,
"Global trie data structures\n");
933 stats = show_statistics_global_trie_nodes(out);
934 INCREMENT_AUX_STATS(stats, bytes, total_pages);
935 stats = show_statistics_global_trie_hashes(out);
936 INCREMENT_AUX_STATS(stats, bytes, total_pages);
937 fprintf(out,
" Memory in use (III): %10ld bytes\n\n", bytes);
938 total_bytes += bytes;
940 fprintf(out,
"Cut support data structures\n");
941 stats = show_statistics_query_goal_solution_frames(out);
942 INCREMENT_AUX_STATS(stats, bytes, total_pages);
943 stats = show_statistics_query_goal_answer_frames(out);
944 INCREMENT_AUX_STATS(stats, bytes, total_pages);
945#ifdef TABLING_INNER_CUTS
946 stats = show_statistics_table_subgoal_solution_frames(out);
947 INCREMENT_AUX_STATS(stats, bytes, total_pages);
948 stats = show_statistics_table_subgoal_answer_frames(out);
949 INCREMENT_AUX_STATS(stats, bytes, total_pages);
951 fprintf(out,
" Memory in use (IV): %10ld bytes\n\n", bytes);
952 total_bytes += bytes;
953#ifdef USE_PAGES_MALLOC
955 "Total memory in use (I+II+III+IV): %10ld bytes (%ld pages in use)\n",
956 total_bytes, total_pages);
959 "Total memory allocated: %10ld bytes (%ld pages in total)\n",
960 PgEnt_pages_in_use(GLOBAL_pages_alloc) * Yap_page_size,
961 PgEnt_pages_in_use(GLOBAL_pages_alloc));
963 fprintf(out,
"Total memory in use (I+II+III+IV): %10ld bytes\n", total_bytes);
965 PL_release_stream(out);
970static Int p_get_optyap_statistics(USES_REGS1) {
971 struct page_statistics stats;
972 Int value, bytes = 0, structs = -1;
973 Term tbytes, tstructs;
975 value = IntOfTerm(Deref(ARG1));
977 if (value == 0 || value == 1) {
978 GET_PAGE_STATS(stats,
struct table_entry, _pages_tab_ent);
979 bytes += PgEnt_bytes_in_use(stats);
981 structs = PgEnt_strs_in_use(stats);
983#if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
984 if (value == 0 || value == 16) {
986 bytes += PgEnt_bytes_in_use(stats);
988 structs = PgEnt_strs_in_use(stats);
991 if (value == 0 || value == 2) {
993 bytes += PgEnt_bytes_in_use(stats);
995 structs = PgEnt_strs_in_use(stats);
997 if (value == 0 || value == 3) {
999 bytes += PgEnt_bytes_in_use(stats);
1001 structs = PgEnt_strs_in_use(stats);
1003 if (value == 0 || value == 6) {
1005 bytes += PgEnt_bytes_in_use(stats);
1007 structs = PgEnt_strs_in_use(stats);
1009 if (value == 0 || value == 8) {
1011 bytes += PgEnt_bytes_in_use(stats);
1013 structs = PgEnt_strs_in_use(stats);
1015 if (value == 0 || value == 7) {
1017 bytes += PgEnt_bytes_in_use(stats);
1019 structs = PgEnt_strs_in_use(stats);
1021 if (value == 0 || value == 9) {
1023 bytes += PgEnt_bytes_in_use(stats);
1025 structs = PgEnt_strs_in_use(stats);
1027#if defined(THREADS_FULL_SHARING)
1028 if (value == 0 || value == 17) {
1029 GET_PAGE_STATS(stats,
struct answer_ref_node, _pages_ans_ref_node);
1030 bytes += PgEnt_bytes_in_use(stats);
1032 structs = PgEnt_strs_in_use(stats);
1035 if (value == 0 || value == 10) {
1037 bytes += PgEnt_bytes_in_use(stats);
1039 structs = PgEnt_strs_in_use(stats);
1041 if (value == 0 || value == 11) {
1043 bytes += PgEnt_bytes_in_use(stats);
1045 structs = PgEnt_strs_in_use(stats);
1049 if (value == 0 || value == 4) {
1050 GET_PAGE_STATS(stats,
struct or_frame, _pages_or_fr);
1051 bytes += PgEnt_bytes_in_use(stats);
1053 structs = PgEnt_strs_in_use(stats);
1055 if (value == 0 || value == 12) {
1057 bytes += PgEnt_bytes_in_use(stats);
1059 structs = PgEnt_strs_in_use(stats);
1061 if (value == 0 || value == 13) {
1063 bytes += PgEnt_bytes_in_use(stats);
1065 structs = PgEnt_strs_in_use(stats);
1068#if defined(YAPOR) && defined(TABLING)
1069 if (value == 0 || value == 5) {
1070 GET_PAGE_STATS(stats,
struct suspension_frame, _pages_susp_fr);
1071 bytes += PgEnt_bytes_in_use(stats);
1073 structs = PgEnt_strs_in_use(stats);
1075#ifdef TABLING_INNER_CUTS
1076 if (value == 0 || value == 14) {
1077 GET_PAGE_STATS(stats,
struct table_subgoal_solution_frame,
1079 bytes += PgEnt_bytes_in_use(stats);
1081 structs = PgEnt_strs_in_use(stats);
1083 if (value == 0 || value == 15) {
1084 GET_PAGE_STATS(stats,
struct table_subgoal_answer_frame, _pages_tg_ans_fr);
1085 bytes += PgEnt_bytes_in_use(stats);
1087 structs = PgEnt_strs_in_use(stats);
1093#ifdef USE_PAGES_MALLOC
1094 structs = PgEnt_pages_in_use(GLOBAL_pages_alloc) * Yap_page_size;
1101 tbytes = Deref(ARG2);
1102 tstructs = Deref(ARG3);
1103 if (IsVarTerm(tbytes)) {
1104 YapBind((CELL *)tbytes, MkIntTerm(bytes));
1105 }
else if (IsIntTerm(tbytes) && IntOfTerm(tbytes) != bytes)
1107 if (IsVarTerm(tstructs)) {
1108 YapBind((CELL *)tstructs, MkIntTerm(structs));
1109 }
else if (IsIntTerm(tstructs) && IntOfTerm(tstructs) != structs)
1119static inline realtime current_time(
void) {
1120#define TIME_RESOLUTION 1000000
1121 struct timeval tempo;
1122 gettimeofday(&tempo, NULL);
1123 return ((realtime)tempo.tv_sec + (realtime)tempo.tv_usec / TIME_RESOLUTION);
1134static inline struct page_statistics show_statistics_table_entries(FILE *out) {
1135 SHOW_PAGE_STATS(out,
struct table_entry, _pages_tab_ent,
1139#if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
1140static inline struct page_statistics
1141show_statistics_subgoal_entries(FILE *out) {
1143 "Subgoal entries: ");
1147static inline struct page_statistics show_statistics_subgoal_frames(FILE *out) {
1149 "Subgoal frames: ");
1152static inline struct page_statistics
1153show_statistics_dependency_frames(FILE *out) {
1155 "Dependency frames: ");
1158static inline struct page_statistics
1159show_statistics_subgoal_trie_nodes(FILE *out) {
1161 "Subgoal trie nodes: ");
1164static inline struct page_statistics
1165show_statistics_subgoal_trie_hashes(FILE *out) {
1167 "Subgoal trie hashes: ");
1170static inline struct page_statistics
1171show_statistics_answer_trie_nodes(FILE *out) {
1173 "Answer trie nodes: ");
1176static inline struct page_statistics
1177show_statistics_answer_trie_hashes(FILE *out) {
1179 "Answer trie hashes: ");
1182#if defined(THREADS_FULL_SHARING)
1183static inline struct page_statistics
1184show_statistics_answer_ref_nodes(FILE *out) {
1185 SHOW_PAGE_STATS(out,
struct answer_ref_node, _pages_ans_ref_node,
1186 "Answer ref nodes: ");
1190static inline struct page_statistics
1191show_statistics_global_trie_nodes(FILE *out) {
1193 "Global trie nodes: ");
1196static inline struct page_statistics
1197show_statistics_global_trie_hashes(FILE *out) {
1199 "Global trie hashes: ");
1204static inline struct page_statistics show_statistics_or_frames(FILE *out) {
1205 SHOW_PAGE_STATS(out,
struct or_frame, _pages_or_fr,
1209static inline struct page_statistics
1210show_statistics_query_goal_solution_frames(FILE *out) {
1212 "Query goal solution frames: ");
1215static inline struct page_statistics
1216show_statistics_query_goal_answer_frames(FILE *out) {
1218 "Query goal answer frames: ");
1222#if defined(YAPOR) && defined(TABLING)
1223static inline struct page_statistics
1224show_statistics_suspension_frames(FILE *out) {
1225 SHOW_PAGE_STATS(out,
struct suspension_frame, _pages_susp_fr,
1226 "Suspension frames: ");
1229#ifdef TABLING_INNER_CUTS
1230static inline struct page_statistics
1231show_statistics_table_subgoal_solution_frames(FILE *out) {
1232 SHOW_PAGE_STATS(out,
struct table_subgoal_solution_frame, _pages_tg_sol_fr,
1233 "Table subgoal solution frames:");
1236static inline struct page_statistics
1237show_statistics_table_subgoal_answer_frames(FILE *out) {
1238 SHOW_PAGE_STATS(out,
struct table_subgoal_answer_frame, _pages_tg_ans_fr,
1239 "Table subgoal answer frames: ");