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 20:54:03 +01:00
# include "Yap.h"
# if defined(YAPOR) || defined(TABLING)
# include "Yatom.h"
2009-10-23 14:22:17 +01:00
# include "YapHeap.h"
2011-05-25 18:38:46 +01:00
# include "SWI-Prolog.h"
2001-04-09 20:54:03 +01: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 20:54:03 +01:00
# if HAVE_SYS_TIME_H
# include <sys/time.h>
2005-06-03 19:28:11 +01:00
# endif /* HAVE_SYS_TIME_H */
2001-04-09 20:54:03 +01:00
# include "or.macros.h"
# endif /* YAPOR */
# ifdef TABLING
# include "tab.macros.h"
# endif /* TABLING */
# ifdef TABLING
2011-03-07 16:02:55 +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 20:54:03 +01:00
# endif /* TABLING */
2011-06-21 15:19:07 +01:00
2010-04-20 03:59:48 +01:00
# ifdef YAPOR
2011-06-21 15:19:07 +01:00
static Int p_parallel_mode ( USES_REGS1 ) ;
static Int p_yapor_start ( USES_REGS1 ) ;
static Int p_yapor_workers ( USES_REGS1 ) ;
2011-03-07 16:02:55 +00:00
static Int p_worker ( USES_REGS1 ) ;
static Int p_parallel_new_answer ( USES_REGS1 ) ;
2012-01-05 16:04:32 +00:00
static Int p_parallel_get_answers ( USES_REGS1 ) ;
2011-03-07 16:02:55 +00:00
static Int p_show_statistics_or ( USES_REGS1 ) ;
2010-04-20 03:59:48 +01:00
# endif /* YAPOR */
2005-07-11 20:17:32 +01:00
# if defined(YAPOR) && defined(TABLING)
2011-03-07 16:02:55 +00:00
static Int p_show_statistics_opt ( USES_REGS1 ) ;
2005-07-11 20:17:32 +01:00
# endif /* YAPOR && TABLING */
2011-03-07 16:02:55 +00:00
static Int p_get_optyap_statistics ( USES_REGS1 ) ;
2005-07-11 20:17:32 +01:00
# ifdef YAPOR
2010-04-20 03:59:48 +01:00
static inline realtime current_time ( void ) ;
2005-07-11 20:17:32 +01:00
# endif /* YAPOR */
2010-04-20 03:59:48 +01:00
2005-07-11 20:17:32 +01:00
# ifdef TABLING
2011-12-09 16:06:17 +00:00
static inline struct page_statistics show_statistics_table_entries ( IOSTREAM * out ) ;
# if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
static inline struct page_statistics show_statistics_subgoal_entries ( IOSTREAM * out ) ;
# endif /* THREADS_FULL_SHARING || THREADS_CONSUMER_SHARING */
static inline struct page_statistics show_statistics_subgoal_frames ( IOSTREAM * out ) ;
static inline struct page_statistics show_statistics_dependency_frames ( IOSTREAM * out ) ;
static inline struct page_statistics show_statistics_subgoal_trie_nodes ( IOSTREAM * out ) ;
static inline struct page_statistics show_statistics_subgoal_trie_hashes ( IOSTREAM * out ) ;
static inline struct page_statistics show_statistics_answer_trie_nodes ( IOSTREAM * out ) ;
static inline struct page_statistics show_statistics_answer_trie_hashes ( IOSTREAM * out ) ;
# if defined(THREADS_FULL_SHARING)
static inline struct page_statistics show_statistics_answer_ref_nodes ( IOSTREAM * out ) ;
# endif /* THREADS_FULL_SHARING */
static inline struct page_statistics show_statistics_global_trie_nodes ( IOSTREAM * out ) ;
static inline struct page_statistics show_statistics_global_trie_hashes ( IOSTREAM * out ) ;
2005-07-11 20:17:32 +01:00
# endif /* TABLING */
2010-04-20 03:59:48 +01:00
# ifdef YAPOR
2011-12-09 16:06:17 +00:00
static inline struct page_statistics show_statistics_or_frames ( IOSTREAM * out ) ;
static inline struct page_statistics show_statistics_query_goal_solution_frames ( IOSTREAM * out ) ;
static inline struct page_statistics show_statistics_query_goal_answer_frames ( IOSTREAM * out ) ;
2010-04-20 03:59:48 +01:00
# endif /* YAPOR */
2005-07-11 20:17:32 +01:00
# if defined(YAPOR) && defined(TABLING)
2011-12-09 16:06:17 +00:00
static inline struct page_statistics show_statistics_suspension_frames ( IOSTREAM * out ) ;
2010-04-20 03:59:48 +01:00
# ifdef TABLING_INNER_CUTS
2011-12-09 16:06:17 +00:00
static inline struct page_statistics show_statistics_table_subgoal_solution_frames ( IOSTREAM * out ) ;
static inline struct page_statistics show_statistics_table_subgoal_answer_frames ( IOSTREAM * out ) ;
2010-04-20 03:59:48 +01:00
# endif /* TABLING_INNER_CUTS */
2005-07-11 20:17:32 +01:00
# endif /* YAPOR && TABLING */
2001-04-09 20:54:03 +01:00
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
2012-05-14 19:11:58 +01:00
long pages_in_use ; /* same as struct pages (opt.structs.h) */
2011-12-07 13:53:20 +00:00
# endif /* USE_PAGES_MALLOC */
2012-05-14 19:11:58 +01:00
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
} ;
2012-05-14 19:11:58 +01: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
2012-05-14 19:11:58 +01: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 ) { \
2013-12-20 14:56:13 +00:00
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 */
2012-05-14 19:11:58 +01: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) " " STR_NAME " %10ld bytes (%ld pages and %ld structs in use)\n"
# 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)
2012-05-14 19:11:58 +01: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) " " STR_NAME " %10ld bytes (%ld structs in use)\n"
# 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
2012-05-14 19:11:58 +01:00
2013-12-16 16:51:00 +00:00
# if defined(THREADS) && defined(TABLING)
2012-05-14 19:11:58 +01: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 ) ) ; \
} \
} \
2013-12-20 14:56:13 +00:00
} \
2012-05-14 19:11:58 +01:00
UNLOCK ( GLOBAL_ThreadHandlesLock )
# else
# define GET_ALL_PAGE_STATS(STATS, STR_TYPE, _PAGES) \
CHECK_PAGE_FREE_STRUCTS ( STR_TYPE , GLOBAL # # _PAGES ) ; \
INCREMENT_PAGE_STATS ( STATS , GLOBAL # # _PAGES )
# endif
# 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 )
2013-12-20 14:56:13 +00:00
# define SHOW_PAGE_STATS(OUT_STREAM, STR_TYPE, _PAGES, STR_NAME) \
2011-12-09 16:06:17 +00:00
{ struct page_statistics stats ; \
2013-12-20 14:56:13 +00:00
GET_PAGE_STATS ( stats , STR_TYPE , _PAGES ) ; \
Sfprintf ( OUT_STREAM , SHOW_PAGE_STATS_MSG ( STR_NAME ) , SHOW_PAGE_STATS_ARGS ( stats , STR_TYPE ) ) ; \
2011-12-09 16:06:17 +00:00
return stats ; \
2011-12-07 13:53:20 +00:00
}
2010-04-03 05:58:14 +01:00
/*******************************
2001-04-09 20:54:03 +01:00
* * Global functions * *
2010-04-03 05:58:14 +01:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-04-09 20:54:03 +01:00
2002-11-26 22:19:48 +00:00
void Yap_init_optyap_preds ( void ) {
2001-04-09 20:54:03 +01:00
# ifdef TABLING
2010-03-09 14:48:20 +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 ) ;
2010-05-18 17:34:52 +01:00
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 ) ;
2012-10-19 18:11:20 +01:00
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 ) ;
2005-07-11 20:17:32 +01:00
Yap_InitCPred ( " abolish_all_tables " , 0 , p_abolish_all_tables , SafePredFlag | SyncPredFlag ) ;
2011-05-25 18:38:46 +01:00
Yap_InitCPred ( " show_tabled_predicates " , 1 , p_show_tabled_predicates , SafePredFlag | SyncPredFlag ) ;
2012-10-19 18:11:20 +01:00
Yap_InitCPred ( " $c_show_table " , 3 , p_show_table , SafePredFlag | SyncPredFlag ) ;
2011-05-25 18:38:46 +01:00
Yap_InitCPred ( " show_all_tables " , 1 , p_show_all_tables , SafePredFlag | SyncPredFlag ) ;
Yap_InitCPred ( " show_global_trie " , 1 , p_show_global_trie , SafePredFlag | SyncPredFlag ) ;
2012-10-19 18:11:20 +01:00
Yap_InitCPred ( " $c_table_statistics " , 3 , p_show_statistics_table , SafePredFlag | SyncPredFlag ) ;
2011-05-25 18:38:46 +01:00
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 20:54:03 +01:00
# endif /* TABLING */
2010-04-20 03:59:48 +01:00
# ifdef YAPOR
2011-06-21 15:19:07 +01:00
Yap_InitCPred ( " parallel_mode " , 1 , p_parallel_mode , SafePredFlag | SyncPredFlag ) ;
2012-10-19 18:11:20 +01:00
Yap_InitCPred ( " $c_yapor_start " , 0 , p_yapor_start , SafePredFlag | SyncPredFlag ) ;
Yap_InitCPred ( " $c_yapor_workers " , 1 , p_yapor_workers , 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 ) ;
2011-05-25 18:38:46 +01:00
Yap_InitCPred ( " or_statistics " , 1 , p_show_statistics_or , SafePredFlag | SyncPredFlag ) ;
2010-04-20 03:59:48 +01:00
# endif /* YAPOR */
2005-07-11 20:17:32 +01:00
# if defined(YAPOR) && defined(TABLING)
2011-05-25 18:38:46 +01:00
Yap_InitCPred ( " opt_statistics " , 1 , p_show_statistics_opt , SafePredFlag | SyncPredFlag ) ;
2005-07-11 20:17:32 +01:00
# endif /* YAPOR && TABLING */
2012-10-19 18:11:20 +01:00
Yap_InitCPred ( " $c_get_optyap_statistics " , 3 , p_get_optyap_statistics , SafePredFlag | SyncPredFlag ) ;
2001-04-09 20:54:03 +01: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 20:54:03 +01: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
2011-03-07 16:02:55 +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 20:54:03 +01:00
}
2011-03-07 16:02:55 +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 20:54:03 +01:00
}
2010-04-20 03:59:48 +01:00
2011-03-07 16:02:55 +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 ) ;
}
2011-03-07 16:02:55 +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 20:54:03 +01:00
return ( TRUE ) ;
}
2011-03-07 16:02:55 +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
int * mode_directed = NULL ;
# endif /* MODE_DIRECTED_TABLING */
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 20:54:03 +01: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 20:54:03 +01: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 ) ;
2011-11-09 11:00:31 +00:00
if ( list ! = TermNil ) { /* non-empty list */
# ifndef MODE_DIRECTED_TABLING
Yap_Error ( INTERNAL_COMPILER_ERROR , TermNil , " invalid tabling declaration for %s/%d (mode directed tabling not enabled) " , AtomName ( at ) , arity ) ;
return ( FALSE ) ;
2011-10-22 16:49:13 +01:00
# else
2012-06-04 19:27:31 +01:00
/*************************************************************************************
The mode operator declaration is reordered as follows :
1. arguments with mode ' index ' ( any number )
2. arguments with mode ' min ' and ' max ' ( any number , following the original order )
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 ) ;
Yap_Error ( INTERNAL_COMPILER_ERROR , TermNil , " invalid tabling declaration for %s/%d (more than one argument with modes 'sum' and/or 'last') " , AtomName ( at ) , arity ) ;
return ( FALSE ) ;
} 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 )
2013-12-20 14:56:13 +00:00
aux_pos = pos_index + + ;
2012-06-04 19:27:31 +01:00
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 )
2013-12-20 14:56:13 +00:00
aux_pos = pos_all + + ;
2012-06-04 19:27:31 +01:00
else if ( aux_mode_directed [ i ] = = MODE_DIRECTED_SUM | | aux_mode_directed [ i ] = = MODE_DIRECTED_LAST )
2013-12-20 14:56:13 +00:00
aux_pos = pos_sum_last + + ;
2012-06-04 19:27:31 +01:00
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 )
return ( TRUE ) ; /* predicate already tabled */
if ( pe - > cs . p_code . FirstClause )
return ( FALSE ) ; /* predicate already compiled */
pe - > PredFlags | = TabledPredFlag ;
2011-11-09 11:00:31 +00:00
new_table_entry ( tab_ent , pe , at , arity , mode_directed ) ;
2011-10-22 16:49:13 +01:00
pe - > TableOfPred = tab_ent ;
return ( TRUE ) ;
}
2001-04-09 20:54:03 +01:00
2011-03-07 16:02:55 +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 ) ;
2014-05-29 10:32:28 +01:00
YapBind ( ( CELL * ) tvalue , t ) ;
2001-04-09 20:54:03 +01:00
return ( TRUE ) ;
2010-04-20 03:59:48 +01:00
} else if ( IsIntTerm ( tvalue ) ) {
Int value = IntOfTerm ( tvalue ) ;
if ( value = = 1 ) { /* batched */
SetMode_Batched ( TabEnt_flags ( tab_ent ) ) ;
if ( ! IsMode_Local ( yap_flags [ TABLING_MODE_FLAG ] ) ) {
2013-12-20 14:56:13 +00:00
SetMode_Batched ( TabEnt_mode ( tab_ent ) ) ;
return ( TRUE ) ;
2010-04-20 03:59:48 +01:00
}
} else if ( value = = 2 ) { /* local */
SetMode_Local ( TabEnt_flags ( tab_ent ) ) ;
if ( ! IsMode_Batched ( yap_flags [ TABLING_MODE_FLAG ] ) ) {
2013-12-20 14:56:13 +00:00
SetMode_Local ( TabEnt_mode ( tab_ent ) ) ;
return ( TRUE ) ;
2010-04-20 03:59:48 +01:00
}
} else if ( value = = 3 ) { /* exec_answers */
SetMode_ExecAnswers ( TabEnt_flags ( tab_ent ) ) ;
if ( ! IsMode_LoadAnswers ( yap_flags [ TABLING_MODE_FLAG ] ) ) {
2013-12-20 14:56:13 +00:00
SetMode_ExecAnswers ( TabEnt_mode ( tab_ent ) ) ;
return ( TRUE ) ;
2010-04-20 03:59:48 +01:00
}
} else if ( value = = 4 ) { /* load_answers */
SetMode_LoadAnswers ( TabEnt_flags ( tab_ent ) ) ;
if ( ! IsMode_ExecAnswers ( yap_flags [ TABLING_MODE_FLAG ] ) ) {
2013-12-20 14:56:13 +00:00
SetMode_LoadAnswers ( TabEnt_mode ( tab_ent ) ) ;
return ( TRUE ) ;
2010-04-20 03:59:48 +01:00
}
} else if ( value = = 5 ) { /* local_trie */
SetMode_LocalTrie ( TabEnt_flags ( tab_ent ) ) ;
if ( ! IsMode_GlobalTrie ( yap_flags [ TABLING_MODE_FLAG ] ) ) {
2013-12-20 14:56:13 +00:00
SetMode_LocalTrie ( TabEnt_mode ( tab_ent ) ) ;
return ( TRUE ) ;
2010-04-20 03:59:48 +01:00
}
} else if ( value = = 6 ) { /* global_trie */
SetMode_GlobalTrie ( TabEnt_flags ( tab_ent ) ) ;
if ( ! IsMode_LocalTrie ( yap_flags [ TABLING_MODE_FLAG ] ) ) {
2013-12-20 14:56:13 +00:00
SetMode_GlobalTrie ( TabEnt_mode ( tab_ent ) ) ;
return ( TRUE ) ;
2010-04-20 03:59:48 +01:00
}
2013-12-20 14:56:13 +00:00
} else if ( value = = 7 ) { /* coinductive */ //only affect the predicate flag. Also it cant be unset
SetMode_CoInductive ( TabEnt_flags ( tab_ent ) ) ;
return ( TRUE ) ;
}
2001-04-09 20:54:03 +01:00
}
2010-04-20 03:59:48 +01:00
return ( FALSE ) ;
2001-04-09 20:54:03 +01:00
}
2011-03-07 16:02:55 +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 20:54:03 +01: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 ) ;
}
2011-03-07 16:02:55 +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 ) ;
}
2011-03-07 16:02:55 +00:00
static Int p_show_tabled_predicates ( USES_REGS1 ) {
2011-05-25 18:38:46 +01:00
IOSTREAM * 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
2012-02-18 11:01:06 +00:00
if ( IsVarTerm ( t ) | | ! IsAtomTerm ( t ) )
return FALSE ;
if ( ! ( out = Yap_GetStreamHandle ( AtomOfTerm ( t ) ) ) )
return FALSE ;
2011-05-10 11:47:18 +01:00
tab_ent = GLOBAL_root_tab_ent ;
2011-05-25 18:38:46 +01:00
Sfprintf ( out , " Tabled predicates \n " ) ;
2010-04-20 03:59:48 +01:00
if ( tab_ent = = NULL )
2011-05-25 18:38:46 +01:00
Sfprintf ( out , " NONE \n " ) ;
2011-07-26 15:26:01 +01:00
else while ( tab_ent ) {
Sfprintf ( 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 ) ;
}
2011-03-07 16:02:55 +00:00
static Int p_show_table ( USES_REGS1 ) {
2011-05-25 18:38:46 +01:00
IOSTREAM * out ;
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 ) ;
2010-04-20 03:59:48 +01:00
2012-02-18 11:01:06 +00:00
if ( IsVarTerm ( t1 ) | | ! IsAtomTerm ( t1 ) )
return FALSE ;
if ( ! ( out = Yap_GetStreamHandle ( AtomOfTerm ( t1 ) ) ) )
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 {
PL_release_stream ( out ) ;
2010-04-20 03:59:48 +01:00
return ( FALSE ) ;
2011-07-26 15:26:01 +01:00
}
2011-05-25 18:38:46 +01:00
show_table ( tab_ent , SHOW_MODE_STRUCTURE , out ) ;
2011-07-26 15:26:01 +01:00
PL_release_stream ( out ) ;
2010-04-20 03:59:48 +01:00
return ( TRUE ) ;
}
2011-03-07 16:02:55 +00:00
static Int p_show_all_tables ( USES_REGS1 ) {
2011-05-25 18:38:46 +01:00
IOSTREAM * 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
2012-02-18 11:01:06 +00:00
if ( IsVarTerm ( t ) | | ! IsAtomTerm ( t ) )
return FALSE ;
if ( ! ( out = Yap_GetStreamHandle ( AtomOfTerm ( t ) ) ) )
return FALSE ;
2011-05-10 11:47:18 +01:00
tab_ent = GLOBAL_root_tab_ent ;
2010-04-20 03:59:48 +01:00
while ( tab_ent ) {
2011-05-25 18:38:46 +01:00
show_table ( tab_ent , SHOW_MODE_STRUCTURE , out ) ;
2010-04-20 03:59:48 +01:00
tab_ent = TabEnt_next ( tab_ent ) ;
}
2011-07-26 15:26:01 +01:00
PL_release_stream ( out ) ;
2010-04-20 03:59:48 +01:00
return ( TRUE ) ;
}
2011-03-07 16:02:55 +00:00
static Int p_show_global_trie ( USES_REGS1 ) {
2011-05-25 18:38:46 +01:00
IOSTREAM * out ;
2012-02-18 11:01:06 +00:00
Term t = Deref ( ARG1 ) ;
2011-05-25 18:38:46 +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-05-25 18:38:46 +01:00
show_global_trie ( SHOW_MODE_STRUCTURE , out ) ;
2011-07-26 15:26:01 +01:00
PL_release_stream ( out ) ;
2010-04-20 03:59:48 +01:00
return ( TRUE ) ;
}
2011-03-07 16:02:55 +00:00
static Int p_show_statistics_table ( USES_REGS1 ) {
2011-05-25 18:38:46 +01:00
IOSTREAM * out ;
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 ) ;
2010-04-20 03:59:48 +01:00
2012-02-18 11:01:06 +00:00
if ( IsVarTerm ( t1 ) | | ! IsAtomTerm ( t1 ) )
return FALSE ;
if ( ! ( out = Yap_GetStreamHandle ( AtomOfTerm ( t1 ) ) ) )
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 {
PL_release_stream ( out ) ;
2010-04-20 03:59:48 +01:00
return ( FALSE ) ;
2011-07-26 15:26:01 +01:00
}
2011-05-25 18:38:46 +01:00
show_table ( tab_ent , SHOW_MODE_STATISTICS , out ) ;
2011-07-26 15:26:01 +01:00
PL_release_stream ( out ) ;
2010-04-20 03:59:48 +01:00
return ( TRUE ) ;
}
2011-03-07 16:02:55 +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 */
2011-05-25 18:38:46 +01:00
IOSTREAM * 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 ;
2011-05-25 18:38:46 +01:00
Sfprintf ( 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 ) ;
Sfprintf ( out , " Memory in use (I): %10ld bytes \n \n " , bytes ) ;
total_bytes + = bytes ;
bytes = 0 ;
2011-05-25 18:38:46 +01:00
Sfprintf ( 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 */
Sfprintf ( out , " Memory in use (II): %10ld bytes \n \n " , bytes ) ;
total_bytes + = bytes ;
bytes = 0 ;
2011-05-25 18:38:46 +01:00
Sfprintf ( 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 ) ;
Sfprintf ( out , " Memory in use (III): %10ld bytes \n \n " , bytes ) ;
total_bytes + = bytes ;
2011-04-28 09:48:42 +01:00
# ifdef USE_PAGES_MALLOC
2011-05-25 18:38:46 +01:00
Sfprintf ( 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 ) ;
2011-05-25 18:38:46 +01:00
Sfprintf ( out , " Total memory allocated: %10ld bytes (%ld pages in total) \n " ,
2012-05-14 19:11:58 +01:00
PgEnt_pages_in_use ( GLOBAL_pages_alloc ) * Yap_page_size , PgEnt_pages_in_use ( GLOBAL_pages_alloc ) ) ;
2010-04-20 03:59:48 +01:00
# else
2011-05-25 18:38:46 +01:00
Sfprintf ( 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 */
2011-07-26 15:26:01 +01:00
PL_release_stream ( out ) ;
2010-04-20 03:59:48 +01:00
return ( TRUE ) ;
}
2011-12-09 16:06:17 +00:00
2011-03-07 16:02:55 +00:00
static Int p_show_statistics_global_trie ( USES_REGS1 ) {
2011-05-25 18:38:46 +01:00
IOSTREAM * out ;
2012-02-18 11:01:06 +00:00
Term t = Deref ( ARG1 ) ;
2011-05-25 18:38:46 +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-05-25 18:38:46 +01:00
show_global_trie ( SHOW_MODE_STATISTICS , out ) ;
2011-07-26 15:26:01 +01:00
PL_release_stream ( 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
2011-12-09 16:06:17 +00:00
2010-04-20 03:59:48 +01:00
/*********************************
* * YapOr C Predicates * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# ifdef YAPOR
2011-06-21 15:19:07 +01: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 ;
2011-06-21 15:19:07 +01:00
if ( GLOBAL_parallel_mode = = PARALLEL_MODE_OFF )
2010-04-20 03:59:48 +01:00
ta = MkAtomTerm ( Yap_LookupAtom ( " off " ) ) ;
2011-06-21 15:19:07 +01:00
else if ( GLOBAL_parallel_mode = = PARALLEL_MODE_ON )
ta = MkAtomTerm ( Yap_LookupAtom ( " on " ) ) ;
else /* PARALLEL_MODE_RUNNING */
ta = MkAtomTerm ( Yap_LookupAtom ( " running " ) ) ;
2014-05-29 10:32:28 +01:00
YapBind ( ( CELL * ) t , ta ) ;
2010-04-20 03:59:48 +01: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 ;
2011-06-21 15:19:07 +01:00
if ( strcmp ( s , " on " ) = = 0 ) {
GLOBAL_parallel_mode = PARALLEL_MODE_ON ;
2010-04-20 03:59:48 +01:00
return ( TRUE ) ;
2011-06-21 15:19:07 +01:00
}
2010-04-20 03:59:48 +01:00
if ( strcmp ( s , " off " ) = = 0 ) {
2011-06-21 15:19:07 +01:00
GLOBAL_parallel_mode = PARALLEL_MODE_OFF ;
2010-04-20 03:59:48 +01:00
return ( TRUE ) ;
}
2011-06-21 15:19:07 +01:00
return ( FALSE ) ; /* PARALLEL_MODE_RUNNING */
2010-04-20 03:59:48 +01:00
}
return ( FALSE ) ;
}
2011-06-21 15:19:07 +01:00
static Int p_yapor_start ( USES_REGS1 ) {
# 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
}
2011-06-21 15:19:07 +01:00
static Int p_yapor_workers ( USES_REGS1 ) {
# ifdef YAPOR_THREADS
return Yap_unify ( MkIntegerTerm ( GLOBAL_number_workers ) , ARG1 ) ;
# 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
2001-04-09 20:54:03 +01:00
2011-06-21 15:19:07 +01:00
static Int p_worker ( USES_REGS1 ) {
CurrentModule = USER_MODULE ;
P = GETWORK_FIRST_TIME ;
return TRUE ;
2001-04-09 20:54:03 +01:00
}
2011-03-07 16:02:55 +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 20:54:03 +01: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 20:54:03 +01: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 20:54:03 +01: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 ) ;
}
2012-01-05 16:04:32 +00:00
static Int p_parallel_get_answers ( USES_REGS1 ) {
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 ) ;
}
2011-03-07 16:02:55 +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 */
2011-05-25 18:38:46 +01:00
IOSTREAM * 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 ;
2011-05-25 18:38:46 +01:00
Sfprintf ( 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 ) ;
Sfprintf ( out , " Memory in use (I): %10ld bytes \n \n " , bytes ) ;
total_bytes + = bytes ;
bytes = 0 ;
2011-05-25 18:38:46 +01:00
Sfprintf ( 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 ) ;
Sfprintf ( out , " Memory in use (II): %10ld bytes \n \n " , bytes ) ;
total_bytes + = bytes ;
2011-04-28 09:48:42 +01:00
# ifdef USE_PAGES_MALLOC
2011-06-02 17:01:00 +01:00
Sfprintf ( 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 ) ;
2011-05-25 18:38:46 +01:00
Sfprintf ( out , " Total memory allocated: %10ld bytes (%ld pages in total) \n " ,
2012-05-14 19:11:58 +01:00
PgEnt_pages_in_use ( GLOBAL_pages_alloc ) * Yap_page_size , PgEnt_pages_in_use ( GLOBAL_pages_alloc ) ) ;
2010-04-20 03:59:48 +01:00
# else
2011-06-02 17:01:00 +01:00
Sfprintf ( 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 20:54:03 +01:00
}
2010-04-20 03:59:48 +01:00
# endif /* YAPOR */
2001-04-09 20:54:03 +01:00
2005-07-11 20:17:32 +01:00
2010-04-20 03:59:48 +01:00
/**********************************
* * OPTYap C Predicates * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-07-11 20:17:32 +01:00
2010-04-20 03:59:48 +01:00
# if defined(YAPOR) && defined(TABLING)
2011-03-07 16:02:55 +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 */
2012-04-23 15:39:49 +01:00
IOSTREAM * 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 ;
2011-05-25 18:38:46 +01:00
Sfprintf ( 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 ) ;
Sfprintf ( out , " Memory in use (I): %10ld bytes \n \n " , bytes ) ;
total_bytes + = bytes ;
bytes = 0 ;
2011-05-25 18:38:46 +01:00
Sfprintf ( 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 */
Sfprintf ( out , " Memory in use (II): %10ld bytes \n \n " , bytes ) ;
total_bytes + = bytes ;
bytes = 0 ;
2011-05-25 18:38:46 +01:00
Sfprintf ( 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 ) ;
Sfprintf ( out , " Memory in use (III): %10ld bytes \n \n " , bytes ) ;
total_bytes + = bytes ;
bytes = 0 ;
2011-05-25 18:38:46 +01:00
Sfprintf ( 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 */
2011-12-09 16:06:17 +00:00
Sfprintf ( out , " Memory in use (IV): %10ld bytes \n \n " , bytes ) ;
total_bytes + = bytes ;
2011-04-28 09:48:42 +01:00
# ifdef USE_PAGES_MALLOC
2011-05-25 18:38:46 +01:00
Sfprintf ( 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 ) ;
2011-05-25 18:38:46 +01:00
Sfprintf ( out , " Total memory allocated: %10ld bytes (%ld pages in total) \n " ,
2012-05-14 19:11:58 +01:00
PgEnt_pages_in_use ( GLOBAL_pages_alloc ) * Yap_page_size , PgEnt_pages_in_use ( GLOBAL_pages_alloc ) ) ;
2010-04-20 03:59:48 +01:00
# else
2011-05-25 18:38:46 +01:00
Sfprintf ( 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 20:17:32 +01:00
return ( TRUE ) ;
}
2010-04-20 03:59:48 +01:00
# endif /* YAPOR && TABLING */
2001-04-09 20:54:03 +01:00
2011-03-07 16:02:55 +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
2011-12-07 13:53:20 +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 ) ;
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)
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 ) ;
if ( value ! = 0 ) structs = PgEnt_strs_in_use ( stats ) ;
2011-12-07 13:53:20 +00:00
}
# endif
2012-05-14 19:11:58 +01:00
if ( value = = 0 | | value = = 2 ) { /* subgoal_frames */
GET_PAGE_STATS ( stats , struct subgoal_frame , _pages_sg_fr ) ;
bytes + = PgEnt_bytes_in_use ( stats ) ;
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 ( 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 ) ;
if ( value ! = 0 ) structs = PgEnt_strs_in_use ( stats ) ;
2005-04-07 18:56:58 +01:00
}
2011-12-07 13:53:20 +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 ) ;
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 ( 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 ) ;
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 ( 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 ) ;
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 ( 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 ) ;
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)
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 ) ;
if ( value ! = 0 ) structs = PgEnt_strs_in_use ( stats ) ;
2001-04-09 20:54:03 +01:00
}
2012-05-14 19:11:58 +01:00
# endif
2011-12-07 13:53:20 +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 ) ;
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 ( 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 ) ;
if ( value ! = 0 ) structs = PgEnt_strs_in_use ( stats ) ;
2010-04-20 03:59:48 +01:00
}
# endif /* TABLING */
# ifdef YAPOR
2011-12-07 13:53:20 +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 ) ;
if ( value ! = 0 ) structs = PgEnt_strs_in_use ( stats ) ;
2003-11-05 16:12:25 +00:00
}
2011-12-07 13:53:20 +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 ) ;
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 ( 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 ) ;
if ( value ! = 0 ) structs = PgEnt_strs_in_use ( stats ) ;
2010-04-20 03:59:48 +01:00
}
# endif /* YAPOR */
# if defined(YAPOR) && defined(TABLING)
2011-12-07 13:53:20 +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 ) ;
if ( value ! = 0 ) structs = PgEnt_strs_in_use ( stats ) ;
2010-04-20 03:59:48 +01:00
}
# ifdef TABLING_INNER_CUTS
2011-12-07 13:53:20 +00:00
if ( value = = 0 | | value = = 14 ) { /* table_subgoal_solution_frames */
2012-05-14 19:11:58 +01:00
GET_PAGE_STATS ( stats , struct table_subgoal_solution_frame , _pages_tg_sol_fr ) ;
bytes + = PgEnt_bytes_in_use ( stats ) ;
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 ( 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 ) ;
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
if ( value = = 0 ) { /* total_memory */
# 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 ) ) {
2014-05-29 10:32:28 +01:00
YapBind ( ( CELL * ) tbytes , MkIntTerm ( bytes ) ) ;
2010-04-20 03:59:48 +01:00
} else if ( IsIntTerm ( tbytes ) & & IntOfTerm ( tbytes ) ! = bytes )
return ( FALSE ) ;
if ( IsVarTerm ( tstructs ) ) {
2014-05-29 10:32:28 +01:00
YapBind ( ( CELL * ) tstructs , MkIntTerm ( structs ) ) ;
2010-04-20 03:59:48 +01:00
} else if ( IsIntTerm ( tstructs ) & & IntOfTerm ( tstructs ) ! = structs )
return ( FALSE ) ;
2005-07-11 20:17:32 +01:00
return ( TRUE ) ;
}
2010-04-16 03:07:37 +01:00
2010-04-20 03:59:48 +01:00
/******************************
* * Local functions * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-07-11 20:17:32 +01: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 20:17:32 +01:00
}
2010-04-20 03:59:48 +01:00
# endif /* YAPOR */
2005-07-11 20:17:32 +01:00
2001-04-09 20:54:03 +01:00
2010-04-20 03:59:48 +01:00
# ifdef TABLING
2011-12-09 16:06:17 +00:00
static inline struct page_statistics show_statistics_table_entries ( IOSTREAM * out ) {
2012-05-14 19:11:58 +01:00
SHOW_PAGE_STATS ( out , struct table_entry , _pages_tab_ent , " Table entries: " ) ;
2005-07-11 20:17:32 +01:00
}
2011-12-22 16:50:20 +00:00
2011-12-09 16:06:17 +00:00
# if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
static inline struct page_statistics show_statistics_subgoal_entries ( IOSTREAM * out ) {
2012-05-14 19:11:58 +01:00
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 */
2011-12-22 16:50:20 +00:00
2011-12-09 16:06:17 +00:00
static inline struct page_statistics show_statistics_subgoal_frames ( IOSTREAM * out ) {
2012-05-14 19:11:58 +01:00
SHOW_PAGE_STATS ( out , struct subgoal_frame , _pages_sg_fr , " Subgoal frames: " ) ;
2005-07-11 20:17:32 +01:00
}
2011-12-22 16:50:20 +00:00
2011-12-09 16:06:17 +00:00
static inline struct page_statistics show_statistics_dependency_frames ( IOSTREAM * out ) {
2012-05-14 19:11:58 +01:00
SHOW_PAGE_STATS ( out , struct dependency_frame , _pages_dep_fr , " Dependency frames: " ) ;
2005-07-11 20:17:32 +01:00
}
2001-04-09 20:54:03 +01:00
2011-12-22 16:50:20 +00:00
2011-12-09 16:06:17 +00:00
static inline struct page_statistics show_statistics_subgoal_trie_nodes ( IOSTREAM * out ) {
2012-05-14 19:11:58 +01:00
SHOW_PAGE_STATS ( out , struct subgoal_trie_node , _pages_sg_node , " Subgoal trie nodes: " ) ;
2005-07-11 20:17:32 +01:00
}
2011-12-22 16:50:20 +00:00
2011-12-09 16:06:17 +00:00
static inline struct page_statistics show_statistics_subgoal_trie_hashes ( IOSTREAM * out ) {
2012-05-14 19:11:58 +01:00
SHOW_PAGE_STATS ( out , struct subgoal_trie_hash , _pages_sg_hash , " Subgoal trie hashes: " ) ;
2005-07-11 20:17:32 +01:00
}
2001-04-09 20:54:03 +01:00
2011-12-22 16:50:20 +00:00
2011-12-09 16:06:17 +00:00
static inline struct page_statistics show_statistics_answer_trie_nodes ( IOSTREAM * out ) {
2012-05-14 19:11:58 +01:00
SHOW_PAGE_STATS ( out , struct answer_trie_node , _pages_ans_node , " Answer trie nodes: " ) ;
2005-07-11 20:17:32 +01:00
}
2011-12-22 16:50:20 +00:00
2011-12-09 16:06:17 +00:00
static inline struct page_statistics show_statistics_answer_trie_hashes ( IOSTREAM * out ) {
2012-05-14 19:11:58 +01:00
SHOW_PAGE_STATS ( out , struct answer_trie_hash , _pages_ans_hash , " Answer trie hashes: " ) ;
2005-07-11 20:17:32 +01:00
}
2011-12-22 16:50:20 +00:00
2011-12-09 16:06:17 +00:00
# if defined(THREADS_FULL_SHARING)
static inline struct page_statistics show_statistics_answer_ref_nodes ( IOSTREAM * out ) {
2012-05-14 19:11:58 +01:00
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 */
2011-12-22 16:50:20 +00:00
2011-12-09 16:06:17 +00:00
static inline struct page_statistics show_statistics_global_trie_nodes ( IOSTREAM * out ) {
2012-05-14 19:11:58 +01:00
SHOW_PAGE_STATS ( out , struct global_trie_node , _pages_gt_node , " Global trie nodes: " ) ;
2005-07-11 20:17:32 +01:00
}
2011-12-22 16:50:20 +00:00
2011-12-09 16:06:17 +00:00
static inline struct page_statistics show_statistics_global_trie_hashes ( IOSTREAM * out ) {
2012-05-14 19:11:58 +01:00
SHOW_PAGE_STATS ( out , struct global_trie_hash , _pages_gt_hash , " Global trie hashes: " ) ;
2005-07-11 20:17:32 +01:00
}
2010-04-20 03:59:48 +01:00
# endif /* TABLING */
2005-07-11 20:17:32 +01:00
2010-04-20 03:59:48 +01:00
# ifdef YAPOR
2011-12-09 16:06:17 +00:00
static inline struct page_statistics show_statistics_or_frames ( IOSTREAM * out ) {
2012-05-14 19:11:58 +01:00
SHOW_PAGE_STATS ( out , struct or_frame , _pages_or_fr , " Or-frames: " ) ;
2005-07-11 20:17:32 +01:00
}
2011-12-22 16:50:20 +00:00
2011-12-09 16:06:17 +00:00
static inline struct page_statistics show_statistics_query_goal_solution_frames ( IOSTREAM * out ) {
2012-05-14 19:11:58 +01:00
SHOW_PAGE_STATS ( out , struct query_goal_solution_frame , _pages_qg_sol_fr , " Query goal solution frames: " ) ;
2005-07-11 20:17:32 +01:00
}
2011-12-22 16:50:20 +00:00
2011-12-09 16:06:17 +00:00
static inline struct page_statistics show_statistics_query_goal_answer_frames ( IOSTREAM * out ) {
2012-05-14 19:11:58 +01:00
SHOW_PAGE_STATS ( out , struct query_goal_answer_frame , _pages_qg_ans_fr , " Query goal answer frames: " ) ;
2005-07-11 20:17:32 +01: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)
2011-12-09 16:06:17 +00:00
static inline struct page_statistics show_statistics_suspension_frames ( IOSTREAM * out ) {
2012-05-14 19:11:58 +01:00
SHOW_PAGE_STATS ( out , struct suspension_frame , _pages_susp_fr , " Suspension frames: " ) ;
2009-09-27 02:31:31 +01:00
}
2011-12-22 16:50:20 +00:00
2010-04-20 03:59:48 +01:00
# ifdef TABLING_INNER_CUTS
2011-12-09 16:06:17 +00:00
static inline struct page_statistics show_statistics_table_subgoal_solution_frames ( IOSTREAM * out ) {
2012-05-14 19:11:58 +01:00
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 20:54:03 +01:00
2011-12-22 16:50:20 +00:00
2011-12-09 16:06:17 +00:00
static inline struct page_statistics show_statistics_table_subgoal_answer_frames ( IOSTREAM * out ) {
2012-05-14 19:11:58 +01:00
SHOW_PAGE_STATS ( out , struct table_subgoal_answer_frame , _pages_tg_ans_fr , " Table subgoal answer frames: " ) ;
2001-04-09 20:54:03 +01:00
}
2010-04-20 03:59:48 +01:00
# endif /* TABLING_INNER_CUTS */
2005-07-11 20:17:32 +01:00
# endif /* YAPOR && TABLING */
2001-04-09 20:54:03 +01:00
# endif /* YAPOR || TABLING */