599 lines
26 KiB
C
599 lines
26 KiB
C
/************************************************************************
|
|
** **
|
|
** 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 **
|
|
** **
|
|
************************************************************************/
|
|
|
|
/**********************
|
|
** typedefs **
|
|
**********************/
|
|
|
|
typedef double realtime;
|
|
typedef unsigned long bitmap;
|
|
|
|
#ifdef YAPOR_THREADS
|
|
/* Threads may not assume addresses are the same at different workers */
|
|
static inline choiceptr offset_to_cptr(Int node) {
|
|
CACHE_REGS
|
|
return (choiceptr)(LCL0+node);
|
|
}
|
|
|
|
static inline Int cptr_to_offset(choiceptr node) {
|
|
CACHE_REGS
|
|
return (Int)((CELL *)node-LCL0);
|
|
}
|
|
|
|
static inline choiceptr offset_to_cptr_with_null(Int node) {
|
|
CACHE_REGS
|
|
if (node == 0L) return NULL;
|
|
return (choiceptr)(LCL0+node);
|
|
}
|
|
|
|
static inline Int cptr_to_offset_with_null(choiceptr node) {
|
|
CACHE_REGS
|
|
if (node == NULL) return 0L;
|
|
return (Int)((CELL *)node-LCL0);
|
|
}
|
|
#endif /* YAPOR_THREADS */
|
|
|
|
|
|
|
|
/**************************************************
|
|
** ma_h_inner_struct and ma_hash_entry **
|
|
**************************************************/
|
|
|
|
#if (defined(TABLING) || !defined(YAPOR_COW)) && defined(MULTI_ASSIGNMENT_VARIABLES)
|
|
#define MAVARS_HASH_SIZE 512
|
|
|
|
typedef struct ma_h_entry {
|
|
CELL* addr;
|
|
struct ma_h_entry *next;
|
|
} ma_h_inner_struct;
|
|
|
|
typedef struct {
|
|
UInt timestmp;
|
|
struct ma_h_entry val;
|
|
} ma_hash_entry;
|
|
#endif /* (TABLING || !YAPOR_COW) && MULTI_ASSIGNMENT_VARIABLES */
|
|
|
|
|
|
|
|
/***************************************
|
|
** threads_dependency_frame **
|
|
***************************************/
|
|
|
|
#ifdef THREADS_CONSUMER_SHARING
|
|
struct threads_dependency_frame {
|
|
lockvar lock;
|
|
enum {
|
|
working,
|
|
idle,
|
|
completing
|
|
} state;
|
|
int terminator;
|
|
int next;
|
|
};
|
|
#endif /* THREADS_CONSUMER_SHARING */
|
|
|
|
#define ThDepFr_lock(X) ((X).lock)
|
|
#define ThDepFr_state(X) ((X).state)
|
|
#define ThDepFr_terminator(X) ((X).terminator)
|
|
#define ThDepFr_next(X) ((X).next)
|
|
|
|
|
|
|
|
/**************************
|
|
** page_header **
|
|
**************************/
|
|
|
|
#ifdef USE_PAGES_MALLOC
|
|
typedef struct page_header {
|
|
volatile int structs_in_use;
|
|
void *allocated_area;
|
|
void *first_free_struct;
|
|
struct page_header *previous;
|
|
struct page_header *next;
|
|
} *pg_hd_ptr;
|
|
#endif /* USE_PAGES_MALLOC */
|
|
|
|
#define PgHd_strs_in_use(X) ((X)->structs_in_use)
|
|
#define PgHd_alloc_area(X) ((X)->allocated_area)
|
|
#define PgHd_first_str(X) ((X)->first_free_struct)
|
|
#define PgHd_previous(X) ((X)->previous)
|
|
#define PgHd_next(X) ((X)->next)
|
|
|
|
|
|
|
|
/*****************************************
|
|
** global_page and local_page **
|
|
*****************************************/
|
|
|
|
struct global_page_entry {
|
|
#if defined(YAPOR) || defined(THREADS)
|
|
lockvar lock;
|
|
#endif /* YAPOR || THREADS */
|
|
#ifdef USE_PAGES_MALLOC
|
|
struct page_header *first_page;
|
|
struct page_header *last_page;
|
|
int structs_per_page;
|
|
volatile long pages_in_use;
|
|
#endif /* USE_PAGES_MALLOC */
|
|
volatile long structs_in_use;
|
|
};
|
|
|
|
struct local_page_entry {
|
|
#ifdef USE_PAGES_MALLOC
|
|
struct page_header *first_page;
|
|
struct page_header *last_page;
|
|
int structs_per_page;
|
|
long pages_in_use;
|
|
#endif /* USE_PAGES_MALLOC */
|
|
long structs_in_use;
|
|
};
|
|
|
|
#define PgEnt_lock(X) ((X).lock)
|
|
#define PgEnt_first(X) ((X).first_page)
|
|
#define PgEnt_last(X) ((X).last_page)
|
|
#define PgEnt_strs_per_page(X) ((X).structs_per_page)
|
|
#define PgEnt_pages_in_use(X) ((X).pages_in_use)
|
|
#define PgEnt_strs_in_use(X) ((X).structs_in_use)
|
|
#define PgEnt_strs_free(X) (PgEnt_pg_in_use(X) * PgEnt_str_per_pg(X) - PgEnt_str_in_use(X))
|
|
|
|
|
|
|
|
/***************************
|
|
** global_pages **
|
|
***************************/
|
|
|
|
struct global_pages {
|
|
#ifdef USE_PAGES_MALLOC
|
|
struct global_page_entry alloc_pages;
|
|
struct global_page_entry void_pages;
|
|
#endif /* USE_PAGES_MALLOC */
|
|
|
|
#ifdef TABLING
|
|
struct global_page_entry table_entry_pages;
|
|
#if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
|
|
struct global_page_entry subgoal_entry_pages;
|
|
#endif
|
|
struct global_page_entry subgoal_frame_pages;
|
|
struct global_page_entry dependency_frame_pages;
|
|
struct global_page_entry subgoal_trie_node_pages;
|
|
struct global_page_entry subgoal_trie_hash_pages;
|
|
struct global_page_entry answer_trie_node_pages;
|
|
struct global_page_entry answer_trie_hash_pages;
|
|
#if defined(THREADS_FULL_SHARING)
|
|
struct global_page_entry answer_ref_node_pages;
|
|
#endif
|
|
struct global_page_entry global_trie_node_pages;
|
|
struct global_page_entry global_trie_hash_pages;
|
|
#endif /* TABLING */
|
|
|
|
#ifdef YAPOR
|
|
struct global_page_entry or_frame_pages;
|
|
struct global_page_entry query_goal_solution_frame_pages;
|
|
struct global_page_entry query_goal_answer_frame_pages;
|
|
#ifdef TABLING
|
|
struct global_page_entry suspension_frame_pages;
|
|
#endif
|
|
#ifdef TABLING_INNER_CUTS
|
|
struct global_page_entry table_subgoal_solution_frame_pages;
|
|
struct global_page_entry table_subgoal_answer_frame_pages;
|
|
#endif
|
|
#endif /* YAPOR */
|
|
};
|
|
|
|
|
|
|
|
/**************************
|
|
** local_pages **
|
|
**************************/
|
|
|
|
#if defined(TABLING) && (defined(YAPOR) || defined(THREADS))
|
|
struct local_pages {
|
|
#ifdef YAPOR
|
|
struct answer_trie_node *next_free_answer_trie_node;
|
|
#elif THREADS
|
|
#ifdef USE_PAGES_MALLOC
|
|
struct local_page_entry void_pages;
|
|
#endif
|
|
struct local_page_entry table_entry_pages;
|
|
#if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
|
|
struct local_page_entry subgoal_entry_pages;
|
|
#endif
|
|
struct local_page_entry subgoal_frame_pages;
|
|
struct local_page_entry dependency_frame_pages;
|
|
struct local_page_entry subgoal_trie_node_pages;
|
|
struct local_page_entry subgoal_trie_hash_pages;
|
|
struct local_page_entry answer_trie_node_pages;
|
|
struct local_page_entry answer_trie_hash_pages;
|
|
#if defined(THREADS_FULL_SHARING)
|
|
struct local_page_entry answer_ref_node_pages;
|
|
#endif
|
|
struct local_page_entry global_trie_node_pages;
|
|
struct local_page_entry global_trie_hash_pages;
|
|
#endif
|
|
};
|
|
#endif /* TABLING && (YAPOR || THREADS) */
|
|
|
|
|
|
|
|
/**********************************
|
|
** global_optyap_locks **
|
|
**********************************/
|
|
|
|
#ifdef YAPOR
|
|
struct global_optyap_locks {
|
|
lockvar bitmap_idle_workers;
|
|
lockvar bitmap_root_cp_workers;
|
|
lockvar bitmap_invisible_workers;
|
|
lockvar bitmap_requestable_workers;
|
|
lockvar bitmap_finished_workers;
|
|
#ifdef TABLING_INNER_CUTS
|
|
lockvar bitmap_pruning_workers;
|
|
#endif /* TABLING_INNER_CUTS */
|
|
|
|
int who_locked_heap;
|
|
lockvar heap_access;
|
|
lockvar alloc_block;
|
|
};
|
|
#endif /* YAPOR */
|
|
|
|
|
|
|
|
/***********************************
|
|
** local_optyap_signals **
|
|
***********************************/
|
|
|
|
#ifdef YAPOR
|
|
struct local_optyap_signals {
|
|
#if defined(YAPOR_COPY) || defined(YAPOR_THREADS)
|
|
lockvar lock;
|
|
volatile enum {
|
|
Q_idle = 0,
|
|
trail = 1,
|
|
global = 2,
|
|
local = 3,
|
|
P_idle = 4
|
|
} P_fase, Q_fase;
|
|
#endif /* YAPOR_COPY || YAPOR_THREADS */
|
|
volatile enum {
|
|
no_sharing = 0,
|
|
sharing = 1,
|
|
nodes_shared = 2,
|
|
copy_done = 3,
|
|
worker_ready = 4
|
|
} reply_signal;
|
|
};
|
|
#endif /* YAPOR */
|
|
|
|
|
|
|
|
/*********************************
|
|
** global_optyap_data **
|
|
*********************************/
|
|
|
|
struct global_optyap_data {
|
|
/* global data related to memory management */
|
|
struct global_pages pages;
|
|
|
|
#ifdef YAPOR
|
|
/* global static data */
|
|
int scheduler_loop;
|
|
int delayed_release_load;
|
|
int number_workers;
|
|
int worker_pid[MAX_WORKERS];
|
|
|
|
#ifdef YAPOR_COW
|
|
int master_worker;
|
|
#endif /* YAPOR_COW */
|
|
|
|
/* global data related to or-parallelism */
|
|
realtime execution_time;
|
|
#ifdef YAPOR_THREADS
|
|
Int root_choice_point_offset;
|
|
#else
|
|
choiceptr root_choice_point;
|
|
#endif
|
|
struct or_frame *root_or_frame;
|
|
bitmap present_workers;
|
|
volatile bitmap idle_workers;
|
|
volatile bitmap root_cp_workers;
|
|
volatile bitmap invisible_workers;
|
|
volatile bitmap requestable_workers;
|
|
volatile bitmap finished_workers;
|
|
#ifdef TABLING_INNER_CUTS
|
|
volatile bitmap pruning_workers;
|
|
#endif /* TABLING_INNER_CUTS */
|
|
struct global_optyap_locks locks;
|
|
volatile unsigned int branch[MAX_WORKERS][MAX_BRANCH_DEPTH];
|
|
volatile char parallel_mode; /* PARALLEL_MODE_OFF / PARALLEL_MODE_ON / PARALLEL_MODE_RUNNING */
|
|
#endif /* YAPOR */
|
|
|
|
#ifdef TABLING
|
|
/* global data related to tabling */
|
|
struct global_trie_node *root_global_trie;
|
|
struct table_entry *root_table_entry;
|
|
#ifdef LIMIT_TABLING
|
|
int max_pages;
|
|
struct subgoal_frame *first_subgoal_frame;
|
|
struct subgoal_frame *last_subgoal_frame;
|
|
struct subgoal_frame *check_subgoal_frame;
|
|
#endif /* LIMIT_TABLING */
|
|
#ifdef YAPOR
|
|
struct dependency_frame *root_dependency_frame;
|
|
#endif /* YAPOR */
|
|
#ifdef THREADS_CONSUMER_SHARING
|
|
struct threads_dependency_frame threads_dependency_frame[MAX_THREADS];
|
|
#endif /*THREADS_CONSUMER_SHARING*/
|
|
CELL table_var_enumerator[MAX_TABLE_VARS];
|
|
#ifdef TRIE_LOCK_USING_GLOBAL_ARRAY
|
|
lockvar trie_locks[TRIE_LOCK_BUCKETS];
|
|
#endif /* TRIE_LOCK_USING_GLOBAL_ARRAY */
|
|
#ifdef TIMESTAMP_CHECK
|
|
long timestamp;
|
|
#endif /* TIMESTAMP_CHECK */
|
|
#endif /* TABLING */
|
|
};
|
|
|
|
#define GLOBAL_pages_alloc (GLOBAL_optyap_data.pages.alloc_pages)
|
|
#define GLOBAL_pages_void (GLOBAL_optyap_data.pages.void_pages)
|
|
#define GLOBAL_pages_tab_ent (GLOBAL_optyap_data.pages.table_entry_pages)
|
|
#define GLOBAL_pages_sg_ent (GLOBAL_optyap_data.pages.subgoal_entry_pages)
|
|
#define GLOBAL_pages_sg_fr (GLOBAL_optyap_data.pages.subgoal_frame_pages)
|
|
#define GLOBAL_pages_dep_fr (GLOBAL_optyap_data.pages.dependency_frame_pages)
|
|
#define GLOBAL_pages_sg_node (GLOBAL_optyap_data.pages.subgoal_trie_node_pages)
|
|
#define GLOBAL_pages_sg_hash (GLOBAL_optyap_data.pages.subgoal_trie_hash_pages)
|
|
#define GLOBAL_pages_ans_node (GLOBAL_optyap_data.pages.answer_trie_node_pages)
|
|
#define GLOBAL_pages_ans_hash (GLOBAL_optyap_data.pages.answer_trie_hash_pages)
|
|
#define GLOBAL_pages_ans_ref_node (GLOBAL_optyap_data.pages.answer_ref_node_pages)
|
|
#define GLOBAL_pages_gt_node (GLOBAL_optyap_data.pages.global_trie_node_pages)
|
|
#define GLOBAL_pages_gt_hash (GLOBAL_optyap_data.pages.global_trie_hash_pages)
|
|
#define GLOBAL_pages_or_fr (GLOBAL_optyap_data.pages.or_frame_pages)
|
|
#define GLOBAL_pages_qg_sol_fr (GLOBAL_optyap_data.pages.query_goal_solution_frame_pages)
|
|
#define GLOBAL_pages_qg_ans_fr (GLOBAL_optyap_data.pages.query_goal_answer_frame_pages)
|
|
#define GLOBAL_pages_susp_fr (GLOBAL_optyap_data.pages.suspension_frame_pages)
|
|
#define GLOBAL_pages_tg_sol_fr (GLOBAL_optyap_data.pages.table_subgoal_solution_frame_pages)
|
|
#define GLOBAL_pages_tg_ans_fr (GLOBAL_optyap_data.pages.table_subgoal_answer_frame_pages)
|
|
#define GLOBAL_scheduler_loop (GLOBAL_optyap_data.scheduler_loop)
|
|
#define GLOBAL_delayed_release_load (GLOBAL_optyap_data.delayed_release_load)
|
|
#define GLOBAL_number_workers (GLOBAL_optyap_data.number_workers)
|
|
#define GLOBAL_worker_pid(worker) (GLOBAL_optyap_data.worker_pid[worker])
|
|
#define GLOBAL_master_worker (GLOBAL_optyap_data.master_worker)
|
|
#define GLOBAL_execution_time (GLOBAL_optyap_data.execution_time)
|
|
#ifdef YAPOR_THREADS
|
|
#define Get_GLOBAL_root_cp() offset_to_cptr(GLOBAL_optyap_data.root_choice_point_offset)
|
|
#define Set_GLOBAL_root_cp(bptr) (GLOBAL_optyap_data.root_choice_point_offset = cptr_to_offset(bptr))
|
|
#else
|
|
#define GLOBAL_root_cp (GLOBAL_optyap_data.root_choice_point)
|
|
#define Get_GLOBAL_root_cp() (GLOBAL_optyap_data.root_choice_point)
|
|
#define Set_GLOBAL_root_cp(bptr) (GLOBAL_optyap_data.root_choice_point = (bptr))
|
|
#endif
|
|
#define GLOBAL_root_or_fr (GLOBAL_optyap_data.root_or_frame)
|
|
#define GLOBAL_bm_present_workers (GLOBAL_optyap_data.present_workers)
|
|
#define GLOBAL_bm_idle_workers (GLOBAL_optyap_data.idle_workers)
|
|
#define GLOBAL_bm_root_cp_workers (GLOBAL_optyap_data.root_cp_workers)
|
|
#define GLOBAL_bm_invisible_workers (GLOBAL_optyap_data.invisible_workers)
|
|
#define GLOBAL_bm_requestable_workers (GLOBAL_optyap_data.requestable_workers)
|
|
#define GLOBAL_bm_finished_workers (GLOBAL_optyap_data.finished_workers)
|
|
#define GLOBAL_bm_pruning_workers (GLOBAL_optyap_data.pruning_workers)
|
|
#define GLOBAL_locks_bm_idle_workers (GLOBAL_optyap_data.locks.bitmap_idle_workers)
|
|
#define GLOBAL_locks_bm_root_cp_workers (GLOBAL_optyap_data.locks.bitmap_root_cp_workers)
|
|
#define GLOBAL_locks_bm_invisible_workers (GLOBAL_optyap_data.locks.bitmap_invisible_workers)
|
|
#define GLOBAL_locks_bm_requestable_workers (GLOBAL_optyap_data.locks.bitmap_requestable_workers)
|
|
#define GLOBAL_locks_bm_finished_workers (GLOBAL_optyap_data.locks.bitmap_finished_workers)
|
|
#define GLOBAL_locks_bm_pruning_workers (GLOBAL_optyap_data.locks.bitmap_pruning_workers)
|
|
#define GLOBAL_locks_who_locked_heap (GLOBAL_optyap_data.locks.who_locked_heap)
|
|
#define GLOBAL_locks_heap_access (GLOBAL_optyap_data.locks.heap_access)
|
|
#define GLOBAL_locks_alloc_block (GLOBAL_optyap_data.locks.alloc_block)
|
|
#define GLOBAL_branch(worker, depth) (GLOBAL_optyap_data.branch[worker][depth])
|
|
#define GLOBAL_parallel_mode (GLOBAL_optyap_data.parallel_mode)
|
|
#define GLOBAL_root_gt (GLOBAL_optyap_data.root_global_trie)
|
|
#define GLOBAL_root_tab_ent (GLOBAL_optyap_data.root_table_entry)
|
|
#define GLOBAL_max_pages (GLOBAL_optyap_data.max_pages)
|
|
#define GLOBAL_first_sg_fr (GLOBAL_optyap_data.first_subgoal_frame)
|
|
#define GLOBAL_last_sg_fr (GLOBAL_optyap_data.last_subgoal_frame)
|
|
#define GLOBAL_check_sg_fr (GLOBAL_optyap_data.check_subgoal_frame)
|
|
#define GLOBAL_root_dep_fr (GLOBAL_optyap_data.root_dependency_frame)
|
|
#define GLOBAL_th_dep_fr(wid) (GLOBAL_optyap_data.threads_dependency_frame[wid])
|
|
#define GLOBAL_table_var_enumerator(index) (GLOBAL_optyap_data.table_var_enumerator[index])
|
|
#define GLOBAL_table_var_enumerator_addr(index) (GLOBAL_optyap_data.table_var_enumerator + (index))
|
|
#define GLOBAL_trie_locks(index) (GLOBAL_optyap_data.trie_locks[index])
|
|
#define GLOBAL_timestamp (GLOBAL_optyap_data.timestamp)
|
|
|
|
|
|
|
|
/********************************
|
|
** local_optyap_data **
|
|
********************************/
|
|
|
|
struct local_optyap_data {
|
|
#if defined(TABLING) && (defined(YAPOR) || defined(THREADS))
|
|
/* local data related to memory management */
|
|
struct local_pages pages;
|
|
#endif /* TABLING && (YAPOR || THREADS) */
|
|
|
|
#ifdef YAPOR
|
|
lockvar lock;
|
|
/* local data related to or-parallelism */
|
|
volatile int load;
|
|
#ifdef YAPOR_THREADS
|
|
Int top_choice_point_offset;
|
|
#else
|
|
choiceptr top_choice_point;
|
|
#endif /* YAPOR_THREADS */
|
|
struct or_frame *top_or_frame;
|
|
#ifdef YAPOR_THREADS
|
|
Int prune_request_offset;
|
|
#else
|
|
choiceptr prune_request;
|
|
#endif /* YAPOR_THREADS */
|
|
volatile int share_request;
|
|
struct local_optyap_signals share_signals;
|
|
volatile struct {
|
|
CELL start;
|
|
CELL end;
|
|
} global_copy, local_copy, trail_copy;
|
|
#endif /* YAPOR */
|
|
|
|
#ifdef TABLING
|
|
/* local data related to tabling */
|
|
struct subgoal_frame *top_subgoal_frame;
|
|
struct dependency_frame *top_dependency_frame;
|
|
#ifdef TABLING_INNER_CUTS
|
|
choiceptr bottom_pruning_scope;
|
|
#endif /* TABLING_INNER_CUTS */
|
|
#ifdef YAPOR
|
|
#ifdef YAPOR_THREADS
|
|
Int top_choice_point_on_stack_offset;
|
|
#else
|
|
choiceptr top_choice_point_on_stack;
|
|
#endif /* YAPOR_THREADS */
|
|
struct or_frame *top_or_frame_with_suspensions;
|
|
#endif /* YAPOR */
|
|
#ifdef OUTPUT_THREADS_TABLING
|
|
FILE *thread_output;
|
|
#endif /* OUTPUT_THREADS_TABLING */
|
|
#endif /* TABLING */
|
|
|
|
#if (defined(TABLING) || !defined(YAPOR_COW)) && defined(MULTI_ASSIGNMENT_VARIABLES)
|
|
UInt ma_timestamp;
|
|
ma_h_inner_struct *ma_h_top;
|
|
ma_hash_entry ma_hash_table[MAVARS_HASH_SIZE];
|
|
#endif /* (TABLING || !YAPOR_COW) && MULTI_ASSIGNMENT_VARIABLES */
|
|
};
|
|
|
|
#define LOCAL_pages_void (LOCAL_optyap_data.pages.void_pages)
|
|
#define LOCAL_pages_tab_ent (LOCAL_optyap_data.pages.table_entry_pages)
|
|
#define LOCAL_pages_sg_ent (LOCAL_optyap_data.pages.subgoal_entry_pages)
|
|
#define LOCAL_pages_sg_fr (LOCAL_optyap_data.pages.subgoal_frame_pages)
|
|
#define LOCAL_pages_dep_fr (LOCAL_optyap_data.pages.dependency_frame_pages)
|
|
#define LOCAL_pages_sg_node (LOCAL_optyap_data.pages.subgoal_trie_node_pages)
|
|
#define LOCAL_pages_sg_hash (LOCAL_optyap_data.pages.subgoal_trie_hash_pages)
|
|
#define LOCAL_pages_ans_node (LOCAL_optyap_data.pages.answer_trie_node_pages)
|
|
#define LOCAL_pages_ans_hash (LOCAL_optyap_data.pages.answer_trie_hash_pages)
|
|
#define LOCAL_pages_ans_ref_node (LOCAL_optyap_data.pages.answer_ref_node_pages)
|
|
#define LOCAL_pages_gt_node (LOCAL_optyap_data.pages.global_trie_node_pages)
|
|
#define LOCAL_pages_gt_hash (LOCAL_optyap_data.pages.global_trie_hash_pages)
|
|
#define LOCAL_next_free_ans_node (LOCAL_optyap_data.pages.next_free_answer_trie_node)
|
|
#define LOCAL_lock (LOCAL_optyap_data.lock)
|
|
#define LOCAL_load (LOCAL_optyap_data.load)
|
|
#ifdef YAPOR_THREADS
|
|
#define Get_LOCAL_top_cp() offset_to_cptr(LOCAL_optyap_data.top_choice_point_offset)
|
|
#define Set_LOCAL_top_cp(cpt) (LOCAL_optyap_data.top_choice_point_offset = cptr_to_offset(cpt))
|
|
#else
|
|
#define LOCAL_top_cp (LOCAL_optyap_data.top_choice_point)
|
|
#define Get_LOCAL_top_cp() (LOCAL_optyap_data.top_choice_point)
|
|
#define Set_LOCAL_top_cp(cpt) (LOCAL_optyap_data.top_choice_point = cpt)
|
|
#endif /* YAPOR_THREADS */
|
|
#define LOCAL_top_or_fr (LOCAL_optyap_data.top_or_frame)
|
|
#ifdef YAPOR_THREADS
|
|
#define Get_LOCAL_prune_request() offset_to_cptr_with_null(LOCAL_optyap_data.prune_request_offset)
|
|
#define Set_LOCAL_prune_request(cpt) (LOCAL_optyap_data.prune_request_offset = cptr_to_offset_with_null(cpt))
|
|
#else
|
|
#define LOCAL_prune_request (LOCAL_optyap_data.prune_request)
|
|
#define Get_LOCAL_prune_request() (LOCAL_optyap_data.prune_request)
|
|
#define Set_LOCAL_prune_request(cpt) (LOCAL_optyap_data.prune_request = cpt)
|
|
#endif /* YAPOR_THREADS */
|
|
#define LOCAL_share_request (LOCAL_optyap_data.share_request)
|
|
#define LOCAL_reply_signal (LOCAL_optyap_data.share_signals.reply_signal)
|
|
#define LOCAL_p_fase_signal (LOCAL_optyap_data.share_signals.P_fase)
|
|
#define LOCAL_q_fase_signal (LOCAL_optyap_data.share_signals.Q_fase)
|
|
#define LOCAL_lock_signals (LOCAL_optyap_data.share_signals.lock)
|
|
#define LOCAL_start_global_copy (LOCAL_optyap_data.global_copy.start)
|
|
#define LOCAL_end_global_copy (LOCAL_optyap_data.global_copy.end)
|
|
#define LOCAL_start_local_copy (LOCAL_optyap_data.local_copy.start)
|
|
#define LOCAL_end_local_copy (LOCAL_optyap_data.local_copy.end)
|
|
#define LOCAL_start_trail_copy (LOCAL_optyap_data.trail_copy.start)
|
|
#define LOCAL_end_trail_copy (LOCAL_optyap_data.trail_copy.end)
|
|
#define LOCAL_top_sg_fr (LOCAL_optyap_data.top_subgoal_frame)
|
|
#define LOCAL_top_dep_fr (LOCAL_optyap_data.top_dependency_frame)
|
|
#define LOCAL_pruning_scope (LOCAL_optyap_data.bottom_pruning_scope)
|
|
#ifdef YAPOR_THREADS
|
|
#define Get_LOCAL_top_cp_on_stack() offset_to_cptr(LOCAL_optyap_data.top_choice_point_on_stack_offset)
|
|
#define Set_LOCAL_top_cp_on_stack(cpt) (LOCAL_optyap_data.top_choice_point_on_stack_offset = cptr_to_offset(cpt))
|
|
#else
|
|
#define LOCAL_top_cp_on_stack (LOCAL_optyap_data.top_choice_point_on_stack)
|
|
#define Get_LOCAL_top_cp_on_stack() (LOCAL_optyap_data.top_choice_point_on_stack)
|
|
#define Set_LOCAL_top_cp_on_stack(cpt) (LOCAL_optyap_data.top_choice_point_on_stack = cpt)
|
|
#endif /* YAPOR_THREADS */
|
|
#define LOCAL_top_susp_or_fr (LOCAL_optyap_data.top_or_frame_with_suspensions)
|
|
#define LOCAL_thread_output (LOCAL_optyap_data.thread_output)
|
|
#define LOCAL_ma_timestamp (LOCAL_optyap_data.ma_timestamp)
|
|
#define LOCAL_ma_h_top (LOCAL_optyap_data.ma_h_top)
|
|
#define LOCAL_ma_hash_table (LOCAL_optyap_data.ma_hash_table)
|
|
|
|
#define REMOTE_pages_void(wid) (REMOTE(wid)->optyap_data_.pages.void_pages)
|
|
#define REMOTE_pages_tab_ent(wid) (REMOTE(wid)->optyap_data_.pages.table_entry_pages)
|
|
#define REMOTE_pages_sg_ent(wid) (REMOTE(wid)->optyap_data_.pages.subgoal_entry_pages)
|
|
#define REMOTE_pages_sg_fr(wid) (REMOTE(wid)->optyap_data_.pages.subgoal_frame_pages)
|
|
#define REMOTE_pages_dep_fr(wid) (REMOTE(wid)->optyap_data_.pages.dependency_frame_pages)
|
|
#define REMOTE_pages_sg_node(wid) (REMOTE(wid)->optyap_data_.pages.subgoal_trie_node_pages)
|
|
#define REMOTE_pages_sg_hash(wid) (REMOTE(wid)->optyap_data_.pages.subgoal_trie_hash_pages)
|
|
#define REMOTE_pages_ans_node(wid) (REMOTE(wid)->optyap_data_.pages.answer_trie_node_pages)
|
|
#define REMOTE_pages_ans_hash(wid) (REMOTE(wid)->optyap_data_.pages.answer_trie_hash_pages)
|
|
#define REMOTE_pages_ans_ref_node(wid) (REMOTE(wid)->optyap_data_.pages.answer_ref_node_pages)
|
|
#define REMOTE_pages_gt_node(wid) (REMOTE(wid)->optyap_data_.pages.global_trie_node_pages)
|
|
#define REMOTE_pages_gt_hash(wid) (REMOTE(wid)->optyap_data_.pages.global_trie_hash_pages)
|
|
#define REMOTE_next_free_ans_node(wid) (REMOTE(wid)->optyap_data_.pages.next_free_answer_trie_node)
|
|
#define REMOTE_lock(wid) (REMOTE(wid)->optyap_data_.lock)
|
|
#define REMOTE_load(wid) (REMOTE(wid)->optyap_data_.load)
|
|
#ifdef YAPOR_THREADS
|
|
#define REMOTE_top_cp(wid) offset_to_cptr(REMOTE(wid)->optyap_data_.top_choice_point_offset)
|
|
#define Set_REMOTE_top_cp(wid, bptr) (REMOTE(wid)->optyap_data_.top_choice_point_offset = cptr_to_offset(bptr))
|
|
#else
|
|
#define REMOTE_top_cp(wid) (REMOTE(wid)->optyap_data_.top_choice_point)
|
|
#define Set_REMOTE_top_cp(wid, bptr) (REMOTE(wid)->optyap_data_.top_choice_point = (bptr))
|
|
#endif /* YAPOR_THREADS */
|
|
#define REMOTE_top_or_fr(wid) (REMOTE(wid)->optyap_data_.top_or_frame)
|
|
#ifdef YAPOR_THREADS
|
|
#define Get_REMOTE_prune_request(wid) offset_to_cptr_with_null(REMOTE(wid)->optyap_data_.prune_request_offset)
|
|
#define Set_REMOTE_prune_request(wid,cp) (REMOTE(wid)->optyap_data_.prune_request_offset = cptr_to_offset_with_null(cp))
|
|
#else
|
|
#define REMOTE_prune_request(wid) (REMOTE(wid)->optyap_data_.prune_request)
|
|
#define Get_REMOTE_prune_request(wid) (REMOTE(wid)->optyap_data_.prune_request)
|
|
#define Set_REMOTE_prune_request(wid,cp) (REMOTE(wid)->optyap_data_.prune_request = cp)
|
|
#endif /* YAPOR_THREADS */
|
|
#define REMOTE_share_request(wid) (REMOTE(wid)->optyap_data_.share_request)
|
|
#define REMOTE_reply_signal(wid) (REMOTE(wid)->optyap_data_.share_signals.reply_signal)
|
|
#define REMOTE_p_fase_signal(wid) (REMOTE(wid)->optyap_data_.share_signals.P_fase)
|
|
#define REMOTE_q_fase_signal(wid) (REMOTE(wid)->optyap_data_.share_signals.Q_fase)
|
|
#define REMOTE_lock_signals(wid) (REMOTE(wid)->optyap_data_.share_signals.lock)
|
|
#define REMOTE_start_global_copy(wid) (REMOTE(wid)->optyap_data_.global_copy.start)
|
|
#define REMOTE_end_global_copy(wid) (REMOTE(wid)->optyap_data_.global_copy.end)
|
|
#define REMOTE_start_local_copy(wid) (REMOTE(wid)->optyap_data_.local_copy.start)
|
|
#define REMOTE_end_local_copy(wid) (REMOTE(wid)->optyap_data_.local_copy.end)
|
|
#define REMOTE_start_trail_copy(wid) (REMOTE(wid)->optyap_data_.trail_copy.start)
|
|
#define REMOTE_end_trail_copy(wid) (REMOTE(wid)->optyap_data_.trail_copy.end)
|
|
#define REMOTE_top_sg_fr(wid) (REMOTE(wid)->optyap_data_.top_subgoal_frame)
|
|
#define REMOTE_top_dep_fr(wid) (REMOTE(wid)->optyap_data_.top_dependency_frame)
|
|
#define REMOTE_pruning_scope(wid) (REMOTE(wid)->optyap_data_.bottom_pruning_scope)
|
|
#ifdef YAPOR_THREADS
|
|
#define REMOTE_top_cp_on_stack(wid) offset_to_cptr(REMOTE(wid)->optyap_data_.top_choice_point_on_stack_offset)
|
|
#define Set_REMOTE_top_cp_on_stack(wid, bptr) (REMOTE(wid)->optyap_data_.top_choice_point_on_stack_offset = cptr_to_offset(bptr))
|
|
#else
|
|
#define REMOTE_top_cp_on_stack(wid) (REMOTE(wid)->optyap_data_.top_choice_point_on_stack)
|
|
#define Set_REMOTE_top_cp_on_stack(wid, bptr) (REMOTE(wid)->optyap_data_.top_choice_point_on_stack = (bptr))
|
|
#endif /* YAPOR_THREADS */
|
|
#define REMOTE_top_susp_or_fr(wid) (REMOTE(wid)->optyap_data_.top_or_frame_with_suspensions)
|
|
#define REMOTE_thread_output(wid) (REMOTE(wid)->optyap_data_.thread_output)
|
|
#define REMOTE_ma_timestamp(wid) (REMOTE(wid)->optyap_data_.ma_timestamp)
|
|
#define REMOTE_ma_h_top(wid) (REMOTE(wid)->optyap_data_.ma_h_top)
|
|
#define REMOTE_ma_hash_table(wid) (REMOTE(wid)->optyap_data_.ma_hash_table)
|
|
|
|
#ifdef YAPOR
|
|
#include "or.structs.h"
|
|
#endif /* YAPOR */
|
|
|
|
|
|
#ifdef TABLING
|
|
#include "tab.structs.h"
|
|
#endif /* TABLING */
|