| 
									
										
										
										
											2010-04-03 05:58:14 +01:00
										 |  |  | /************************************************************************
 | 
					
						
							|  |  |  | **                                                                     ** | 
					
						
							|  |  |  | **                   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      ** | 
					
						
							|  |  |  | **                                                                     ** | 
					
						
							|  |  |  | ************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /************************************
 | 
					
						
							|  |  |  | **      Includes & Prototypes      ** | 
					
						
							|  |  |  | ************************************/ | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "Yap.h"
 | 
					
						
							|  |  |  | #if defined(YAPOR) || defined(TABLING)
 | 
					
						
							| 
									
										
										
										
											2009-10-23 14:22:17 +01:00
										 |  |  | #include "YapHeap.h"
 | 
					
						
							| 
									
										
										
										
											2016-07-31 10:19:11 -05:00
										 |  |  | #include "Yatom.h"
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #ifdef YAPOR
 | 
					
						
							| 
									
										
										
										
											2011-06-01 18:51:12 +01:00
										 |  |  | #if HAVE_STRING_H
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #endif /* HAVE_STRING_H */
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #if HAVE_SYS_TIME_H
 | 
					
						
							|  |  |  | #include <sys/time.h>
 | 
					
						
							| 
									
										
										
										
											2005-06-03 18:28:11 +00:00
										 |  |  | #endif /* HAVE_SYS_TIME_H */
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #include "or.macros.h"
 | 
					
						
							|  |  |  | #endif /* YAPOR */
 | 
					
						
							|  |  |  | #ifdef TABLING
 | 
					
						
							|  |  |  | #include "tab.macros.h"
 | 
					
						
							|  |  |  | #endif /* TABLING */
 | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  | #include "iopreds.h"
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef TABLING
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_freeze_choice_point(USES_REGS1); | 
					
						
							|  |  |  | static Int p_wake_choice_point(USES_REGS1); | 
					
						
							|  |  |  | static Int p_abolish_frozen_choice_points_until(USES_REGS1); | 
					
						
							|  |  |  | static Int p_abolish_frozen_choice_points_all(USES_REGS1); | 
					
						
							|  |  |  | static Int p_table(USES_REGS1); | 
					
						
							|  |  |  | static Int p_tabling_mode(USES_REGS1); | 
					
						
							|  |  |  | static Int p_abolish_table(USES_REGS1); | 
					
						
							|  |  |  | static Int p_abolish_all_tables(USES_REGS1); | 
					
						
							|  |  |  | static Int p_show_tabled_predicates(USES_REGS1); | 
					
						
							|  |  |  | static Int p_show_table(USES_REGS1); | 
					
						
							|  |  |  | static Int p_show_all_tables(USES_REGS1); | 
					
						
							|  |  |  | static Int p_show_global_trie(USES_REGS1); | 
					
						
							|  |  |  | static Int p_show_statistics_table(USES_REGS1); | 
					
						
							|  |  |  | static Int p_show_statistics_tabling(USES_REGS1); | 
					
						
							|  |  |  | static Int p_show_statistics_global_trie(USES_REGS1); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #endif /* TABLING */
 | 
					
						
							| 
									
										
										
										
											2011-06-21 15:19:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_yapor_workers(USES_REGS1); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | #ifdef YAPOR
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_parallel_mode(USES_REGS1); | 
					
						
							|  |  |  | static Int p_yapor_start(USES_REGS1); | 
					
						
							|  |  |  | static Int p_worker(USES_REGS1); | 
					
						
							|  |  |  | static Int p_parallel_new_answer(USES_REGS1); | 
					
						
							|  |  |  | static Int p_parallel_get_answers(USES_REGS1); | 
					
						
							|  |  |  | static Int p_show_statistics_or(USES_REGS1); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | #endif /* YAPOR */
 | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | #if defined(YAPOR) && defined(TABLING)
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_show_statistics_opt(USES_REGS1); | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | #endif /* YAPOR && TABLING */
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_get_optyap_statistics(USES_REGS1); | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef YAPOR
 | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | static inline realtime current_time(void); | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | #endif /* YAPOR */
 | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | #ifdef TABLING
 | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  | static inline struct page_statistics show_statistics_table_entries(FILE *out); | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  | #if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
 | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  | static inline struct page_statistics show_statistics_subgoal_entries(FILE *out); | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  | #endif /* THREADS_FULL_SHARING || THREADS_CONSUMER_SHARING */
 | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  | static inline struct page_statistics show_statistics_subgoal_frames(FILE *out); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_dependency_frames(FILE *out); | 
					
						
							|  |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_subgoal_trie_nodes(FILE *out); | 
					
						
							|  |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_subgoal_trie_hashes(FILE *out); | 
					
						
							|  |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_answer_trie_nodes(FILE *out); | 
					
						
							|  |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_answer_trie_hashes(FILE *out); | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  | #if defined(THREADS_FULL_SHARING)
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_answer_ref_nodes(FILE *out); | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  | #endif /* THREADS_FULL_SHARING */
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_global_trie_nodes(FILE *out); | 
					
						
							|  |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_global_trie_hashes(FILE *out); | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | #endif /* TABLING */
 | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | #ifdef YAPOR
 | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  | static inline struct page_statistics show_statistics_or_frames(FILE *out); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_query_goal_solution_frames(FILE *out); | 
					
						
							|  |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_query_goal_answer_frames(FILE *out); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | #endif /* YAPOR */
 | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | #if defined(YAPOR) && defined(TABLING)
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_suspension_frames(FILE *out); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | #ifdef TABLING_INNER_CUTS
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_table_subgoal_solution_frames(FILE *out); | 
					
						
							|  |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_table_subgoal_answer_frames(FILE *out); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | #endif /* TABLING_INNER_CUTS */
 | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | #endif /* YAPOR && TABLING */
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-03 05:58:14 +01:00
										 |  |  | /************************************
 | 
					
						
							|  |  |  | **      Macros & Declarations      ** | 
					
						
							|  |  |  | ************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-07 13:53:20 +00:00
										 |  |  | struct page_statistics { | 
					
						
							|  |  |  | #ifdef USE_PAGES_MALLOC
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   long pages_in_use;   /* same as struct pages (opt.structs.h) */ | 
					
						
							|  |  |  | #endif                 /* USE_PAGES_MALLOC */
 | 
					
						
							|  |  |  |   long structs_in_use; /* same as struct pages (opt.structs.h) */ | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |   long bytes_in_use; | 
					
						
							| 
									
										
										
										
											2011-12-07 13:53:20 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | #define PgEnt_bytes_in_use(STATS) STATS.bytes_in_use
 | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-07 13:53:20 +00:00
										 |  |  | #ifdef USE_PAGES_MALLOC
 | 
					
						
							|  |  |  | #ifdef DEBUG_TABLING
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | #define CHECK_PAGE_FREE_STRUCTS(STR_TYPE, PAGE)                                \
 | 
					
						
							|  |  |  |   {                                                                            \ | 
					
						
							|  |  |  |     pg_hd_ptr pg_hd;                                                           \ | 
					
						
							|  |  |  |     STR_TYPE *aux_ptr;                                                         \ | 
					
						
							|  |  |  |     long cont = 0;                                                             \ | 
					
						
							|  |  |  |     pg_hd = PgEnt_first(PAGE);                                                 \ | 
					
						
							|  |  |  |     while (pg_hd) {                                                            \ | 
					
						
							|  |  |  |       aux_ptr = PgHd_first_str(pg_hd);                                         \ | 
					
						
							|  |  |  |       while (aux_ptr) {                                                        \ | 
					
						
							|  |  |  |         cont++;                                                                \ | 
					
						
							|  |  |  |         aux_ptr = aux_ptr->next;                                               \ | 
					
						
							|  |  |  |       }                                                                        \ | 
					
						
							|  |  |  |       pg_hd = PgHd_next(pg_hd);                                                \ | 
					
						
							|  |  |  |     }                                                                          \ | 
					
						
							|  |  |  |     TABLING_ERROR_CHECKING(CHECK_PAGE_FREE_STRUCTS,                            \ | 
					
						
							|  |  |  |                            PgEnt_strs_free(PAGE) != cont);                     \ | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-12-07 13:53:20 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  | #define CHECK_PAGE_FREE_STRUCTS(STR_TYPE, PAGE)
 | 
					
						
							| 
									
										
										
										
											2011-12-07 13:53:20 +00:00
										 |  |  | #endif /* DEBUG_TABLING */
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | #define INIT_PAGE_STATS(STATS)                                                 \
 | 
					
						
							|  |  |  |   PgEnt_pages_in_use(STATS) = 0;                                               \ | 
					
						
							|  |  |  |   PgEnt_strs_in_use(STATS) = 0 | 
					
						
							|  |  |  | #define INCREMENT_PAGE_STATS(STATS, PAGE)                                      \
 | 
					
						
							|  |  |  |   PgEnt_pages_in_use(STATS) += PgEnt_pages_in_use(PAGE);                       \ | 
					
						
							|  |  |  |   PgEnt_strs_in_use(STATS) += PgEnt_strs_in_use(PAGE) | 
					
						
							|  |  |  | #define INCREMENT_AUX_STATS(STATS, BYTES, PAGES)                               \
 | 
					
						
							|  |  |  |   BYTES += PgEnt_bytes_in_use(STATS);                                          \ | 
					
						
							|  |  |  |   PAGES += PgEnt_pages_in_use(STATS) | 
					
						
							|  |  |  | #define SHOW_PAGE_STATS_MSG(STR_NAME)                                          \
 | 
					
						
							| 
									
										
										
										
											2016-07-31 10:19:11 -05:00
										 |  |  |   "  " STR_NAME "   %10" Int_F " bytes (%ld pages and %ld structs in use)\n" | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | #define SHOW_PAGE_STATS_ARGS(STATS, STR_TYPE)                                  \
 | 
					
						
							|  |  |  |   PgEnt_strs_in_use(STATS) * sizeof(STR_TYPE), PgEnt_pages_in_use(STATS),      \ | 
					
						
							|  |  |  |       PgEnt_strs_in_use(STATS) | 
					
						
							| 
									
										
										
										
											2011-12-07 13:53:20 +00:00
										 |  |  | #else /* !USE_PAGES_MALLOC */
 | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  | #define CHECK_PAGE_FREE_STRUCTS(STR_TYPE, PAGE)
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | #define INIT_PAGE_STATS(STATS) PgEnt_strs_in_use(STATS) = 0
 | 
					
						
							|  |  |  | #define INCREMENT_PAGE_STATS(STATS, PAGE)                                      \
 | 
					
						
							|  |  |  |   PgEnt_strs_in_use(STATS) += PgEnt_strs_in_use(PAGE) | 
					
						
							|  |  |  | #define INCREMENT_AUX_STATS(STATS, BYTES, PAGES)                               \
 | 
					
						
							|  |  |  |   BYTES += PgEnt_bytes_in_use(STATS) | 
					
						
							|  |  |  | #define SHOW_PAGE_STATS_MSG(STR_NAME)                                          \
 | 
					
						
							| 
									
										
										
										
											2016-07-31 10:19:11 -05:00
										 |  |  |   "  %s %10" Int_F "s bytes (%ld structs in use)\n", STR_NAME | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | #define SHOW_PAGE_STATS_ARGS(STATS, STR_TYPE)                                  \
 | 
					
						
							|  |  |  |   PgEnt_strs_in_use(STATS) * sizeof(STR_TYPE), PgEnt_strs_in_use(STATS) | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  | #endif /* USE_PAGES_MALLOC */
 | 
					
						
							| 
									
										
										
										
											2011-12-07 13:53:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-16 16:51:00 +00:00
										 |  |  | #if defined(THREADS) && defined(TABLING)
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | #define GET_ALL_PAGE_STATS(STATS, STR_TYPE, _PAGES)                            \
 | 
					
						
							|  |  |  |   LOCK(GLOBAL_ThreadHandlesLock);                                              \ | 
					
						
							|  |  |  |   CHECK_PAGE_FREE_STRUCTS(STR_TYPE, GLOBAL##_PAGES);                           \ | 
					
						
							|  |  |  |   INCREMENT_PAGE_STATS(STATS, GLOBAL##_PAGES);                                 \ | 
					
						
							|  |  |  |   {                                                                            \ | 
					
						
							|  |  |  |     int wid;                                                                   \ | 
					
						
							|  |  |  |     for (wid = 0; wid < MAX_THREADS; wid++) {                                  \ | 
					
						
							|  |  |  |       if (!Yap_local[wid])                                                     \ | 
					
						
							|  |  |  |         break;                                                                 \ | 
					
						
							|  |  |  |       if (REMOTE_ThreadHandle(wid).in_use) {                                   \ | 
					
						
							|  |  |  |         CHECK_PAGE_FREE_STRUCTS(STR_TYPE, REMOTE##_PAGES(wid));                \ | 
					
						
							|  |  |  |         INCREMENT_PAGE_STATS(STATS, REMOTE##_PAGES(wid));                      \ | 
					
						
							|  |  |  |       }                                                                        \ | 
					
						
							|  |  |  |     }                                                                          \ | 
					
						
							|  |  |  |   }                                                                            \ | 
					
						
							|  |  |  |   UNLOCK(GLOBAL_ThreadHandlesLock) | 
					
						
							| 
									
										
										
										
											2012-05-14 19:11:58 +01:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | #define GET_ALL_PAGE_STATS(STATS, STR_TYPE, _PAGES)                            \
 | 
					
						
							|  |  |  |   CHECK_PAGE_FREE_STRUCTS(STR_TYPE, GLOBAL##_PAGES);                           \ | 
					
						
							|  |  |  |   INCREMENT_PAGE_STATS(STATS, GLOBAL##_PAGES) | 
					
						
							| 
									
										
										
										
											2012-05-14 19:11:58 +01:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | #define GET_PAGE_STATS(STATS, STR_TYPE, _PAGES)                                \
 | 
					
						
							|  |  |  |   INIT_PAGE_STATS(STATS);                                                      \ | 
					
						
							|  |  |  |   GET_ALL_PAGE_STATS(STATS, STR_TYPE, _PAGES);                                 \ | 
					
						
							|  |  |  |   PgEnt_bytes_in_use(STATS) = PgEnt_strs_in_use(STATS) * sizeof(STR_TYPE) | 
					
						
							|  |  |  | #define SHOW_PAGE_STATS(OUT_STREAM, STR_TYPE, _PAGES, STR_NAME)                \
 | 
					
						
							|  |  |  |   {                                                                            \ | 
					
						
							|  |  |  |     struct page_statistics stats;                                              \ | 
					
						
							|  |  |  |     GET_PAGE_STATS(stats, STR_TYPE, _PAGES);                                   \ | 
					
						
							|  |  |  |     fprintf(OUT_STREAM, SHOW_PAGE_STATS_MSG(STR_NAME),                         \ | 
					
						
							|  |  |  |             SHOW_PAGE_STATS_ARGS(stats, STR_TYPE));                            \ | 
					
						
							|  |  |  |     return stats;                                                              \ | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-04-03 05:58:14 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*******************************
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | **      Global functions      ** | 
					
						
							| 
									
										
										
										
											2010-04-03 05:58:14 +01:00
										 |  |  | *******************************/ | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-26 22:19:48 +00:00
										 |  |  | void Yap_init_optyap_preds(void) { | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   Yap_InitCPred("$c_yapor_workers", 1, p_yapor_workers, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #ifdef TABLING
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   Yap_InitCPred("freeze_choice_point", 1, p_freeze_choice_point, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("wake_choice_point", 1, p_wake_choice_point, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("abolish_frozen_choice_points", 1, | 
					
						
							|  |  |  |                 p_abolish_frozen_choice_points_until, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("abolish_frozen_choice_points", 0, | 
					
						
							|  |  |  |                 p_abolish_frozen_choice_points_all, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$c_table", 3, p_table, SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$c_tabling_mode", 3, p_tabling_mode, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$c_abolish_table", 2, p_abolish_table, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("abolish_all_tables", 0, p_abolish_all_tables, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   /** @pred abolish_all_tables/0
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Removes all the entries from the table space for all tabled | 
					
						
							|  |  |  |   predicates. The predicates remain as tabled predicates. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   */ | 
					
						
							|  |  |  |   Yap_InitCPred("show_tabled_predicates", 1, p_show_tabled_predicates, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$c_show_table", 3, p_show_table, SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("show_all_tables", 1, p_show_all_tables, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("show_global_trie", 1, p_show_global_trie, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$c_table_statistics", 3, p_show_statistics_table, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("tabling_statistics", 1, p_show_statistics_tabling, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("global_trie_statistics", 1, p_show_statistics_global_trie, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #endif /* TABLING */
 | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | #ifdef YAPOR
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   Yap_InitCPred("parallel_mode", 1, p_parallel_mode, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$c_yapor_start", 0, p_yapor_start, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$c_worker", 0, p_worker, SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$c_parallel_new_answer", 1, p_parallel_new_answer, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$c_parallel_get_answers", 1, p_parallel_get_answers, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("or_statistics", 1, p_show_statistics_or, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | #endif /* YAPOR */
 | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | #if defined(YAPOR) && defined(TABLING)
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   Yap_InitCPred("opt_statistics", 1, p_show_statistics_opt, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | #endif /* YAPOR && TABLING */
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   Yap_InitCPred("$c_get_optyap_statistics", 3, p_get_optyap_statistics, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef YAPOR
 | 
					
						
							|  |  |  | void finish_yapor(void) { | 
					
						
							| 
									
										
										
										
											2011-05-10 11:47:18 +01:00
										 |  |  |   GLOBAL_execution_time = current_time() - GLOBAL_execution_time; | 
					
						
							| 
									
										
										
										
											2011-06-21 15:19:07 +01:00
										 |  |  |   GLOBAL_parallel_mode = PARALLEL_MODE_ON; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   return; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif /* YAPOR */
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | /***********************************
 | 
					
						
							|  |  |  | **      Tabling C Predicates      ** | 
					
						
							|  |  |  | ***********************************/ | 
					
						
							| 
									
										
										
										
											2010-01-14 15:58:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | #ifdef TABLING
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_freeze_choice_point(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2010-05-18 17:34:52 +01:00
										 |  |  |   if (IsVarTerm(Deref(ARG1))) { | 
					
						
							|  |  |  |     Int offset = freeze_current_cp(); | 
					
						
							|  |  |  |     return Yap_unify(ARG1, MkIntegerTerm(offset)); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   } | 
					
						
							|  |  |  |   return (FALSE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_wake_choice_point(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2010-05-18 17:34:52 +01:00
										 |  |  |   Term term_offset = Deref(ARG1); | 
					
						
							|  |  |  |   if (IsIntegerTerm(term_offset)) | 
					
						
							|  |  |  |     wake_frozen_cp(IntegerOfTerm(term_offset)); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   return (FALSE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_abolish_frozen_choice_points_until(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2010-05-18 17:34:52 +01:00
										 |  |  |   Term term_offset = Deref(ARG1); | 
					
						
							|  |  |  |   if (IsIntegerTerm(term_offset)) | 
					
						
							|  |  |  |     abolish_frozen_cps_until(IntegerOfTerm(term_offset)); | 
					
						
							|  |  |  |   return (TRUE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_abolish_frozen_choice_points_all(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2010-05-18 17:34:52 +01:00
										 |  |  |   abolish_frozen_cps_all(); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   return (TRUE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_table(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2011-11-09 11:00:31 +00:00
										 |  |  |   Term mod, t, list; | 
					
						
							| 
									
										
										
										
											2003-11-05 16:12:25 +00:00
										 |  |  |   PredEntry *pe; | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   Atom at; | 
					
						
							|  |  |  |   int arity; | 
					
						
							|  |  |  |   tab_ent_ptr tab_ent; | 
					
						
							| 
									
										
										
										
											2011-11-09 11:00:31 +00:00
										 |  |  | #ifdef MODE_DIRECTED_TABLING
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   int *mode_directed = NULL; | 
					
						
							| 
									
										
										
										
											2011-11-09 11:00:31 +00:00
										 |  |  | #endif /* MODE_DIRECTED_TABLING */
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   mod = Deref(ARG1); | 
					
						
							|  |  |  |   t = Deref(ARG2); | 
					
						
							| 
									
										
										
										
											2011-11-09 11:00:31 +00:00
										 |  |  |   list = Deref(ARG3); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (IsAtomTerm(t)) { | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |     at = AtomOfTerm(t); | 
					
						
							| 
									
										
										
										
											2001-11-15 00:01:43 +00:00
										 |  |  |     pe = RepPredProp(PredPropByAtom(at, mod)); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |     arity = 0; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } else if (IsApplTerm(t)) { | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |     at = NameOfFunctor(FunctorOfTerm(t)); | 
					
						
							|  |  |  |     pe = RepPredProp(PredPropByFunc(FunctorOfTerm(t), mod)); | 
					
						
							|  |  |  |     arity = ArityOfFunctor(FunctorOfTerm(t)); | 
					
						
							|  |  |  |   } else | 
					
						
							|  |  |  |     return (FALSE); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   if (list != TermNil) { /* non-empty list */ | 
					
						
							| 
									
										
										
										
											2011-11-09 11:00:31 +00:00
										 |  |  | #ifndef MODE_DIRECTED_TABLING
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     Yap_Error(SYSTEM_ERROR_COMPILER, TermNil, "invalid tabling declaration for " | 
					
						
							|  |  |  |                                               "%s/%d (mode directed tabling " | 
					
						
							|  |  |  |                                               "not enabled)", | 
					
						
							|  |  |  |               AtomName(at), arity); | 
					
						
							|  |  |  |     return (FALSE); | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2012-06-04 19:27:31 +01:00
										 |  |  |     /*************************************************************************************
 | 
					
						
							|  |  |  |       The mode operator declaration is reordered as follows: | 
					
						
							|  |  |  |          1. arguments with mode 'index'         (any number) | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |          2. arguments with mode 'min' and 'max' (any number, following the | 
					
						
							|  |  |  |     original order) | 
					
						
							| 
									
										
										
										
											2012-06-04 19:27:31 +01:00
										 |  |  |          3. arguments with mode 'all'           (any number) | 
					
						
							|  |  |  |          4. arguments with mode 'sum' or 'last' (only one of the two is allowed) | 
					
						
							|  |  |  |          5. arguments with mode 'first'         (any number) | 
					
						
							|  |  |  |     *************************************************************************************/ | 
					
						
							| 
									
										
										
										
											2011-11-09 11:00:31 +00:00
										 |  |  |     int pos_index = 0; | 
					
						
							| 
									
										
										
										
											2012-06-04 19:27:31 +01:00
										 |  |  |     int pos_min_max = 0; | 
					
						
							| 
									
										
										
										
											2011-11-09 11:00:31 +00:00
										 |  |  |     int pos_all = 0; | 
					
						
							| 
									
										
										
										
											2012-06-04 19:27:31 +01:00
										 |  |  |     int pos_sum_last = 0; | 
					
						
							|  |  |  |     int pos_first = 0; | 
					
						
							| 
									
										
										
										
											2011-11-09 11:00:31 +00:00
										 |  |  |     int i; | 
					
						
							|  |  |  |     int *aux_mode_directed; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     aux_mode_directed = malloc(arity * sizeof(int)); | 
					
						
							|  |  |  |     for (i = 0; i < arity; i++) { | 
					
						
							|  |  |  |       int mode = IntOfTerm(HeadOfTerm(list)); | 
					
						
							|  |  |  |       if (mode == MODE_DIRECTED_INDEX) | 
					
						
							| 
									
										
										
										
											2013-12-20 14:56:13 +00:00
										 |  |  |         pos_index++; | 
					
						
							| 
									
										
										
										
											2012-06-04 19:27:31 +01:00
										 |  |  |       else if (mode == MODE_DIRECTED_MIN || mode == MODE_DIRECTED_MAX) | 
					
						
							| 
									
										
										
										
											2013-12-20 14:56:13 +00:00
										 |  |  |         pos_min_max++; | 
					
						
							| 
									
										
										
										
											2011-11-09 11:00:31 +00:00
										 |  |  |       else if (mode == MODE_DIRECTED_ALL) | 
					
						
							| 
									
										
										
										
											2013-12-20 14:56:13 +00:00
										 |  |  |         pos_all++; | 
					
						
							| 
									
										
										
										
											2012-06-04 19:27:31 +01:00
										 |  |  |       else if (mode == MODE_DIRECTED_SUM || mode == MODE_DIRECTED_LAST) { | 
					
						
							| 
									
										
										
										
											2013-12-20 14:56:13 +00:00
										 |  |  |         if (pos_sum_last) { | 
					
						
							|  |  |  |           free(aux_mode_directed); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |           Yap_Error(SYSTEM_ERROR_COMPILER, TermNil, | 
					
						
							|  |  |  |                     "invalid tabling declaration for %s/%d (more than one " | 
					
						
							|  |  |  |                     "argument with modes 'sum' and/or 'last')", | 
					
						
							|  |  |  |                     AtomName(at), arity); | 
					
						
							|  |  |  |           return (FALSE); | 
					
						
							| 
									
										
										
										
											2013-12-20 14:56:13 +00:00
										 |  |  |         } else | 
					
						
							|  |  |  |           pos_sum_last = 1; | 
					
						
							| 
									
										
										
										
											2012-06-04 19:27:31 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2011-11-09 11:00:31 +00:00
										 |  |  |       aux_mode_directed[i] = mode; | 
					
						
							|  |  |  |       list = TailOfTerm(list); | 
					
						
							| 
									
										
										
										
											2012-06-04 19:27:31 +01:00
										 |  |  |     } | 
					
						
							|  |  |  |     pos_first = pos_index + pos_min_max + pos_all + pos_sum_last; | 
					
						
							|  |  |  |     pos_sum_last = pos_index + pos_min_max + pos_all; | 
					
						
							|  |  |  |     pos_all = pos_index + pos_min_max; | 
					
						
							|  |  |  |     pos_min_max = pos_index; | 
					
						
							| 
									
										
										
										
											2011-11-09 11:00:31 +00:00
										 |  |  |     pos_index = 0; | 
					
						
							| 
									
										
										
										
											2012-06-04 19:27:31 +01:00
										 |  |  |     ALLOC_BLOCK(mode_directed, arity * sizeof(int), int); | 
					
						
							| 
									
										
										
										
											2011-11-09 11:00:31 +00:00
										 |  |  |     for (i = 0; i < arity; i++) { | 
					
						
							| 
									
										
										
										
											2011-11-15 16:57:51 +00:00
										 |  |  |       int aux_pos = 0; | 
					
						
							| 
									
										
										
										
											2012-06-04 19:27:31 +01:00
										 |  |  |       if (aux_mode_directed[i] == MODE_DIRECTED_INDEX) | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |         aux_pos = pos_index++; | 
					
						
							|  |  |  |       else if (aux_mode_directed[i] == MODE_DIRECTED_MIN || | 
					
						
							|  |  |  |                aux_mode_directed[i] == MODE_DIRECTED_MAX) | 
					
						
							| 
									
										
										
										
											2013-12-20 14:56:13 +00:00
										 |  |  |         aux_pos = pos_min_max++; | 
					
						
							| 
									
										
										
										
											2011-11-09 11:00:31 +00:00
										 |  |  |       else if (aux_mode_directed[i] == MODE_DIRECTED_ALL) | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |         aux_pos = pos_all++; | 
					
						
							|  |  |  |       else if (aux_mode_directed[i] == MODE_DIRECTED_SUM || | 
					
						
							|  |  |  |                aux_mode_directed[i] == MODE_DIRECTED_LAST) | 
					
						
							|  |  |  |         aux_pos = pos_sum_last++; | 
					
						
							|  |  |  |       else if (aux_mode_directed[i] == MODE_DIRECTED_FIRST) | 
					
						
							| 
									
										
										
										
											2013-12-20 14:56:13 +00:00
										 |  |  |         aux_pos = pos_first++; | 
					
						
							| 
									
										
										
										
											2011-11-09 11:00:31 +00:00
										 |  |  |       mode_directed[aux_pos] = MODE_DIRECTED_SET(i, aux_mode_directed[i]); | 
					
						
							| 
									
										
										
										
											2011-10-22 16:49:13 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-11-09 11:00:31 +00:00
										 |  |  |     free(aux_mode_directed); | 
					
						
							| 
									
										
										
										
											2011-11-09 15:13:22 +00:00
										 |  |  | #endif /* MODE_DIRECTED_TABLING */
 | 
					
						
							| 
									
										
										
										
											2011-10-22 16:49:13 +01:00
										 |  |  |   } | 
					
						
							|  |  |  |   if (pe->PredFlags & TabledPredFlag) | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     return (TRUE); /* predicate already tabled */ | 
					
						
							| 
									
										
										
										
											2011-10-22 16:49:13 +01:00
										 |  |  |   if (pe->cs.p_code.FirstClause) | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     return (FALSE); /* predicate already compiled */ | 
					
						
							| 
									
										
										
										
											2015-08-07 16:57:53 -05:00
										 |  |  |   if (!(pe->PredFlags & TabledPredFlag)) { | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     pe->PredFlags |= TabledPredFlag; | 
					
						
							|  |  |  |     new_table_entry(tab_ent, pe, at, arity, mode_directed); | 
					
						
							|  |  |  |     pe->TableOfPred = tab_ent; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-10-22 16:49:13 +01:00
										 |  |  |   return (TRUE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_tabling_mode(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   Term mod, t, tvalue; | 
					
						
							|  |  |  |   tab_ent_ptr tab_ent; | 
					
						
							| 
									
										
										
										
											2003-11-05 16:12:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   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); | 
					
						
							| 
									
										
										
										
											2013-12-20 14:56:13 +00:00
										 |  |  |     if (IsMode_CoInductive(TabEnt_flags(tab_ent))) | 
					
						
							|  |  |  |       t = MkPairTerm(MkAtomTerm(AtomCoInductive), t); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |     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); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     YapBind((CELL *)tvalue, t); | 
					
						
							|  |  |  |     return (TRUE); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   } else if (IsIntTerm(tvalue)) { | 
					
						
							|  |  |  |     Int value = IntOfTerm(tvalue); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     if (value == 1) { /* batched */ | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |       SetMode_Batched(TabEnt_flags(tab_ent)); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |       if (!IsMode_Local(LOCAL_TabMode)) { | 
					
						
							| 
									
										
										
										
											2013-12-20 14:56:13 +00:00
										 |  |  |         SetMode_Batched(TabEnt_mode(tab_ent)); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |         return (TRUE); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     } else if (value == 2) { /* local */ | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |       SetMode_Local(TabEnt_flags(tab_ent)); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |       if (!IsMode_Batched(LOCAL_TabMode)) { | 
					
						
							| 
									
										
										
										
											2013-12-20 14:56:13 +00:00
										 |  |  |         SetMode_Local(TabEnt_mode(tab_ent)); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |         return (TRUE); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     } else if (value == 3) { /* exec_answers */ | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |       SetMode_ExecAnswers(TabEnt_flags(tab_ent)); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |       if (!IsMode_LoadAnswers(LOCAL_TabMode)) { | 
					
						
							| 
									
										
										
										
											2013-12-20 14:56:13 +00:00
										 |  |  |         SetMode_ExecAnswers(TabEnt_mode(tab_ent)); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |         return (TRUE); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     } else if (value == 4) { /* load_answers */ | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |       SetMode_LoadAnswers(TabEnt_flags(tab_ent)); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |       if (!IsMode_ExecAnswers(LOCAL_TabMode)) { | 
					
						
							| 
									
										
										
										
											2013-12-20 14:56:13 +00:00
										 |  |  |         SetMode_LoadAnswers(TabEnt_mode(tab_ent)); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |         return (TRUE); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     } else if (value == 5) { /* local_trie */ | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |       SetMode_LocalTrie(TabEnt_flags(tab_ent)); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |       if (!IsMode_GlobalTrie(LOCAL_TabMode)) { | 
					
						
							| 
									
										
										
										
											2013-12-20 14:56:13 +00:00
										 |  |  |         SetMode_LocalTrie(TabEnt_mode(tab_ent)); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |         return (TRUE); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     } else if (value == 6) { /* global_trie */ | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |       SetMode_GlobalTrie(TabEnt_flags(tab_ent)); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |       if (!IsMode_LocalTrie(LOCAL_TabMode)) { | 
					
						
							| 
									
										
										
										
											2013-12-20 14:56:13 +00:00
										 |  |  |         SetMode_GlobalTrie(TabEnt_mode(tab_ent)); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |         return (TRUE); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     } else if (value == 7) { | 
					
						
							|  |  |  |       /* coinductive */ // only affect the predicate flag. Also it cant be unset
 | 
					
						
							| 
									
										
										
										
											2013-12-20 14:56:13 +00:00
										 |  |  |       SetMode_CoInductive(TabEnt_flags(tab_ent)); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |       return (TRUE); | 
					
						
							| 
									
										
										
										
											2013-12-20 14:56:13 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   return (FALSE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_abolish_table(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   Term mod, t; | 
					
						
							|  |  |  |   tab_ent_ptr tab_ent; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   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); | 
					
						
							| 
									
										
										
										
											2011-12-22 16:50:20 +00:00
										 |  |  |   abolish_table(tab_ent); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   return (TRUE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_abolish_all_tables(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   tab_ent_ptr tab_ent; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-10 11:47:18 +01:00
										 |  |  |   tab_ent = GLOBAL_root_tab_ent; | 
					
						
							| 
									
										
										
										
											2011-12-05 16:54:22 +00:00
										 |  |  |   while (tab_ent) { | 
					
						
							| 
									
										
										
										
											2011-12-22 16:50:20 +00:00
										 |  |  |     abolish_table(tab_ent); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |     tab_ent = TabEnt_next(tab_ent); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return (TRUE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_show_tabled_predicates(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   FILE *out; | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   tab_ent_ptr tab_ent; | 
					
						
							| 
									
										
										
										
											2012-02-18 11:01:06 +00:00
										 |  |  |   Term t = Deref(ARG1); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   if (!IsStreamTerm(t)) | 
					
						
							| 
									
										
										
										
											2012-02-18 11:01:06 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   if (!(out = Yap_GetStreamHandle(t)->file)) | 
					
						
							| 
									
										
										
										
											2012-02-18 11:01:06 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2011-05-10 11:47:18 +01:00
										 |  |  |   tab_ent = GLOBAL_root_tab_ent; | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   fprintf(out, "Tabled predicates\n"); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   if (tab_ent == NULL) | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |     fprintf(out, "  NONE\n"); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   else | 
					
						
							|  |  |  |     while (tab_ent) { | 
					
						
							|  |  |  |       fprintf(out, "  %s/%d\n", AtomName(TabEnt_atom(tab_ent)), | 
					
						
							|  |  |  |               TabEnt_arity(tab_ent)); | 
					
						
							|  |  |  |       tab_ent = TabEnt_next(tab_ent); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   // PL_release_stream(out);
 | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   return (TRUE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_show_table(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   Term mod, t; | 
					
						
							|  |  |  |   tab_ent_ptr tab_ent; | 
					
						
							| 
									
										
										
										
											2012-02-18 11:01:06 +00:00
										 |  |  |   Term t1 = Deref(ARG1); | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   FILE *out; | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   if (!IsStreamTerm(t1)) | 
					
						
							| 
									
										
										
										
											2012-02-18 11:01:06 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   if (!(out = Yap_GetStreamHandle(t1)->file)) | 
					
						
							| 
									
										
										
										
											2012-02-18 11:01:06 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2011-05-25 18:38:46 +01:00
										 |  |  |   mod = Deref(ARG2); | 
					
						
							|  |  |  |   t = Deref(ARG3); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   if (IsAtomTerm(t)) | 
					
						
							|  |  |  |     tab_ent = RepPredProp(PredPropByAtom(AtomOfTerm(t), mod))->TableOfPred; | 
					
						
							|  |  |  |   else if (IsApplTerm(t)) | 
					
						
							|  |  |  |     tab_ent = RepPredProp(PredPropByFunc(FunctorOfTerm(t), mod))->TableOfPred; | 
					
						
							| 
									
										
										
										
											2011-07-26 15:26:01 +01:00
										 |  |  |   else { | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |     return (FALSE); | 
					
						
							| 
									
										
										
										
											2011-07-26 15:26:01 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   showTable(tab_ent, SHOW_MODE_STRUCTURE, out); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   return (TRUE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_show_all_tables(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   tab_ent_ptr tab_ent; | 
					
						
							| 
									
										
										
										
											2012-02-18 11:01:06 +00:00
										 |  |  |   Term t = Deref(ARG1); | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   FILE *out; | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   if (!IsStreamTerm(t)) | 
					
						
							| 
									
										
										
										
											2012-02-18 11:01:06 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   if (!(out = Yap_GetStreamHandle(t)->file)) | 
					
						
							| 
									
										
										
										
											2012-02-18 11:01:06 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2011-05-10 11:47:18 +01:00
										 |  |  |   tab_ent = GLOBAL_root_tab_ent; | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   while (tab_ent) { | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |     showTable(tab_ent, SHOW_MODE_STRUCTURE, out); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |     tab_ent = TabEnt_next(tab_ent); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return (TRUE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_show_global_trie(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2012-02-18 11:01:06 +00:00
										 |  |  |   Term t = Deref(ARG1); | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   FILE *out; | 
					
						
							| 
									
										
										
										
											2011-05-25 18:38:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   if (!IsStreamTerm(t)) | 
					
						
							| 
									
										
										
										
											2012-02-18 11:01:06 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   if (!(out = Yap_GetStreamHandle(t)->file)) | 
					
						
							| 
									
										
										
										
											2012-02-18 11:01:06 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   showGlobalTrie(SHOW_MODE_STRUCTURE, out); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   return (TRUE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_show_statistics_table(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   Term mod, t; | 
					
						
							|  |  |  |   tab_ent_ptr tab_ent; | 
					
						
							| 
									
										
										
										
											2012-02-18 11:01:06 +00:00
										 |  |  |   Term t1 = Deref(ARG1); | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   FILE *out; | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   if (!IsStreamTerm(t1)) | 
					
						
							| 
									
										
										
										
											2012-02-18 11:01:06 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   if (!(out = Yap_GetStreamHandle(t1)->file)) | 
					
						
							| 
									
										
										
										
											2012-02-18 11:01:06 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   mod = Deref(ARG2); | 
					
						
							| 
									
										
										
										
											2011-05-25 18:38:46 +01:00
										 |  |  |   t = Deref(ARG3); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   if (IsAtomTerm(t)) | 
					
						
							|  |  |  |     tab_ent = RepPredProp(PredPropByAtom(AtomOfTerm(t), mod))->TableOfPred; | 
					
						
							|  |  |  |   else if (IsApplTerm(t)) | 
					
						
							|  |  |  |     tab_ent = RepPredProp(PredPropByFunc(FunctorOfTerm(t), mod))->TableOfPred; | 
					
						
							| 
									
										
										
										
											2011-07-26 15:26:01 +01:00
										 |  |  |   else { | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     // PL_release_stream(out);
 | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |     return (FALSE); | 
					
						
							| 
									
										
										
										
											2011-07-26 15:26:01 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   showTable(tab_ent, SHOW_MODE_STATISTICS, out); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   return (TRUE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_show_statistics_tabling(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |   struct page_statistics stats; | 
					
						
							|  |  |  |   long bytes, total_bytes = 0; | 
					
						
							|  |  |  | #ifdef USE_PAGES_MALLOC
 | 
					
						
							|  |  |  |   long total_pages = 0; | 
					
						
							|  |  |  | #endif /* USE_PAGES_MALLOC */
 | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   FILE *out; | 
					
						
							| 
									
										
										
										
											2012-02-18 11:01:06 +00:00
										 |  |  |   Term t = Deref(ARG1); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   if (!IsStreamTerm(t)) | 
					
						
							| 
									
										
										
										
											2012-02-18 11:01:06 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   if (!(out = Yap_GetStreamHandle(t)->file)) | 
					
						
							| 
									
										
										
										
											2012-02-18 11:01:06 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |   bytes = 0; | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   fprintf(out, "Execution data structures\n"); | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |   stats = show_statistics_table_entries(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							|  |  |  | #if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
 | 
					
						
							|  |  |  |   stats = show_statistics_subgoal_entries(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							|  |  |  | #endif /* THREADS_FULL_SHARING || THREADS_CONSUMER_SHARING */
 | 
					
						
							|  |  |  |   stats = show_statistics_subgoal_frames(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							|  |  |  |   stats = show_statistics_dependency_frames(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   fprintf(out, "  Memory in use (I):               %10ld bytes\n\n", bytes); | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |   total_bytes += bytes; | 
					
						
							|  |  |  |   bytes = 0; | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   fprintf(out, "Local trie data structures\n"); | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |   stats = show_statistics_subgoal_trie_nodes(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							|  |  |  |   stats = show_statistics_answer_trie_nodes(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							|  |  |  |   stats = show_statistics_subgoal_trie_hashes(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							|  |  |  |   stats = show_statistics_answer_trie_hashes(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							|  |  |  | #if defined(THREADS_FULL_SHARING)
 | 
					
						
							|  |  |  |   stats = show_statistics_answer_ref_nodes(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							|  |  |  | #endif /* THREADS_FULL_SHARING */
 | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   fprintf(out, "  Memory in use (II):              %10ld bytes\n\n", bytes); | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |   total_bytes += bytes; | 
					
						
							|  |  |  |   bytes = 0; | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   fprintf(out, "Global trie data structures\n"); | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |   stats = show_statistics_global_trie_nodes(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							|  |  |  |   stats = show_statistics_global_trie_hashes(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   fprintf(out, "  Memory in use (III):             %10ld bytes\n\n", bytes); | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |   total_bytes += bytes; | 
					
						
							| 
									
										
										
										
											2011-04-28 09:48:42 +01:00
										 |  |  | #ifdef USE_PAGES_MALLOC
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   fprintf(out, | 
					
						
							|  |  |  |           "Total memory in use (I+II+III):    %10ld bytes (%ld pages in use)\n", | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |           total_bytes, total_pages); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   fprintf( | 
					
						
							|  |  |  |       out, | 
					
						
							|  |  |  |       "Total memory allocated:            %10ld bytes (%ld pages in total)\n", | 
					
						
							|  |  |  |       PgEnt_pages_in_use(GLOBAL_pages_alloc) * Yap_page_size, | 
					
						
							|  |  |  |       PgEnt_pages_in_use(GLOBAL_pages_alloc)); | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   fprintf(out, "Total memory in use (I+II+III):    %10ld bytes\n", total_bytes); | 
					
						
							| 
									
										
										
										
											2011-04-28 09:48:42 +01:00
										 |  |  | #endif /* USE_PAGES_MALLOC */
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   // PL_release_stream(out);
 | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   return (TRUE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_show_statistics_global_trie(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2012-02-18 11:01:06 +00:00
										 |  |  |   Term t = Deref(ARG1); | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   FILE *out; | 
					
						
							| 
									
										
										
										
											2011-05-25 18:38:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   if (!IsStreamTerm(t)) | 
					
						
							| 
									
										
										
										
											2012-02-18 11:01:06 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   if (!(out = Yap_GetStreamHandle(t)->file)) | 
					
						
							| 
									
										
										
										
											2012-02-18 11:01:06 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   showGlobalTrie(SHOW_MODE_STATISTICS, out); | 
					
						
							| 
									
										
										
										
											2010-04-23 04:22:10 +01:00
										 |  |  |   return (TRUE); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2010-07-28 00:30:02 +01:00
										 |  |  | #endif /* TABLING */
 | 
					
						
							| 
									
										
										
										
											2010-04-23 04:22:10 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | /*********************************
 | 
					
						
							|  |  |  | **      YapOr C Predicates      ** | 
					
						
							|  |  |  | *********************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef YAPOR
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_parallel_mode(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   Term t; | 
					
						
							|  |  |  |   t = Deref(ARG1); | 
					
						
							|  |  |  |   if (IsVarTerm(t)) { | 
					
						
							|  |  |  |     Term ta; | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     if (GLOBAL_parallel_mode == PARALLEL_MODE_OFF) | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |       ta = MkAtomTerm(Yap_LookupAtom("off")); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     else if (GLOBAL_parallel_mode == PARALLEL_MODE_ON) | 
					
						
							| 
									
										
										
										
											2011-06-21 15:19:07 +01:00
										 |  |  |       ta = MkAtomTerm(Yap_LookupAtom("on")); | 
					
						
							|  |  |  |     else /* PARALLEL_MODE_RUNNING */ | 
					
						
							|  |  |  |       ta = MkAtomTerm(Yap_LookupAtom("running")); | 
					
						
							| 
									
										
										
										
											2014-05-29 11:32:28 +02:00
										 |  |  |     YapBind((CELL *)t, ta); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     return (TRUE); | 
					
						
							| 
									
										
										
										
											2011-06-21 15:19:07 +01:00
										 |  |  |   } | 
					
						
							|  |  |  |   if (IsAtomTerm(t) && GLOBAL_parallel_mode != PARALLEL_MODE_RUNNING) { | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |     char *s; | 
					
						
							|  |  |  |     s = RepAtom(AtomOfTerm(t))->StrOfAE; | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     if (strcmp(s, "on") == 0) { | 
					
						
							| 
									
										
										
										
											2011-06-21 15:19:07 +01:00
										 |  |  |       GLOBAL_parallel_mode = PARALLEL_MODE_ON; | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |       return (TRUE); | 
					
						
							| 
									
										
										
										
											2011-06-21 15:19:07 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     if (strcmp(s, "off") == 0) { | 
					
						
							| 
									
										
										
										
											2011-06-21 15:19:07 +01:00
										 |  |  |       GLOBAL_parallel_mode = PARALLEL_MODE_OFF; | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |       return (TRUE); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     return (FALSE); /* PARALLEL_MODE_RUNNING */ | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   return (FALSE); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_yapor_start(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2011-06-21 15:19:07 +01:00
										 |  |  | #ifdef TIMESTAMP_CHECK
 | 
					
						
							|  |  |  |   GLOBAL_timestamp = 0; | 
					
						
							|  |  |  | #endif /* TIMESTAMP_CHECK */
 | 
					
						
							|  |  |  |   BITMAP_delete(GLOBAL_bm_idle_workers, 0); | 
					
						
							|  |  |  |   BITMAP_clear(GLOBAL_bm_invisible_workers); | 
					
						
							|  |  |  |   BITMAP_clear(GLOBAL_bm_requestable_workers); | 
					
						
							|  |  |  | #ifdef TABLING_INNER_CUTS
 | 
					
						
							|  |  |  |   BITMAP_clear(GLOBAL_bm_pruning_workers); | 
					
						
							|  |  |  | #endif /* TABLING_INNER_CUTS */
 | 
					
						
							|  |  |  |   make_root_choice_point(); | 
					
						
							|  |  |  |   GLOBAL_parallel_mode = PARALLEL_MODE_RUNNING; | 
					
						
							|  |  |  |   GLOBAL_execution_time = current_time(); | 
					
						
							|  |  |  |   BITMAP_clear(GLOBAL_bm_finished_workers); | 
					
						
							|  |  |  |   return (TRUE); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_yapor_workers(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2011-06-21 15:19:07 +01:00
										 |  |  | #ifdef YAPOR_THREADS
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   return Yap_unify(MkIntegerTerm(GLOBAL_number_workers), ARG1); | 
					
						
							| 
									
										
										
										
											2011-06-21 15:19:07 +01:00
										 |  |  | #else
 | 
					
						
							|  |  |  |   return FALSE; | 
					
						
							| 
									
										
										
										
											2011-07-26 15:26:01 +01:00
										 |  |  | #endif /* YAPOR_THREADS */
 | 
					
						
							| 
									
										
										
										
											2011-06-21 15:19:07 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_worker(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2011-06-21 15:19:07 +01:00
										 |  |  |   CurrentModule = USER_MODULE; | 
					
						
							|  |  |  |   P = GETWORK_FIRST_TIME; | 
					
						
							|  |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_parallel_new_answer(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2012-01-05 16:04:32 +00:00
										 |  |  |   qg_ans_fr_ptr actual_answer; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   or_fr_ptr leftmost_or_fr; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ALLOC_QG_ANSWER_FRAME(actual_answer); | 
					
						
							| 
									
										
										
										
											2012-01-05 16:04:32 +00:00
										 |  |  |   AnsFr_answer(actual_answer) = Deref(ARG1); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   AnsFr_next(actual_answer) = NULL; | 
					
						
							|  |  |  |   leftmost_or_fr = CUT_leftmost_or_frame(); | 
					
						
							|  |  |  |   LOCK_OR_FRAME(leftmost_or_fr); | 
					
						
							| 
									
										
										
										
											2010-01-27 11:01:28 +00:00
										 |  |  |   if (Get_LOCAL_prune_request()) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     UNLOCK_OR_FRAME(leftmost_or_fr); | 
					
						
							|  |  |  |     FREE_QG_ANSWER_FRAME(actual_answer); | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     CUT_store_answer(leftmost_or_fr, actual_answer); | 
					
						
							|  |  |  |     UNLOCK_OR_FRAME(leftmost_or_fr); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return (TRUE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_parallel_get_answers(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2012-01-05 16:04:32 +00:00
										 |  |  |   Term t = TermNil; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (OrFr_qg_solutions(LOCAL_top_or_fr)) { | 
					
						
							|  |  |  |     qg_ans_fr_ptr aux_answer1, aux_answer2; | 
					
						
							|  |  |  |     aux_answer1 = SolFr_first(OrFr_qg_solutions(LOCAL_top_or_fr)); | 
					
						
							|  |  |  |     while (aux_answer1) { | 
					
						
							|  |  |  |       t = MkPairTerm(AnsFr_answer(aux_answer1), t); | 
					
						
							|  |  |  |       aux_answer2 = aux_answer1; | 
					
						
							|  |  |  |       aux_answer1 = AnsFr_next(aux_answer1); | 
					
						
							|  |  |  |       FREE_QG_ANSWER_FRAME(aux_answer2); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     FREE_QG_SOLUTION_FRAME(OrFr_qg_solutions(LOCAL_top_or_fr)); | 
					
						
							|  |  |  |     OrFr_qg_solutions(LOCAL_top_or_fr) = NULL; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   Yap_unify(ARG1, t); | 
					
						
							|  |  |  |   return (TRUE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_show_statistics_or(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |   struct page_statistics stats; | 
					
						
							|  |  |  |   long bytes, total_bytes = 0; | 
					
						
							|  |  |  | #ifdef USE_PAGES_MALLOC
 | 
					
						
							|  |  |  |   long total_pages = 0; | 
					
						
							|  |  |  | #endif /* USE_PAGES_MALLOC */
 | 
					
						
							| 
									
										
										
										
											2012-02-18 11:01:06 +00:00
										 |  |  |   Term t = Deref(ARG1); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   if (!IsStreamTerm(t)) | 
					
						
							| 
									
										
										
										
											2012-02-18 11:01:06 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ bytes = | 
					
						
							|  |  |  |       0; | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   fprintf(out, "Execution data structures\n"); | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |   stats = show_statistics_or_frames(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   fprintf(out, "  Memory in use (I):               %10ld bytes\n\n", bytes); | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |   total_bytes += bytes; | 
					
						
							|  |  |  |   bytes = 0; | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   fprintf(out, "Cut support data structures\n"); | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |   stats = show_statistics_query_goal_solution_frames(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							|  |  |  |   stats = show_statistics_query_goal_answer_frames(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   fprintf(out, "  Memory in use (II):              %10ld bytes\n\n", bytes); | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |   total_bytes += bytes; | 
					
						
							| 
									
										
										
										
											2011-04-28 09:48:42 +01:00
										 |  |  | #ifdef USE_PAGES_MALLOC
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   fprintf(out, | 
					
						
							|  |  |  |           "Total memory in use (I+II):        %10ld bytes (%ld pages in use)\n", | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |           total_bytes, total_pages); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   fprintf( | 
					
						
							|  |  |  |       out, | 
					
						
							|  |  |  |       "Total memory allocated:            %10ld bytes (%ld pages in total)\n", | 
					
						
							|  |  |  |       PgEnt_pages_in_use(GLOBAL_pages_alloc) * Yap_page_size, | 
					
						
							|  |  |  |       PgEnt_pages_in_use(GLOBAL_pages_alloc)); | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   fprintf(out, "Total memory in use (I+II):        %10ld bytes\n", total_bytes); | 
					
						
							| 
									
										
										
										
											2011-04-28 09:48:42 +01:00
										 |  |  | #endif /* USE_PAGES_MALLOC */
 | 
					
						
							| 
									
										
										
										
											2011-07-26 15:26:01 +01:00
										 |  |  |   PL_release_stream(out); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   return (TRUE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-02-14 17:13:42 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_yapor_workers(USES_REGS1) { return FALSE; } | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | #endif /* YAPOR */
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | /**********************************
 | 
					
						
							| 
									
										
										
										
											2015-02-14 17:13:42 +00:00
										 |  |  |  **      OPTYap C Predicates      ** | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | **********************************/ | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | #if defined(YAPOR) && defined(TABLING)
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_show_statistics_opt(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |   struct page_statistics stats; | 
					
						
							|  |  |  |   long bytes, total_bytes = 0; | 
					
						
							|  |  |  | #ifdef USE_PAGES_MALLOC
 | 
					
						
							|  |  |  |   long total_pages = 0; | 
					
						
							|  |  |  | #endif /* USE_PAGES_MALLOC */
 | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   FILE *out; | 
					
						
							| 
									
										
										
										
											2012-02-18 11:01:06 +00:00
										 |  |  |   Term t = Deref(ARG1); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-18 11:01:06 +00:00
										 |  |  |   if (IsVarTerm(t) || !IsAtomTerm(t)) | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							|  |  |  |   if (!(out = Yap_GetStreamHandle(AtomOfTerm(t)))) | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |   bytes = 0; | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   fprintf(out, "Execution data structures\n"); | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |   stats = show_statistics_table_entries(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							|  |  |  | #if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
 | 
					
						
							|  |  |  |   stats = show_statistics_subgoal_entries(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							|  |  |  | #endif /* THREADS_FULL_SHARING || THREADS_CONSUMER_SHARING */
 | 
					
						
							|  |  |  |   stats = show_statistics_subgoal_frames(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							|  |  |  |   stats = show_statistics_dependency_frames(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							|  |  |  |   stats = show_statistics_or_frames(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							|  |  |  |   stats = show_statistics_suspension_frames(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   fprintf(out, "  Memory in use (I):               %10ld bytes\n\n", bytes); | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |   total_bytes += bytes; | 
					
						
							|  |  |  |   bytes = 0; | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   fprintf(out, "Local trie data structures\n"); | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |   stats = show_statistics_subgoal_trie_nodes(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							|  |  |  |   stats = show_statistics_answer_trie_nodes(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							|  |  |  |   stats = show_statistics_subgoal_trie_hashes(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							|  |  |  |   stats = show_statistics_answer_trie_hashes(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							|  |  |  | #if defined(THREADS_FULL_SHARING)
 | 
					
						
							|  |  |  |   stats = show_statistics_answer_ref_nodes(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							|  |  |  | #endif /* THREADS_FULL_SHARING */
 | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   fprintf(out, "  Memory in use (II):              %10ld bytes\n\n", bytes); | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |   total_bytes += bytes; | 
					
						
							|  |  |  |   bytes = 0; | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   fprintf(out, "Global trie data structures\n"); | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |   stats = show_statistics_global_trie_nodes(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							|  |  |  |   stats = show_statistics_global_trie_hashes(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   fprintf(out, "  Memory in use (III):             %10ld bytes\n\n", bytes); | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |   total_bytes += bytes; | 
					
						
							|  |  |  |   bytes = 0; | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   fprintf(out, "Cut support data structures\n"); | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |   stats = show_statistics_query_goal_solution_frames(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							|  |  |  |   stats = show_statistics_query_goal_answer_frames(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | #ifdef TABLING_INNER_CUTS
 | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |   stats = show_statistics_table_subgoal_solution_frames(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							|  |  |  |   stats = show_statistics_table_subgoal_answer_frames(out); | 
					
						
							|  |  |  |   INCREMENT_AUX_STATS(stats, bytes, total_pages); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | #endif /* TABLING_INNER_CUTS */
 | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   fprintf(out, "  Memory in use (IV):              %10ld bytes\n\n", bytes); | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |   total_bytes += bytes; | 
					
						
							| 
									
										
										
										
											2011-04-28 09:48:42 +01:00
										 |  |  | #ifdef USE_PAGES_MALLOC
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   fprintf(out, | 
					
						
							|  |  |  |           "Total memory in use (I+II+III+IV): %10ld bytes (%ld pages in use)\n", | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  |           total_bytes, total_pages); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   fprintf( | 
					
						
							|  |  |  |       out, | 
					
						
							|  |  |  |       "Total memory allocated:            %10ld bytes (%ld pages in total)\n", | 
					
						
							|  |  |  |       PgEnt_pages_in_use(GLOBAL_pages_alloc) * Yap_page_size, | 
					
						
							|  |  |  |       PgEnt_pages_in_use(GLOBAL_pages_alloc)); | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  |   fprintf(out, "Total memory in use (I+II+III+IV): %10ld bytes\n", total_bytes); | 
					
						
							| 
									
										
										
										
											2011-04-28 09:48:42 +01:00
										 |  |  | #endif /* USE_PAGES_MALLOC */
 | 
					
						
							| 
									
										
										
										
											2011-07-26 15:26:01 +01:00
										 |  |  |   PL_release_stream(out); | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  |   return (TRUE); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | #endif /* YAPOR && TABLING */
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static Int p_get_optyap_statistics(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2011-12-07 13:53:20 +00:00
										 |  |  |   struct page_statistics stats; | 
					
						
							|  |  |  |   Int value, bytes = 0, structs = -1; | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   Term tbytes, tstructs; | 
					
						
							| 
									
										
										
										
											2008-09-18 17:35:21 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   value = IntOfTerm(Deref(ARG1)); | 
					
						
							|  |  |  | #ifdef TABLING
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   if (value == 0 || value == 1) { /* table_entries */ | 
					
						
							| 
									
										
										
										
											2012-05-14 19:11:58 +01:00
										 |  |  |     GET_PAGE_STATS(stats, struct table_entry, _pages_tab_ent); | 
					
						
							|  |  |  |     bytes += PgEnt_bytes_in_use(stats); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     if (value != 0) | 
					
						
							|  |  |  |       structs = PgEnt_strs_in_use(stats); | 
					
						
							| 
									
										
										
										
											2008-09-18 17:35:21 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-12-07 13:53:20 +00:00
										 |  |  | #if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   if (value == 0 || value == 16) { /* subgoal_entries */ | 
					
						
							| 
									
										
										
										
											2012-05-14 19:11:58 +01:00
										 |  |  |     GET_PAGE_STATS(stats, struct subgoal_entry, _pages_sg_ent); | 
					
						
							|  |  |  |     bytes += PgEnt_bytes_in_use(stats); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     if (value != 0) | 
					
						
							|  |  |  |       structs = PgEnt_strs_in_use(stats); | 
					
						
							| 
									
										
										
										
											2011-12-07 13:53:20 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   if (value == 0 || value == 2) { /* subgoal_frames */ | 
					
						
							| 
									
										
										
										
											2012-05-14 19:11:58 +01:00
										 |  |  |     GET_PAGE_STATS(stats, struct subgoal_frame, _pages_sg_fr); | 
					
						
							|  |  |  |     bytes += PgEnt_bytes_in_use(stats); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     if (value != 0) | 
					
						
							|  |  |  |       structs = PgEnt_strs_in_use(stats); | 
					
						
							| 
									
										
										
										
											2008-09-18 17:35:21 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   if (value == 0 || value == 3) { /* dependency_frames */ | 
					
						
							| 
									
										
										
										
											2012-05-14 19:11:58 +01:00
										 |  |  |     GET_PAGE_STATS(stats, struct dependency_frame, _pages_dep_fr); | 
					
						
							|  |  |  |     bytes += PgEnt_bytes_in_use(stats); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     if (value != 0) | 
					
						
							|  |  |  |       structs = PgEnt_strs_in_use(stats); | 
					
						
							| 
									
										
										
										
											2005-04-07 17:56:58 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   if (value == 0 || value == 6) { /* subgoal_trie_nodes */ | 
					
						
							| 
									
										
										
										
											2012-05-14 19:11:58 +01:00
										 |  |  |     GET_PAGE_STATS(stats, struct subgoal_trie_node, _pages_sg_node); | 
					
						
							|  |  |  |     bytes += PgEnt_bytes_in_use(stats); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     if (value != 0) | 
					
						
							|  |  |  |       structs = PgEnt_strs_in_use(stats); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   if (value == 0 || value == 8) { /* subgoal_trie_hashes */ | 
					
						
							| 
									
										
										
										
											2012-05-14 19:11:58 +01:00
										 |  |  |     GET_PAGE_STATS(stats, struct subgoal_trie_hash, _pages_sg_hash); | 
					
						
							|  |  |  |     bytes += PgEnt_bytes_in_use(stats); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     if (value != 0) | 
					
						
							|  |  |  |       structs = PgEnt_strs_in_use(stats); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   if (value == 0 || value == 7) { /* answer_trie_nodes */ | 
					
						
							| 
									
										
										
										
											2012-05-14 19:11:58 +01:00
										 |  |  |     GET_PAGE_STATS(stats, struct answer_trie_node, _pages_ans_node); | 
					
						
							|  |  |  |     bytes += PgEnt_bytes_in_use(stats); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     if (value != 0) | 
					
						
							|  |  |  |       structs = PgEnt_strs_in_use(stats); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   if (value == 0 || value == 9) { /* answer_trie_hashes */ | 
					
						
							| 
									
										
										
										
											2012-05-14 19:11:58 +01:00
										 |  |  |     GET_PAGE_STATS(stats, struct answer_trie_hash, _pages_ans_hash); | 
					
						
							|  |  |  |     bytes += PgEnt_bytes_in_use(stats); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     if (value != 0) | 
					
						
							|  |  |  |       structs = PgEnt_strs_in_use(stats); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-12-07 13:53:20 +00:00
										 |  |  | #if defined(THREADS_FULL_SHARING)
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   if (value == 0 || value == 17) { /* answer_ref_nodes */ | 
					
						
							| 
									
										
										
										
											2012-05-14 19:11:58 +01:00
										 |  |  |     GET_PAGE_STATS(stats, struct answer_ref_node, _pages_ans_ref_node); | 
					
						
							|  |  |  |     bytes += PgEnt_bytes_in_use(stats); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     if (value != 0) | 
					
						
							|  |  |  |       structs = PgEnt_strs_in_use(stats); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2012-05-14 19:11:58 +01:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   if (value == 0 || value == 10) { /* global_trie_nodes */ | 
					
						
							| 
									
										
										
										
											2012-05-14 19:11:58 +01:00
										 |  |  |     GET_PAGE_STATS(stats, struct global_trie_node, _pages_gt_node); | 
					
						
							|  |  |  |     bytes += PgEnt_bytes_in_use(stats); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     if (value != 0) | 
					
						
							|  |  |  |       structs = PgEnt_strs_in_use(stats); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   if (value == 0 || value == 11) { /* global_trie_hashes */ | 
					
						
							| 
									
										
										
										
											2012-05-14 19:11:58 +01:00
										 |  |  |     GET_PAGE_STATS(stats, struct global_trie_hash, _pages_gt_hash); | 
					
						
							|  |  |  |     bytes += PgEnt_bytes_in_use(stats); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     if (value != 0) | 
					
						
							|  |  |  |       structs = PgEnt_strs_in_use(stats); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   } | 
					
						
							|  |  |  | #endif /* TABLING */
 | 
					
						
							|  |  |  | #ifdef YAPOR
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   if (value == 0 || value == 4) { /* or_frames */ | 
					
						
							| 
									
										
										
										
											2012-05-14 19:11:58 +01:00
										 |  |  |     GET_PAGE_STATS(stats, struct or_frame, _pages_or_fr); | 
					
						
							|  |  |  |     bytes += PgEnt_bytes_in_use(stats); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     if (value != 0) | 
					
						
							|  |  |  |       structs = PgEnt_strs_in_use(stats); | 
					
						
							| 
									
										
										
										
											2003-11-05 16:12:25 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   if (value == 0 || value == 12) { /* query_goal_solution_frames */ | 
					
						
							| 
									
										
										
										
											2012-05-14 19:11:58 +01:00
										 |  |  |     GET_PAGE_STATS(stats, struct query_goal_solution_frame, _pages_qg_sol_fr); | 
					
						
							|  |  |  |     bytes += PgEnt_bytes_in_use(stats); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     if (value != 0) | 
					
						
							|  |  |  |       structs = PgEnt_strs_in_use(stats); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   if (value == 0 || value == 13) { /* query_goal_answer_frames */ | 
					
						
							| 
									
										
										
										
											2012-05-14 19:11:58 +01:00
										 |  |  |     GET_PAGE_STATS(stats, struct query_goal_answer_frame, _pages_qg_ans_fr); | 
					
						
							|  |  |  |     bytes += PgEnt_bytes_in_use(stats); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     if (value != 0) | 
					
						
							|  |  |  |       structs = PgEnt_strs_in_use(stats); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   } | 
					
						
							|  |  |  | #endif /* YAPOR */
 | 
					
						
							|  |  |  | #if defined(YAPOR) && defined(TABLING)
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   if (value == 0 || value == 5) { /* suspension_frames */ | 
					
						
							| 
									
										
										
										
											2012-05-14 19:11:58 +01:00
										 |  |  |     GET_PAGE_STATS(stats, struct suspension_frame, _pages_susp_fr); | 
					
						
							|  |  |  |     bytes += PgEnt_bytes_in_use(stats); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     if (value != 0) | 
					
						
							|  |  |  |       structs = PgEnt_strs_in_use(stats); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   } | 
					
						
							|  |  |  | #ifdef TABLING_INNER_CUTS
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   if (value == 0 || value == 14) { /* table_subgoal_solution_frames */ | 
					
						
							|  |  |  |     GET_PAGE_STATS(stats, struct table_subgoal_solution_frame, | 
					
						
							|  |  |  |                    _pages_tg_sol_fr); | 
					
						
							| 
									
										
										
										
											2012-05-14 19:11:58 +01:00
										 |  |  |     bytes += PgEnt_bytes_in_use(stats); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     if (value != 0) | 
					
						
							|  |  |  |       structs = PgEnt_strs_in_use(stats); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   if (value == 0 || value == 15) { /* table_subgoal_answer_frames */ | 
					
						
							| 
									
										
										
										
											2012-05-14 19:11:58 +01:00
										 |  |  |     GET_PAGE_STATS(stats, struct table_subgoal_answer_frame, _pages_tg_ans_fr); | 
					
						
							|  |  |  |     bytes += PgEnt_bytes_in_use(stats); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     if (value != 0) | 
					
						
							|  |  |  |       structs = PgEnt_strs_in_use(stats); | 
					
						
							| 
									
										
										
										
											2009-06-17 17:14:16 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | #endif /* TABLING_INNER_CUTS */
 | 
					
						
							|  |  |  | #endif /* YAPOR && TABLING */
 | 
					
						
							| 
									
										
										
										
											2011-12-07 13:53:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   if (value == 0) { /* total_memory */ | 
					
						
							| 
									
										
										
										
											2011-12-07 13:53:20 +00:00
										 |  |  | #ifdef USE_PAGES_MALLOC
 | 
					
						
							| 
									
										
										
										
											2012-05-14 19:11:58 +01:00
										 |  |  |     structs = PgEnt_pages_in_use(GLOBAL_pages_alloc) * Yap_page_size; | 
					
						
							| 
									
										
										
										
											2011-12-07 13:53:20 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  |     structs = bytes; | 
					
						
							|  |  |  | #endif /* USE_PAGES_MALLOC */
 | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (structs == -1) | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |     return (FALSE); | 
					
						
							|  |  |  |   tbytes = Deref(ARG2); | 
					
						
							|  |  |  |   tstructs = Deref(ARG3); | 
					
						
							|  |  |  |   if (IsVarTerm(tbytes)) { | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     YapBind((CELL *)tbytes, MkIntTerm(bytes)); | 
					
						
							|  |  |  |   } else if (IsIntTerm(tbytes) && IntOfTerm(tbytes) != bytes) | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |     return (FALSE); | 
					
						
							|  |  |  |   if (IsVarTerm(tstructs)) { | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     YapBind((CELL *)tstructs, MkIntTerm(structs)); | 
					
						
							|  |  |  |   } else if (IsIntTerm(tstructs) && IntOfTerm(tstructs) != structs) | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |     return (FALSE); | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  |   return (TRUE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | /******************************
 | 
					
						
							|  |  |  | **      Local functions      ** | 
					
						
							|  |  |  | ******************************/ | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | #ifdef YAPOR
 | 
					
						
							|  |  |  | static inline realtime current_time(void) { | 
					
						
							| 
									
										
										
										
											2012-01-05 16:04:32 +00:00
										 |  |  | #define TIME_RESOLUTION 1000000
 | 
					
						
							|  |  |  |   struct timeval tempo; | 
					
						
							|  |  |  |   gettimeofday(&tempo, NULL); | 
					
						
							|  |  |  |   return ((realtime)tempo.tv_sec + (realtime)tempo.tv_usec / TIME_RESOLUTION); | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  |   /* to get time as Yap */ | 
					
						
							|  |  |  |   /*
 | 
					
						
							|  |  |  |   double now, interval; | 
					
						
							|  |  |  |   Yap_cputime_interval(&now, &interval); | 
					
						
							|  |  |  |   return ((realtime)now); | 
					
						
							|  |  |  |   */ | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | #endif /* YAPOR */
 | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | #ifdef TABLING
 | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  | static inline struct page_statistics show_statistics_table_entries(FILE *out) { | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   SHOW_PAGE_STATS(out, struct table_entry, _pages_tab_ent, | 
					
						
							|  |  |  |                   "Table entries:                "); | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  | #if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_subgoal_entries(FILE *out) { | 
					
						
							|  |  |  |   SHOW_PAGE_STATS(out, struct subgoal_entry, _pages_sg_ent, | 
					
						
							|  |  |  |                   "Subgoal entries:              "); | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  | } | 
					
						
							|  |  |  | #endif /* THREADS_FULL_SHARING || THREADS_CONSUMER_SHARING */
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  | static inline struct page_statistics show_statistics_subgoal_frames(FILE *out) { | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   SHOW_PAGE_STATS(out, struct subgoal_frame, _pages_sg_fr, | 
					
						
							|  |  |  |                   "Subgoal frames:               "); | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_dependency_frames(FILE *out) { | 
					
						
							|  |  |  |   SHOW_PAGE_STATS(out, struct dependency_frame, _pages_dep_fr, | 
					
						
							|  |  |  |                   "Dependency frames:            "); | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_subgoal_trie_nodes(FILE *out) { | 
					
						
							|  |  |  |   SHOW_PAGE_STATS(out, struct subgoal_trie_node, _pages_sg_node, | 
					
						
							|  |  |  |                   "Subgoal trie nodes:           "); | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_subgoal_trie_hashes(FILE *out) { | 
					
						
							|  |  |  |   SHOW_PAGE_STATS(out, struct subgoal_trie_hash, _pages_sg_hash, | 
					
						
							|  |  |  |                   "Subgoal trie hashes:          "); | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_answer_trie_nodes(FILE *out) { | 
					
						
							|  |  |  |   SHOW_PAGE_STATS(out, struct answer_trie_node, _pages_ans_node, | 
					
						
							|  |  |  |                   "Answer trie nodes:            "); | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_answer_trie_hashes(FILE *out) { | 
					
						
							|  |  |  |   SHOW_PAGE_STATS(out, struct answer_trie_hash, _pages_ans_hash, | 
					
						
							|  |  |  |                   "Answer trie hashes:           "); | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  | #if defined(THREADS_FULL_SHARING)
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_answer_ref_nodes(FILE *out) { | 
					
						
							|  |  |  |   SHOW_PAGE_STATS(out, struct answer_ref_node, _pages_ans_ref_node, | 
					
						
							|  |  |  |                   "Answer ref nodes:             "); | 
					
						
							| 
									
										
										
										
											2011-12-09 16:06:17 +00:00
										 |  |  | } | 
					
						
							|  |  |  | #endif /* THREADS_FULL_SHARING */
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_global_trie_nodes(FILE *out) { | 
					
						
							|  |  |  |   SHOW_PAGE_STATS(out, struct global_trie_node, _pages_gt_node, | 
					
						
							|  |  |  |                   "Global trie nodes:            "); | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_global_trie_hashes(FILE *out) { | 
					
						
							|  |  |  |   SHOW_PAGE_STATS(out, struct global_trie_hash, _pages_gt_hash, | 
					
						
							|  |  |  |                   "Global trie hashes:           "); | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | #endif /* TABLING */
 | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | #ifdef YAPOR
 | 
					
						
							| 
									
										
										
										
											2015-06-19 01:30:13 +01:00
										 |  |  | static inline struct page_statistics show_statistics_or_frames(FILE *out) { | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |   SHOW_PAGE_STATS(out, struct or_frame, _pages_or_fr, | 
					
						
							|  |  |  |                   "Or-frames:                    "); | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_query_goal_solution_frames(FILE *out) { | 
					
						
							|  |  |  |   SHOW_PAGE_STATS(out, struct query_goal_solution_frame, _pages_qg_sol_fr, | 
					
						
							|  |  |  |                   "Query goal solution frames:   "); | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_query_goal_answer_frames(FILE *out) { | 
					
						
							|  |  |  |   SHOW_PAGE_STATS(out, struct query_goal_answer_frame, _pages_qg_ans_fr, | 
					
						
							|  |  |  |                   "Query goal answer frames:     "); | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | #endif /* YAPOR */
 | 
					
						
							| 
									
										
										
										
											2009-09-27 02:31:31 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | #if defined(YAPOR) && defined(TABLING)
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_suspension_frames(FILE *out) { | 
					
						
							|  |  |  |   SHOW_PAGE_STATS(out, struct suspension_frame, _pages_susp_fr, | 
					
						
							|  |  |  |                   "Suspension frames:            "); | 
					
						
							| 
									
										
										
										
											2009-09-27 02:31:31 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | #ifdef TABLING_INNER_CUTS
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_table_subgoal_solution_frames(FILE *out) { | 
					
						
							|  |  |  |   SHOW_PAGE_STATS(out, struct table_subgoal_solution_frame, _pages_tg_sol_fr, | 
					
						
							|  |  |  |                   "Table subgoal solution frames:"); | 
					
						
							| 
									
										
										
										
											2009-09-27 02:31:31 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static inline struct page_statistics | 
					
						
							|  |  |  | show_statistics_table_subgoal_answer_frames(FILE *out) { | 
					
						
							|  |  |  |   SHOW_PAGE_STATS(out, struct table_subgoal_answer_frame, _pages_tg_ans_fr, | 
					
						
							|  |  |  |                   "Table subgoal answer frames:  "); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2010-04-20 03:59:48 +01:00
										 |  |  | #endif /* TABLING_INNER_CUTS */
 | 
					
						
							| 
									
										
										
										
											2005-07-11 19:17:32 +00:00
										 |  |  | #endif /* YAPOR && TABLING */
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #endif /* YAPOR || TABLING */
 |