YAP 7.1.0
tab.structs.h
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** Table Space Data Structures **
16************************************************************************/
17
18/**************************
19** table_entry **
20**************************/
21
22typedef struct table_entry {
23#if defined(SUBGOAL_TRIE_LOCK_AT_ENTRY_LEVEL) || defined(THREADS_NO_SHARING)
24 lockvar lock;
25#endif /* SUBGOAL_TRIE_LOCK_AT_ENTRY_LEVEL || THREADS_NO_SHARING */
26 struct pred_entry *pred_entry;
27 Atom pred_atom;
28 int pred_arity;
29 short pred_flags;
30 short execution_mode; /* combines yap_flags with pred_flags */
31#ifdef MODE_DIRECTED_TABLING
32 int* mode_directed_array;
33#endif /* MODE_DIRECTED_TABLING */
34#ifdef THREADS_NO_SHARING
35 struct subgoal_trie_node *subgoal_trie[THREADS_NUM_BUCKETS];
36#else
37 struct subgoal_trie_node *subgoal_trie;
38#endif /* THREADS_NO_SHARING */
39 struct subgoal_trie_hash *hash_chain;
40 struct table_entry *next;
42
43#define TabEnt_lock(X) ((X)->lock)
44#define TabEnt_pe(X) ((X)->pred_entry)
45#define TabEnt_atom(X) ((X)->pred_atom)
46#define TabEnt_arity(X) ((X)->pred_arity)
47#define TabEnt_flags(X) ((X)->pred_flags)
48#define TabEnt_mode(X) ((X)->execution_mode)
49#define TabEnt_mode_directed(X) ((X)->mode_directed_array)
50#define TabEnt_subgoal_trie(X) ((X)->subgoal_trie)
51#define TabEnt_hash_chain(X) ((X)->hash_chain)
52#define TabEnt_next(X) ((X)->next)
53
54
55
56/***********************************************************************
57** subgoal_trie_node, answer_trie_node and global_trie_node **
58***********************************************************************/
59
60typedef struct subgoal_trie_node {
61 Term entry;
62 struct subgoal_trie_node *parent;
63 struct subgoal_trie_node *child;
64 struct subgoal_trie_node *next;
65#ifdef SUBGOAL_TRIE_LOCK_USING_NODE_FIELD
66 lockvar lock;
67#endif /* SUBGOAL_TRIE_LOCK_USING_NODE_FIELD */
69
70typedef struct answer_trie_node {
71 OPCODE trie_instruction; /* u.opc */
72#ifdef YAPOR
73 int or_arg; /* u.Otapl.or_arg */
74#endif /* YAPOR */
75 Term entry;
76 struct answer_trie_node *parent;
77 struct answer_trie_node *child;
78 struct answer_trie_node *next;
79#ifdef ANSWER_TRIE_LOCK_USING_NODE_FIELD
80 lockvar lock;
81#endif /* ANSWER_TRIE_LOCK_USING_NODE_FIELD */
83
84typedef struct global_trie_node {
85 Term entry;
86 struct global_trie_node *parent;
87 struct global_trie_node *child;
88 struct global_trie_node *next;
89#ifdef GLOBAL_TRIE_LOCK_USING_NODE_FIELD
90 lockvar lock;
91#endif /* GLOBAL_TRIE_LOCK_USING_NODE_FIELD */
93
94#define TrNode_instr(X) ((X)->trie_instruction)
95#define TrNode_or_arg(X) ((X)->or_arg)
96#define TrNode_entry(X) ((X)->entry)
97#define TrNode_parent(X) ((X)->parent)
98#define TrNode_child(X) ((X)->child)
99#define TrNode_sg_fr(X) ((X)->child)
100#define TrNode_sg_ent(X) ((X)->child)
101#define TrNode_next(X) ((X)->next)
102#define TrNode_lock(X) ((X)->lock)
103
104
105
106/******************************
107** answer_ref_node **
108******************************/
109
110#ifdef THREADS_FULL_SHARING
111typedef struct answer_ref_node {
112 struct answer_trie_node *ans_node;
113 struct answer_ref_node *next;
114 struct answer_ref_node *previous;
115} *ans_ref_ptr;
116#endif /* THREADS_FULL_SHARING */
117
118#define RefNode_answer(X) ((X)->ans_node)
119#define RefNode_next(X) ((X)->next)
120#define RefNode_previous(X) ((X)->previous)
121
122
123
124/***********************************************************************
125** subgoal_trie_hash, answer_trie_hash and global_trie_hash **
126***********************************************************************/
127
128typedef struct subgoal_trie_hash {
129 /* the first field is used for compatibility **
130 ** with the subgoal_trie_node data structure */
131 Term mark;
132 int number_of_buckets;
133 struct subgoal_trie_node **buckets;
134 int number_of_nodes;
135#ifdef USE_PAGES_MALLOC
136 struct subgoal_trie_hash *next;
137#endif /* USE_PAGES_MALLOC */
138} *sg_hash_ptr;
139
140typedef struct answer_trie_hash {
141 /* the first field is used for compatibility **
142 ** with the answer_trie_node data structure */
143 OPCODE mark;
144 int number_of_buckets;
145 struct answer_trie_node **buckets;
146 int number_of_nodes;
147#ifdef MODE_DIRECTED_TABLING
148 struct answer_trie_hash *previous;
149#endif /*MODE_DIRECTED_TABLING*/
150 struct answer_trie_hash *next;
151} *ans_hash_ptr;
152
153typedef struct global_trie_hash {
154 /* the first field is used for compatibility **
155 ** with the global_trie_node data structure */
156 Term mark;
157 int number_of_buckets;
158 struct global_trie_node **buckets;
159 int number_of_nodes;
160#ifdef USE_PAGES_MALLOC
161 struct global_trie_hash *next;
162#endif /* USE_PAGES_MALLOC */
163} *gt_hash_ptr;
164
165#define Hash_mark(X) ((X)->mark)
166#define Hash_num_buckets(X) ((X)->number_of_buckets)
167#define Hash_buckets(X) ((X)->buckets)
168#define Hash_num_nodes(X) ((X)->number_of_nodes)
169#define Hash_previous(X) ((X)->previous)
170#define Hash_next(X) ((X)->next)
171
172
173
174/************************************************************************
175** Execution Data Structures **
176************************************************************************/
177
178/****************************
179** choice points **
180****************************/
181
183 struct choicept cp;
184 struct dependency_frame *cp_dep_fr; /* always NULL if batched scheduling */
185 struct subgoal_frame *cp_sg_fr;
186#ifdef LOW_LEVEL_TRACER
187 struct pred_entry *cp_pred_entry;
188#endif /* LOW_LEVEL_TRACER */
189};
190
191#ifdef DETERMINISTIC_TABLING
192struct deterministic_generator_choicept {
193 struct deterministic_choicept cp;
194 struct subgoal_frame *cp_sg_fr;
195#ifdef LOW_LEVEL_TRACER
196 struct pred_entry *cp_pred_entry;
197#endif /* LOW_LEVEL_TRACER */
198};
199#endif /* DETERMINISTIC_TABLING */
200
202 struct choicept cp;
203 struct dependency_frame *cp_dep_fr;
204#ifdef LOW_LEVEL_TRACER
205 struct pred_entry *cp_pred_entry;
206#endif /* LOW_LEVEL_TRACER */
207};
208
210 struct choicept cp;
211 struct answer_trie_node *cp_last_answer;
212#ifdef LOW_LEVEL_TRACER
213 struct pred_entry *cp_pred_entry;
214#endif /* LOW_LEVEL_TRACER */
215};
216
217
218
219/*********************************
220** subgoal_state_flag **
221*********************************/
222
223typedef enum { /* do not change order !!! */
224 incomplete = 0, /* INCOMPLETE_TABLING */
225 ready_external = 1, /* THREADS_CONSUMER_SHARING */
226 ready = 2,
227 evaluating = 3,
228 complete = 4,
229 complete_in_use = 5, /* LIMIT_TABLING */
230 compiled = 6,
231 compiled_in_use = 7 /* LIMIT_TABLING */
232} subgoal_state_flag;
233
234
235
236/****************************
237** subgoal_entry **
238****************************/
239
240typedef struct subgoal_entry {
241#if defined(YAPOR) || defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
242 lockvar lock;
243#endif /* YAPOR || THREADS_FULL_SHARING || THREADS_CONSUMER_SHARING */
244 yamop *code_of_subgoal;
245 struct answer_trie_hash *hash_chain;
246 struct answer_trie_node *answer_trie;
247 struct answer_trie_node *first_answer;
248 struct answer_trie_node *last_answer;
249#ifdef MODE_DIRECTED_TABLING
250 int* mode_directed_array;
251 struct answer_trie_node *invalid_chain;
252#endif /* MODE_DIRECTED_TABLING */
253#ifdef INCOMPLETE_TABLING
254 struct answer_trie_node *try_answer;
255#endif /* INCOMPLETE_TABLING */
256#ifdef LIMIT_TABLING
257 struct subgoal_frame *previous;
258#endif /* LIMIT_TABLING */
259#ifdef YAPOR
260 struct or_frame *top_or_frame_on_generator_branch;
261#endif /* YAPOR */
262#if defined(YAPOR) || defined(THREADS_CONSUMER_SHARING)
263 int generator_worker;
264#endif /* YAPOR || THREADS_CONSUMER_SHARING */
265#if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
266 subgoal_state_flag state_flag;
267 int active_workers;
268 struct subgoal_frame *subgoal_frame[THREADS_NUM_BUCKETS];
269#endif /* THREADS_FULL_SHARING || THREADS_CONSUMER_SHARING */
270}* sg_ent_ptr;
271
272#define SgEnt_lock(X) ((X)->lock)
273#define SgEnt_code(X) ((X)->code_of_subgoal)
274#define SgEnt_tab_ent(X) (((X)->code_of_subgoal)->y_u.Otapl.te)
275#define SgEnt_arity(X) (((X)->code_of_subgoal)->y_u.Otapl.s)
276#define SgEnt_hash_chain(X) ((X)->hash_chain)
277#define SgEnt_answer_trie(X) ((X)->answer_trie)
278#define SgEnt_first_answer(X) ((X)->first_answer)
279#define SgEnt_last_answer(X) ((X)->last_answer)
280#define SgEnt_mode_directed(X) ((X)->mode_directed_array)
281#define SgEnt_invalid_chain(X) ((X)->invalid_chain)
282#define SgEnt_try_answer(X) ((X)->try_answer)
283#define SgEnt_previous(X) ((X)->previous)
284#define SgEnt_gen_top_or_fr(X) ((X)->top_or_frame_on_generator_branch)
285#define SgEnt_gen_worker(X) ((X)->generator_worker)
286#define SgEnt_sg_ent_state(X) ((X)->state_flag)
287#define SgEnt_active_workers(X) ((X)->active_workers)
288#define SgEnt_sg_fr(X) ((X)->subgoal_frame)
289
290
291
292/****************************
293** subgoal_frame **
294****************************/
295
296typedef struct subgoal_frame {
297#if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
299#ifdef THREADS_FULL_SHARING
300 struct answer_trie_node *batched_last_answer;
301 struct answer_ref_node *batched_cached_answers;
302#endif /* THREADS_FULL_SHARING */
303#else
305#endif /* THREADS_FULL_SHARING || THREADS_CONSUMER_SHARING */
306 subgoal_state_flag state_flag;
307 choiceptr generator_choice_point;
308 struct subgoal_frame *next;
309} *sg_fr_ptr;
310
311/* subgoal_entry fields */
312#if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
313#define SUBGOAL_ENTRY(X) SgFr_sg_ent(X)->
314#else
315#define SUBGOAL_ENTRY(X) (X)->subgoal_entry.
316#endif /* THREADS_FULL_SHARING || THREADS_CONSUMER_SHARING */
317#define SgFr_lock(X) (SUBGOAL_ENTRY(X) lock)
318#define SgFr_code(X) (SUBGOAL_ENTRY(X) code_of_subgoal)
319#define SgFr_tab_ent(X) ((SUBGOAL_ENTRY(X) code_of_subgoal)->y_u.Otapl.te)
320#define SgFr_arity(X) ((SUBGOAL_ENTRY(X) code_of_subgoal)->y_u.Otapl.s)
321#define SgFr_hash_chain(X) (SUBGOAL_ENTRY(X) hash_chain)
322#define SgFr_answer_trie(X) (SUBGOAL_ENTRY(X) answer_trie)
323#define SgFr_first_answer(X) (SUBGOAL_ENTRY(X) first_answer)
324#define SgFr_last_answer(X) (SUBGOAL_ENTRY(X) last_answer)
325#define SgFr_mode_directed(X) (SUBGOAL_ENTRY(X) mode_directed_array)
326#define SgFr_invalid_chain(X) (SUBGOAL_ENTRY(X) invalid_chain)
327#define SgFr_try_answer(X) (SUBGOAL_ENTRY(X) try_answer)
328#define SgFr_previous(X) (SUBGOAL_ENTRY(X) previous)
329#define SgFr_gen_top_or_fr(X) (SUBGOAL_ENTRY(X) top_or_frame_on_generator_branch)
330#define SgFr_gen_worker(X) (SUBGOAL_ENTRY(X) generator_worker)
331#define SgFr_sg_ent_state(X) (SUBGOAL_ENTRY(X) state_flag)
332#define SgFr_active_workers(X) (SUBGOAL_ENTRY(X) active_workers)
333/* subgoal_frame fields */
334#define SgFr_sg_ent(X) ((X)->subgoal_entry)
335#define SgFr_batched_last_answer(X) ((X)->batched_last_answer)
336#define SgFr_batched_cached_answers(X) ((X)->batched_cached_answers)
337#define SgFr_state(X) ((X)->state_flag)
338#define SgFr_gen_cp(X) ((X)->generator_choice_point)
339#define SgFr_next(X) ((X)->next)
340
341/**********************************************************************************************************
342
343 SgFr_lock: spin-lock to modify the frame fields.
344 SgFr_code initial instruction of the subgoal's compiled code.
345 SgFr_tab_ent a pointer to the corresponding table entry.
346 SgFr_arity the arity of the subgoal.
347 SgFr_hash_chain: a pointer to the first answer_trie_hash struct.
348 SgFr_answer_trie: a pointer to the top answer trie node.
349 SgFr_first_answer: a pointer to the leaf answer trie node of the first answer.
350 SgFr_last_answer: a pointer to the leaf answer trie node of the last answer.
351 SgFr_mode_directed: a pointer to the mode directed array.
352 SgFr_invalid_chain: a pointer to the first invalid leaf node when using mode directed tabling.
353 SgFr_try_answer: a pointer to the leaf answer trie node of the last tried answer.
354 It is used when a subgoal was not completed during the previous evaluation.
355 Not completed subgoals start by trying the answers already found.
356 SgFr_previous: a pointer to the previous subgoal frame on the chain.
357 SgFr_gen_top_or_fr: a pointer to the top or-frame in the generator choice point branch.
358 When the generator choice point is shared the pointer is updated
359 to its or-frame. It is used to find the direct dependency node for
360 consumer nodes in other workers branches.
361 SgFr_gen_worker: the id of the worker that had allocated the frame.
362 SgFr_sg_ent_state: a flag that indicates the subgoal entry state.
363 SgFr_active_workers: the number of workers evaluating the subgoal.
364 SgFr_sg_ent: a pointer to the corresponding subgoal entry.
365 SgFr_batched_last_answer: a pointer to the leaf answer trie node of the last checked answer
366 when using batched scheduling.
367 SgFr_batched_cached_answers: a pointer to the chain of answers already inserted in the trie, but not
368 yet found when using batched scheduling.
369 SgFr_state: a flag that indicates the subgoal frame state.
370 SgFr_gen_cp: a pointer to the correspondent generator choice point.
371 SgFr_next: a pointer to the next subgoal frame on the chain.
372
373**********************************************************************************************************/
374
375
376
377/*******************************
378** dependency_frame **
379*******************************/
380
381typedef struct dependency_frame {
382#ifdef YAPOR
383 lockvar lock;
384 int leader_dependency_is_on_stack;
385 struct or_frame *top_or_frame;
386#ifdef TIMESTAMP_CHECK
387 long timestamp;
388#endif /* TIMESTAMP_CHECK */
389#endif /* YAPOR */
390#ifdef THREADS_CONSUMER_SHARING
391 int generator_is_external;
392#endif /* THREADS_CONSUMER_SHARING */
393 choiceptr backchain_choice_point;
394 choiceptr leader_choice_point;
395 choiceptr consumer_choice_point;
396 struct answer_trie_node *last_consumed_answer;
397 struct dependency_frame *next;
398} *dep_fr_ptr;
399
400#define DepFr_lock(X) ((X)->lock)
401#define DepFr_leader_dep_is_on_stack(X) ((X)->leader_dependency_is_on_stack)
402#define DepFr_top_or_fr(X) ((X)->top_or_frame)
403#define DepFr_timestamp(X) ((X)->timestamp)
404#define DepFr_external(X) ((X)->generator_is_external)
405#define DepFr_backchain_cp(X) ((X)->backchain_choice_point)
406#define DepFr_leader_cp(X) ((X)->leader_choice_point)
407#define DepFr_cons_cp(X) ((X)->consumer_choice_point)
408#define DepFr_last_answer(X) ((X)->last_consumed_answer)
409#define DepFr_next(X) ((X)->next)
410
411/*********************************************************************************************************
412
413 DepFr_lock: lock variable to modify the frame fields.
414 DepFr_leader_dep_is_on_stack: the generator choice point for the correspondent consumer choice point
415 is on the worker's stack (FALSE/TRUE).
416 DepFr_top_or_fr: a pointer to the top or-frame in the consumer choice point branch.
417 When the consumer choice point is shared the pointer is updated to
418 its or-frame. It is used to update the LOCAL_top_or_fr when a worker
419 backtracks through answers.
420 DepFr_timestamp: a timestamp used to optimize the search for suspension frames to be
421 resumed.
422 DepFr_external: the generator choice point is external to the current thread (FALSE/TRUE).
423 DepFr_backchain_cp: a pointer to the nearest choice point with untried alternatives.
424 It is used to efficiently return (backtrack) to the leader node where
425 we perform the last backtracking through answers operation.
426 DepFr_leader_cp: a pointer to the leader choice point.
427 DepFr_cons_cp: a pointer to the correspondent consumer choice point.
428 DepFr_last_answer: a pointer to the last consumed answer.
429 DepFr_next: a pointer to the next dependency frame on the chain.
430
431*********************************************************************************************************/
432
433
434
435/*******************************
436** suspension_frame **
437*******************************/
438
439#ifdef YAPOR
440typedef struct suspension_frame {
441 struct or_frame *top_or_frame_on_stack;
442 struct dependency_frame *top_dependency_frame;
443 struct subgoal_frame *top_subgoal_frame;
444 struct suspended_block {
445 void *resume_register;
446 void *block_start;
447 long block_size;
448 } global_block, local_block, trail_block;
449 struct suspension_frame *next;
450} *susp_fr_ptr;
451#endif /* YAPOR */
452
453#define SuspFr_top_or_fr_on_stack(X) ((X)->top_or_frame_on_stack)
454#define SuspFr_top_dep_fr(X) ((X)->top_dependency_frame)
455#define SuspFr_top_sg_fr(X) ((X)->top_subgoal_frame)
456#define SuspFr_global_reg(X) ((X)->global_block.resume_register)
457#define SuspFr_global_start(X) ((X)->global_block.block_start)
458#define SuspFr_global_size(X) ((X)->global_block.block_size)
459#define SuspFr_local_reg(X) ((X)->local_block.resume_register)
460#define SuspFr_local_start(X) ((X)->local_block.block_start)
461#define SuspFr_local_size(X) ((X)->local_block.block_size)
462#define SuspFr_trail_reg(X) ((X)->trail_block.resume_register)
463#define SuspFr_trail_start(X) ((X)->trail_block.block_start)
464#define SuspFr_trail_size(X) ((X)->trail_block.block_size)
465#define SuspFr_next(X) ((X)->next)
Definition: Yatom.h:544
Definition: tab.structs.h:240
Definition: tab.structs.h:22
Definition: amidefs.h:264