1 /************************************************************************ 2 ** ** 3 ** The YapTab/YapOr/OPTYap systems ** 4 ** ** 5 ** YapTab extends the Yap Prolog engine to support sequential tabling ** 6 ** YapOr extends the Yap Prolog engine to support or-parallelism ** 7 ** OPTYap extends the Yap Prolog engine to support or-parallel tabling ** 8 ** ** 9 ** ** 10 ** Yap Prolog was developed at University of Porto, Portugal ** 11 ** ** 12 ************************************************************************/ 13 14 /* ----------------------- ** 15 ** Struct worker ** 16 ** ----------------------- */ 17 18 extern struct worker{ 19 void *worker_area[MAX_WORKERS]; 20 long worker_offset[MAX_WORKERS]; 21 } WORKER; 22 23 #define worker_area(W) (WORKER.worker_area[W]) 24 #define worker_offset(W) (WORKER.worker_offset[W]) 25 26 27 28 /* ------------------------- ** 29 ** Struct or_frame ** 30 ** ------------------------- */ 31 32 typedef struct or_frame { 33 lockvar lock; 34 yamop *alternative; 35 volatile bitmap members; 36 #ifdef THREADS 37 Int node_offset; 38 #else 39 choiceptr node; 40 #endif 41 struct or_frame *nearest_livenode; 42 /* cut support */ 43 int depth; 44 #ifdef THREADS 45 Int pending_prune_cp_offset; 46 #else 47 choiceptr pending_prune_cp; 48 #endif 49 volatile int pending_prune_ltt; 50 struct or_frame *nearest_leftnode; 51 struct query_goal_solution_frame *query_solutions; 52 #ifdef TABLING_INNER_CUTS 53 struct table_subgoal_solution_frame *table_solutions; 54 #endif /* TABLING_INNER_CUTS */ 55 #ifdef TABLING 56 /* tabling support */ 57 volatile int number_owners; 58 struct or_frame *next_on_stack; 59 struct suspension_frame *suspensions; 60 struct or_frame *nearest_suspension_node; 61 #endif /* TABLING */ 62 struct or_frame *next; 63 } *or_fr_ptr; 64 65 #define OrFr_lock(X) ((X)->lock) 66 #define OrFr_alternative(X) ((X)->alternative) 67 #define OrFr_members(X) ((X)->members) 68 #ifdef THREADS 69 #define GetOrFr_node(X) offset_to_cptr((X)->node_offset) 70 #define SetOrFr_node(X,V) ((X)->node_offset = cptr_to_offset(V)) 71 #else 72 #define OrFr_node(X) ((X)->node) 73 #define GetOrFr_node(X) ((X)->node) 74 #define SetOrFr_node(X,V) ((X)->node = V) 75 #endif 76 #define OrFr_nearest_livenode(X) ((X)->nearest_livenode) 77 #define OrFr_depth(X) ((X)->depth) 78 #ifdef THREADS 79 #define Get_OrFr_pend_prune_cp(X) offset_to_cptr_with_null((X)->pending_prune_cp_offset) 80 #define Set_OrFr_pend_prune_cp(X,V) ((X)->pending_prune_cp_offset = cptr_to_offset_with_null(V)) 81 #else 82 #define OrFr_pend_prune_cp(X) ((X)->pending_prune_cp) 83 #define Get_OrFr_pend_prune_cp(X) ((X)->pending_prune_cp) 84 #define Set_OrFr_pend_prune_cp(X,V) ((X)->pending_prune_cp = (V)) 85 #endif 86 #define OrFr_pend_prune_ltt(X) ((X)->pending_prune_ltt) 87 #define OrFr_nearest_leftnode(X) ((X)->nearest_leftnode) 88 #define OrFr_qg_solutions(X) ((X)->query_solutions) 89 #define OrFr_tg_solutions(X) ((X)->table_solutions) 90 #define OrFr_owners(X) ((X)->number_owners) 91 #ifdef TABLING 92 #define OrFr_next_on_stack(X) ((X)->next_on_stack) 93 #else 94 #define OrFr_next_on_stack(X) ((X)->next) 95 #endif /* TABLING */ 96 #define OrFr_suspensions(X) ((X)->suspensions) 97 #define OrFr_nearest_suspnode(X) ((X)->nearest_suspension_node) 98 #define OrFr_next(X) ((X)->next) 99 100 101 102 /* ------------------------------------------ ** 103 ** Struct query_goal_solution_frame ** 104 ** ------------------------------------------ */ 105 106 typedef struct query_goal_solution_frame{ 107 volatile int ltt; 108 struct query_goal_answer_frame *first; 109 struct query_goal_answer_frame *last; 110 struct query_goal_solution_frame *next; 111 } *qg_sol_fr_ptr; 112 113 #define SolFr_ltt(X) ((X)->ltt) 114 #define SolFr_first(X) ((X)->first) 115 #define SolFr_last(X) ((X)->last) 116 #define SolFr_next(X) ((X)->next) 117 118 119 120 /* ---------------------------------------- ** 121 ** Struct query_goal_answer_frame ** 122 ** ---------------------------------------- */ 123 124 typedef struct query_goal_answer_frame{ 125 char answer[MAX_LENGTH_ANSWER]; 126 struct query_goal_answer_frame *next; 127 } *qg_ans_fr_ptr; 128 129 #define AnsFr_answer(X) ((X)->answer) 130 #define AnsFr_next(X) ((X)->next) 131 132 133 134 #ifdef TABLING_INNER_CUTS 135 /* --------------------------------------------- ** 136 ** Struct table_subgoal_solution_frame ** 137 ** --------------------------------------------- */ 138 139 typedef struct table_subgoal_solution_frame{ 140 choiceptr generator_choice_point; 141 volatile int ltt; 142 struct table_subgoal_answer_frame *first_answer_frame; 143 struct table_subgoal_answer_frame *last_answer_frame; 144 struct table_subgoal_solution_frame *ltt_next; 145 struct table_subgoal_solution_frame *next; 146 } *tg_sol_fr_ptr; 147 148 #define TgSolFr_gen_cp(X) ((X)->generator_choice_point) 149 #define TgSolFr_ltt(X) ((X)->ltt) 150 #define TgSolFr_first(X) ((X)->first_answer_frame) 151 #define TgSolFr_last(X) ((X)->last_answer_frame) 152 #define TgSolFr_ltt_next(X) ((X)->ltt_next) 153 #define TgSolFr_next(X) ((X)->next) 154 155 156 157 /* ------------------------------------------- ** 158 ** Struct table_subgoal_answer_frame ** 159 ** ------------------------------------------- */ 160 161 typedef struct table_subgoal_answer_frame{ 162 volatile int next_free_slot; 163 struct answer_trie_node *answer[TG_ANSWER_SLOTS]; 164 struct table_subgoal_answer_frame *next; 165 } *tg_ans_fr_ptr; 166 167 #define TgAnsFr_free_slot(X) ((X)->next_free_slot) 168 #define TgAnsFr_answer(X,N) ((X)->answer[N]) 169 #define TgAnsFr_next(X) ((X)->next) 170 #endif /* TABLING_INNER_CUTS */ 171