27#include "tab.macros.h"
38static void share_private_nodes(
int worker_q);
46#define INCREMENTAL_COPY 1
48#define COMPUTE_SEGMENTS_TO_COPY_TO(Q) \
49 if (REMOTE_top_cp(Q) == GLOBAL_root_cp) \
50 REMOTE_start_global_copy(Q) = (CELL) (H0); \
52 REMOTE_start_global_copy(Q) = (CELL) (REMOTE_top_cp(Q)->cp_h); \
53 REMOTE_end_global_copy(Q) = (CELL) (B->cp_h); \
54 REMOTE_start_local_copy(Q) = (CELL) (B); \
55 REMOTE_end_local_copy(Q) = (CELL) (REMOTE_top_cp(Q)); \
56 REMOTE_start_trail_copy(Q) = (CELL) (REMOTE_top_cp(Q)->cp_tr); \
57 REMOTE_end_trail_copy(Q) = (CELL) (TR)
59#define COMPUTE_SEGMENTS_TO_COPY_TO(Q) \
60 REMOTE_start_global_copy(Q) = (CELL) (H0); \
61 REMOTE_end_global_copy(Q) = (CELL) (HR); \
62 REMOTE_start_local_copy(Q) = (CELL) (B); \
63 REMOTE_end_local_copy(Q) = (CELL) (GLOBAL_root_cp); \
64 REMOTE_start_trail_copy(Q) = (CELL) (GLOBAL_root_cp->cp_tr); \
65 REMOTE_end_trail_copy(Q) = (CELL) (TR)
68#define P_COPY_GLOBAL_TO(Q) \
69 memcpy((void *) (worker_offset(Q) + REMOTE_start_global_copy(Q)), \
70 (void *) REMOTE_start_global_copy(Q), \
71 (size_t) (REMOTE_end_global_copy(Q) - REMOTE_start_global_copy(Q)))
72#define Q_COPY_GLOBAL_FROM(P) \
73 memcpy((void *) LOCAL_start_global_copy, \
74 (void *) (worker_offset(P) + LOCAL_start_global_copy), \
75 (size_t) (LOCAL_end_global_copy - LOCAL_start_global_copy))
77#define P_COPY_LOCAL_TO(Q) \
78 memcpy((void *) (worker_offset(Q) + REMOTE_start_local_copy(Q)), \
79 (void *) REMOTE_start_local_copy(Q), \
80 (size_t) (REMOTE_end_local_copy(Q) - REMOTE_start_local_copy(Q)))
81#define Q_COPY_LOCAL_FROM(P) \
82 memcpy((void *) LOCAL_start_local_copy, \
83 (void *) (worker_offset(P) + LOCAL_start_local_copy), \
84 (size_t) (LOCAL_end_local_copy - LOCAL_start_local_copy))
86#define P_COPY_TRAIL_TO(Q) \
87 memcpy((void *) (worker_offset(Q) + REMOTE_start_trail_copy(Q)), \
88 (void *) REMOTE_start_trail_copy(Q), \
89 (size_t) (REMOTE_end_trail_copy(Q) - REMOTE_start_trail_copy(Q)))
90#define Q_COPY_TRAIL_FROM(P) \
91 memcpy((void *) LOCAL_start_trail_copy, \
92 (void *) (worker_offset(P) + LOCAL_start_trail_copy), \
93 (size_t) (LOCAL_end_trail_copy - LOCAL_start_trail_copy))
101void make_root_choice_point(
void) {
102 if (worker_id == 0) {
103 LOCAL_top_cp = GLOBAL_root_cp = OrFr_node(GLOBAL_root_or_fr) = B;
105 B = LOCAL_top_cp = GLOBAL_root_cp;
106 B->cp_tr = TR = ((
choiceptr) (worker_offset(0) + (CELL)(B)))->cp_tr;
110 B->cp_or_fr = GLOBAL_root_or_fr;
111 LOCAL_top_or_fr = GLOBAL_root_or_fr;
113 Set_LOCAL_prune_request(NULL);
114 BRANCH(worker_id, 0) = 0;
115#ifdef TABLING_INNER_CUTS
116 LOCAL_pruning_scope = NULL;
119 LOCAL_top_cp_on_stack = LOCAL_top_cp;
120 adjust_freeze_registers();
126void free_root_choice_point(
void) {
127 B = LOCAL_top_cp->cp_b;
129 LOCAL_top_cp_on_stack =
131 LOCAL_top_cp = GLOBAL_root_cp = OrFr_node(GLOBAL_root_or_fr) = (
choiceptr) LOCAL_LocalBase;
136int p_share_work(
void) {
137 int worker_q = LOCAL_share_request;
139 if (! BITMAP_member(OrFr_members(REMOTE_top_or_fr(worker_q)), worker_id) ||
140 B == REMOTE_top_cp(worker_q) ||
141 (LOCAL_load <= GLOBAL_delayed_release_load && OrFr_nearest_livenode(LOCAL_top_or_fr) == NULL)) {
143 REMOTE_reply_signal(LOCAL_share_request) = no_sharing;
144 LOCAL_share_request = MAX_WORKERS;
145 PUT_OUT_REQUESTABLE(worker_id);
149 COMPUTE_SEGMENTS_TO_COPY_TO(worker_q);
150 REMOTE_q_fase_signal(worker_q) = Q_idle;
151 REMOTE_p_fase_signal(worker_q) = P_idle;
154 while (LOCAL_reply_signal != worker_ready);
156 LOCAL_reply_signal = sharing;
157 REMOTE_reply_signal(worker_q) = sharing;
158 share_private_nodes(worker_q);
159 if(Get_LOCAL_prune_request())
160 CUT_send_prune_request(worker_q, Get_LOCAL_prune_request());
161 REMOTE_reply_signal(worker_q) = nodes_shared;
163 LOCK(REMOTE_lock_signals(worker_q));
164 if (REMOTE_q_fase_signal(worker_q) < local) {
165 REMOTE_p_fase_signal(worker_q) = local;
166 UNLOCK(REMOTE_lock_signals(worker_q));
167 P_COPY_LOCAL_TO(worker_q);
169 UNLOCK(REMOTE_lock_signals(worker_q));
173 LOCK(REMOTE_lock_signals(worker_q));
174 if (REMOTE_q_fase_signal(worker_q) < global) {
175 REMOTE_p_fase_signal(worker_q) = global;
176 UNLOCK(REMOTE_lock_signals(worker_q));
177 P_COPY_GLOBAL_TO(worker_q);
179 UNLOCK(REMOTE_lock_signals(worker_q));
183 LOCK(REMOTE_lock_signals(worker_q));
184 if (REMOTE_q_fase_signal(worker_q) < trail) {
185 REMOTE_p_fase_signal(worker_q) = trail;
186 UNLOCK(REMOTE_lock_signals(worker_q));
187 P_COPY_TRAIL_TO(worker_q);
188 }
else UNLOCK(REMOTE_lock_signals(worker_q));
191 REMOTE_reply_signal(worker_q) = copy_done;
192 while (LOCAL_reply_signal == sharing);
193 while (REMOTE_reply_signal(worker_q) != worker_ready);
194 LOCAL_share_request = MAX_WORKERS;
195 PUT_IN_REQUESTABLE(worker_id);
201int q_share_work(
int worker_p) {
202 register tr_fr_ptr aux_tr;
203 register CELL aux_cell;
205 LOCK_OR_FRAME(LOCAL_top_or_fr);
206 if (REMOTE_prune_request(worker_p)) {
208 UNLOCK_OR_FRAME(LOCAL_top_or_fr);
211 YAPOR_ERROR_CHECKING(q_share_work, Get_OrFr_pend_prune_cp(LOCAL_top_or_fr) && BRANCH_LTT(worker_p, OrFr_depth(LOCAL_top_or_fr)) < OrFr_pend_prune_ltt(LOCAL_top_or_fr));
213 CUT_reset_prune_request();
214 if(Get_LOCAL_prune_request()){
215 UNLOCK_OR_FRAME(LOCAL_top_or_fr);
218 BRANCH(worker_id, OrFr_depth(LOCAL_top_or_fr)) = BRANCH(worker_p, OrFr_depth(LOCAL_top_or_fr));
219 UNLOCK_OR_FRAME(LOCAL_top_or_fr);
222 aux_tr = LOCAL_top_cp->cp_tr;
223 TABLING_ERROR_CHECKING(q_share_work, TR < aux_tr);
224 while (aux_tr != TR) {
225 aux_cell = TrailTerm(--TR);
227 if (IsVarTerm(aux_cell)) {
228 RESET_VARIABLE(aux_cell);
230 }
else if (IsPairTerm(aux_cell)) {
231 aux_cell = (CELL) RepPair(aux_cell);
232 if (IN_BETWEEN(LOCAL_TrailBase, aux_cell, LOCAL_TrailTop)) {
234 TR = (tr_fr_ptr) aux_cell;
235 TABLING_ERROR_CHECKING(q_share_work, TR > (tr_fr_ptr) LOCAL_TrailTop);
236 TABLING_ERROR_CHECKING(q_share_work, TR < aux_tr);
239#ifdef MULTI_ASSIGNMENT_VARIABLES
240 }
else if (IsApplTerm(aux_cell)) {
241 CELL *aux_ptr = RepAppl(aux_cell);
242 Term aux_val = TrailTerm(--aux_tr);
248 OPTYAP_ERROR_CHECKING(q_share_work, LOCAL_top_cp != LOCAL_top_cp_on_stack);
249 OPTYAP_ERROR_CHECKING(q_share_work, YOUNGER_CP(B_FZ, LOCAL_top_cp));
250 YAPOR_ERROR_CHECKING(q_share_work, LOCAL_reply_signal != worker_ready);
253 LOCK_WORKER(worker_p);
254 if (BITMAP_member(GLOBAL_bm_idle_workers, worker_p) ||
255 REMOTE_share_request(worker_p) != MAX_WORKERS) {
257 UNLOCK_WORKER(worker_p);
260 REMOTE_share_request(worker_p) = worker_id;
261 UNLOCK_WORKER(worker_p);
264 while (LOCAL_reply_signal == worker_ready);
265 if (LOCAL_reply_signal == no_sharing) {
267 LOCAL_reply_signal = worker_ready;
272 LOCK(LOCAL_lock_signals);
273 if (LOCAL_p_fase_signal > trail) {
274 LOCAL_q_fase_signal = trail;
275 UNLOCK(LOCAL_lock_signals);
276 Q_COPY_TRAIL_FROM(worker_p);
278 UNLOCK(LOCAL_lock_signals);
283 LOCK(LOCAL_lock_signals);
284 if (LOCAL_p_fase_signal > global) {
285 LOCAL_q_fase_signal = global;
286 UNLOCK(LOCAL_lock_signals);
287 Q_COPY_GLOBAL_FROM(worker_p);
289 UNLOCK(LOCAL_lock_signals);
294 while (LOCAL_reply_signal < nodes_shared);
295 LOCK(LOCAL_lock_signals);
296 if (LOCAL_p_fase_signal > local) {
297 LOCAL_q_fase_signal = local;
298 UNLOCK(LOCAL_lock_signals);
299 Q_COPY_LOCAL_FROM(worker_p);
300 }
else UNLOCK(LOCAL_lock_signals);
304 REMOTE_reply_signal(worker_p) = worker_ready;
306 REMOTE_reply_signal(worker_p) = copy_done;
308 while (LOCAL_reply_signal != copy_done);
312 aux_tr = ((
choiceptr) LOCAL_start_local_copy)->cp_tr;
313 TR = ((
choiceptr) LOCAL_end_local_copy)->cp_tr;
314 Yap_NEW_MAHASH((ma_h_inner_struct *)HR);
315 while (TR != aux_tr) {
316 aux_cell = TrailTerm(--aux_tr);
317 if (IsVarTerm(aux_cell)) {
318 if (aux_cell < LOCAL_start_global_copy || EQUAL_OR_YOUNGER_CP((
choiceptr)LOCAL_end_local_copy, (
choiceptr)aux_cell)) {
319 YAPOR_ERROR_CHECKING(q_share_work, (CELL *)aux_cell < H0);
320 YAPOR_ERROR_CHECKING(q_share_work, (ADDR)aux_cell > LOCAL_LocalBase);
322 *((CELL *) aux_cell) = TrailVal(aux_tr);
324 *((CELL *) aux_cell) = *((CELL *) (worker_offset(worker_p) + aux_cell));
328 }
else if (IsPairTerm(aux_cell)) {
329 aux_cell = (CELL) RepPair(aux_cell);
330 if (IN_BETWEEN(LOCAL_TrailBase, aux_cell, LOCAL_TrailTop)) {
332 aux_tr = (tr_fr_ptr) aux_cell;
335#ifdef MULTI_ASSIGNMENT_VARIABLES
336 }
else if (IsApplTerm(aux_cell)) {
337 CELL *cell_ptr = RepAppl(aux_cell);
338 if (((CELL *)aux_cell < LOCAL_top_cp->cp_h ||
339 EQUAL_OR_YOUNGER_CP(LOCAL_top_cp, (
choiceptr)aux_cell)) &&
340 !Yap_lookup_ma_var(cell_ptr)) {
343 *cell_ptr = TrailVal(aux_tr);
345 *cell_ptr = *((CELL *) (worker_offset(worker_p) + (CELL)cell_ptr));
356 PUT_OUT_ROOT_NODE(worker_id);
358 REMOTE_reply_signal(worker_p) = worker_ready;
360 TR = (tr_fr_ptr) LOCAL_end_trail_copy;
361 LOCAL_reply_signal = worker_ready;
362 PUT_IN_REQUESTABLE(worker_id);
364 adjust_freeze_registers();
375void share_private_nodes(
int worker_q) {
379 OPTYAP_ERROR_CHECKING(share_private_nodes, YOUNGER_CP(LOCAL_top_cp, LOCAL_top_cp_on_stack));
381 while (aux_cp != LOCAL_top_cp) {
382 OPTYAP_ERROR_CHECKING(share_private_nodes, YOUNGER_CP(LOCAL_top_cp, aux_cp));
383 OPTYAP_ERROR_CHECKING(share_private_nodes, EQUAL_OR_YOUNGER_CP(LOCAL_top_cp_on_stack, aux_cp));
384 aux_cp = aux_cp->cp_b;
391 if (EQUAL_OR_YOUNGER_CP(LOCAL_top_cp_on_stack, sharing_node)) {
398 aux_or_fr = LOCAL_top_or_fr;
399 while (aux_or_fr != REMOTE_top_or_fr(worker_q)) {
400 OPTYAP_ERROR_CHECKING(share_private_nodes, YOUNGER_CP(OrFr_node(REMOTE_top_or_fr(worker_q)), OrFr_node(aux_or_fr)));
401 aux_or_fr = OrFr_next_on_stack(aux_or_fr);
408 while (
or_frame != REMOTE_top_or_fr(worker_q)) {
410 BRANCH(worker_q, OrFr_depth(
or_frame)) = BRANCH(worker_id, OrFr_depth(
or_frame));
412 if (BITMAP_member(OrFr_members(
or_frame), worker_id))
413 BITMAP_insert(OrFr_members(
or_frame), worker_q);
419 sg_frame = LOCAL_top_sg_fr;
420 while (sg_frame && YOUNGER_CP(SgFr_gen_cp(sg_frame), sharing_node)) {
421 sg_frame = SgFr_next(sg_frame);
423 REMOTE_top_sg_fr(worker_q) = sg_frame;
426 dep_frame = LOCAL_top_dep_fr;
427 while (YOUNGER_CP(DepFr_cons_cp(dep_frame), sharing_node)) {
428 dep_frame = DepFr_next(dep_frame);
430 REMOTE_top_dep_fr(worker_q) = dep_frame;
433 REMOTE_top_cp_on_stack(worker_q) = REMOTE_top_cp(worker_q) = LOCAL_top_cp;
434 REMOTE_top_or_fr(worker_q) = LOCAL_top_or_fr;
442 choiceptr consumer_cp, next_node_on_branch;
445 CELL *stack, *stack_limit;
448 dep_frame = LOCAL_top_dep_fr;
449 while (EQUAL_OR_YOUNGER_CP(DepFr_cons_cp(dep_frame), sharing_node)) {
450 dep_frame = DepFr_next(dep_frame);
453 consumer_cp = DepFr_cons_cp(dep_frame);
454 next_node_on_branch = NULL;
455 stack_limit = (CELL *)TR;
456 stack = (CELL *)LOCAL_TrailTop;
460 BITMAP_clear(bm_workers);
461 BITMAP_insert(bm_workers, worker_id);
462 BITMAP_insert(bm_workers, worker_q);
463 previous_or_frame = NULL;
464 depth = OrFr_depth(LOCAL_top_or_fr);
468 while (YOUNGER_CP(sharing_node, LOCAL_top_cp_on_stack)) {
470 while (sharing_node != LOCAL_top_cp) {
474 if (next_node_on_branch) {
476 while (aux_cp != next_node_on_branch) {
477 OPTYAP_ERROR_CHECKING(share_private_nodes, sharing_node == aux_cp);
478 OPTYAP_ERROR_CHECKING(share_private_nodes, YOUNGER_CP(next_node_on_branch, aux_cp));
479 aux_cp = aux_cp->cp_b;
483 while (aux_cp != sharing_node) {
484 OPTYAP_ERROR_CHECKING(share_private_nodes, YOUNGER_CP(sharing_node, aux_cp));
485 aux_cp = aux_cp->cp_b;
491 if (previous_or_frame) {
493 OrFr_next_on_stack(previous_or_frame) =
495 OrFr_nearest_livenode(previous_or_frame) = OrFr_next(previous_or_frame) =
or_frame;
501 OrFr_alternative(
or_frame) = sharing_node->cp_ap;
502 OrFr_pend_prune_cp(
or_frame) = NULL;
503 OrFr_nearest_leftnode(
or_frame) = LOCAL_top_or_fr;
505#ifdef TABLING_INNER_CUTS
512 if (next_node_on_branch)
513 BITMAP_clear(OrFr_members(
or_frame));
516 OrFr_members(
or_frame) = bm_workers;
518 YAPOR_ERROR_CHECKING(share_private_nodes, sharing_node->cp_ap == GETWORK || sharing_node->cp_ap == GETWORK_SEQ);
519 if (sharing_node->cp_ap && YAMOP_SEQ(sharing_node->cp_ap)) {
520 sharing_node->cp_ap = GETWORK_SEQ;
522 sharing_node->cp_ap = GETWORK;
525 sharing_node = sharing_node->cp_b;
530 if (YOUNGER_CP(consumer_cp, sharing_node)) {
532 if (! next_node_on_branch)
533 next_node_on_branch = sharing_node;
535 STACK_CHECK_EXPAND(stack, stack_limit);
536 STACK_PUSH_UP(sharing_node, stack);
537 STACK_CHECK_EXPAND(stack, stack_limit);
538 sharing_node = consumer_cp;
539 dep_frame = DepFr_next(dep_frame);
540 consumer_cp = DepFr_cons_cp(dep_frame);
541 }
else if (consumer_cp == sharing_node) {
542 dep_frame = DepFr_next(dep_frame);
543 consumer_cp = DepFr_cons_cp(dep_frame);
545 if (next_node_on_branch == sharing_node)
546 next_node_on_branch = NULL;
548 OPTYAP_ERROR_CHECKING(share_private_nodes, next_node_on_branch && YOUNGER_CP(next_node_on_branch, sharing_node));
553 if (previous_or_frame) {
555 OrFr_next_on_stack(previous_or_frame) =
557 OrFr_nearest_livenode(previous_or_frame) = OrFr_next(previous_or_frame) =
or_frame;
562 while (STACK_NOT_EMPTY(stack, (CELL *)LOCAL_TrailTop)) {
563 next_node_on_branch = (
choiceptr) STACK_POP_DOWN(stack);
565 OrFr_nearest_livenode(
or_frame) = OrFr_next(
or_frame) = next_node_on_branch->cp_or_fr;
570 if (depth >= MAX_BRANCH_DEPTH)
571 Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil,
"maximum depth exceded (share_private_nodes)");
574 previous_or_frame = LOCAL_top_cp_on_stack->cp_or_fr;
575 while (
or_frame != previous_or_frame) {
577 while (
or_frame != LOCAL_top_or_fr) {
586 BRANCH(worker_id, depth) = BRANCH(worker_q, depth) =
branch;
591 YAPOR_ERROR_CHECKING(share_private_nodes, depth != OrFr_depth(LOCAL_top_or_fr));
596 while (aux_or_fr != LOCAL_top_cp_on_stack->cp_or_fr) {
597 aux_cp = OrFr_node(aux_or_fr);
598 OPTYAP_ERROR_CHECKING(share_private_nodes, OrFr_next(aux_or_fr) != aux_cp->cp_b->cp_or_fr);
599 OPTYAP_ERROR_CHECKING(share_private_nodes, OrFr_nearest_livenode(aux_or_fr) != aux_cp->cp_b->cp_or_fr);
600 aux_or_fr = OrFr_next_on_stack(aux_or_fr);
602 aux_or_fr = B->cp_or_fr;
603 while (aux_or_fr != LOCAL_top_cp_on_stack->cp_or_fr) {
604 or_fr_ptr nearest_leftnode = OrFr_nearest_leftnode(aux_or_fr);
605 aux_cp = OrFr_node(aux_or_fr);
606 while (OrFr_node(nearest_leftnode) != aux_cp) {
607 OPTYAP_ERROR_CHECKING(share_private_nodes, YOUNGER_CP(OrFr_node(nearest_leftnode), aux_cp));
608 aux_cp = aux_cp->cp_b;
610 aux_or_fr = OrFr_next_on_stack(aux_or_fr);
616 while (
or_frame != REMOTE_top_or_fr(worker_q)) {
618 BRANCH(worker_q, OrFr_depth(
or_frame)) = BRANCH(worker_id, OrFr_depth(
or_frame));
621 if (BITMAP_member(OrFr_members(
or_frame), worker_id))
623 BITMAP_insert(OrFr_members(
or_frame), worker_q);
628 LOCK_OR_FRAME(REMOTE_top_or_fr(worker_q));
629 or_fr_ptr old_top = REMOTE_top_or_fr(worker_q);
630 Set_REMOTE_top_cp(worker_q,B);
632 REMOTE_top_or_fr(worker_q) = LOCAL_top_or_fr = Get_LOCAL_top_cp()->cp_or_fr;
633 UNLOCK_OR_FRAME(old_top);
637 sg_frame = LOCAL_top_sg_fr;
638 while (sg_frame && YOUNGER_CP(SgFr_gen_cp(sg_frame), B)) {
640 top_cp_on_branch = SgFr_gen_cp(sg_frame);
641 while (YOUNGER_CP(top_cp_on_branch, B)) {
642 top_cp_on_branch = top_cp_on_branch->cp_b;
644 SgFr_gen_top_or_fr(sg_frame) = top_cp_on_branch->cp_or_fr;
645 sg_frame = SgFr_next(sg_frame);
648 REMOTE_top_sg_fr(worker_q) = sg_frame;
650 while (sg_frame && YOUNGER_CP(SgFr_gen_cp(sg_frame), LOCAL_top_cp_on_stack)) {
651 SgFr_gen_worker(sg_frame) = MAX_WORKERS;
652 SgFr_gen_top_or_fr(sg_frame) = SgFr_gen_cp(sg_frame)->cp_or_fr;
653 sg_frame = SgFr_next(sg_frame);
657 dep_frame = LOCAL_top_dep_fr;
658 while (YOUNGER_CP(DepFr_cons_cp(dep_frame), B)) {
660 top_cp_on_branch = DepFr_cons_cp(dep_frame);
661 while (YOUNGER_CP(top_cp_on_branch, B)) {
662 top_cp_on_branch = top_cp_on_branch->cp_b;
664 DepFr_top_or_fr(dep_frame) = top_cp_on_branch->cp_or_fr;
665 dep_frame = DepFr_next(dep_frame);
668 REMOTE_top_dep_fr(worker_q) = dep_frame;
670 while (YOUNGER_CP(DepFr_cons_cp(dep_frame), LOCAL_top_cp_on_stack)) {
671 DepFr_top_or_fr(dep_frame) = DepFr_cons_cp(dep_frame)->cp_or_fr;
672 dep_frame = DepFr_next(dep_frame);
678 while(aux_dep_fr != GLOBAL_root_dep_fr) {
680 top_cp_on_branch = DepFr_cons_cp(aux_dep_fr);
681 while (YOUNGER_CP(top_cp_on_branch, B)) {
682 top_cp_on_branch = top_cp_on_branch->cp_b;
684 OPTYAP_ERROR_CHECKING(share_private_nodes, top_cp_on_branch->cp_or_fr != DepFr_top_or_fr(aux_dep_fr));
685 aux_dep_fr = DepFr_next(aux_dep_fr);
692 REMOTE_top_cp_on_stack(worker_q) = LOCAL_top_cp_on_stack =
694 REMOTE_top_cp(worker_q) = LOCAL_top_cp = B;
695 REMOTE_top_or_fr(worker_q) = LOCAL_top_or_fr = LOCAL_top_cp->cp_or_fr;
698#ifdef TABLING_INNER_CUTS
700 if (LOCAL_pruning_scope && EQUAL_OR_YOUNGER_CP(LOCAL_top_cp, LOCAL_pruning_scope)) {
701 REMOTE_pruning_scope(worker_q) = LOCAL_pruning_scope;
702 PUT_IN_PRUNING(worker_q);
704 PUT_OUT_PRUNING(worker_q);
705 REMOTE_pruning_scope(worker_q) = NULL;
710 if (LOCAL_prune_request) {
711 CUT_send_prune_request(worker_q, LOCAL_prune_request);
715 REMOTE_load(worker_q) = LOCAL_load = 0;