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