diff --git a/C/amasm.c b/C/amasm.c index 47aa525da..1bedb0653 100644 --- a/C/amasm.c +++ b/C/amasm.c @@ -3073,7 +3073,11 @@ do_pass(int pass_no, yamop **entry_codep, int assembling, int *clause_has_blobsp *entry_codep = code_p; if (tabled) { #if TABLING +#ifdef YAPOR + code_p = a_try(_table_try_single, (CELL)NEXTOP(code_p,Otapl), IPredArity, 1, 0, code_p, pass_no, cip); +#else code_p = a_try(_table_try_single, (CELL)NEXTOP(code_p,Otapl), IPredArity, code_p, pass_no, cip); +#endif #endif } if (dynamic) { diff --git a/C/index.c b/C/index.c index 6e72ac832..3d1943e84 100644 --- a/C/index.c +++ b/C/index.c @@ -980,10 +980,13 @@ has_cut(yamop *pc) #ifdef TABLING case _table_load_answer: case _table_try_answer: - case _table_try_me_single: + case _table_try_single: case _table_try_me: case _table_retry_me: case _table_trust_me: + case _table_try: + case _table_retry: + case _table_trust: case _table_answer_resolution: case _table_completion: #endif /* TABLING */ diff --git a/OPTYap/opt.preds.c b/OPTYap/opt.preds.c index ce6f86bbc..ed348d25b 100644 --- a/OPTYap/opt.preds.c +++ b/OPTYap/opt.preds.c @@ -82,7 +82,7 @@ static Int p_tabling_statistics(void); #endif /* TABLING */ #if defined(YAPOR) && defined(TABLING) -static int p_opt_statistics(void); +static Int p_opt_statistics(void); #endif /* YAPOR && TABLING */ #if defined(YAPOR_ERRORS) || defined(TABLING_ERRORS) @@ -872,7 +872,7 @@ Int p_tabling_statistics(void) { #if defined(YAPOR) && defined(TABLING) static -int p_opt_statistics(void) { +Int p_opt_statistics(void) { #ifdef SHM_MEMORY_ALLOC_SCHEME long pages_in_use = 0, bytes_in_use = 0; diff --git a/OPTYap/opt.structs.h b/OPTYap/opt.structs.h index 8082ad32f..657022adf 100644 --- a/OPTYap/opt.structs.h +++ b/OPTYap/opt.structs.h @@ -300,7 +300,7 @@ struct local_signals{ sharing = 1, nodes_shared = 2, copy_done = 3, - ready = 4 + worker_ready = 4 } reply; }; #endif /* YAPOR */ @@ -342,7 +342,11 @@ struct local_data{ choiceptr bottom_pruning_scope; #endif /* TABLING_INNER_CUTS */ #ifdef YAPOR +#ifdef THREADS + Int top_choice_point_on_stack_offset; +#else choiceptr top_choice_point_on_stack; +#endif struct or_frame *top_or_frame_with_suspensions; #endif /* YAPOR */ #endif /* TABLING */ diff --git a/OPTYap/or.cut.c b/OPTYap/or.cut.c index 067a803de..5f701c0f3 100644 --- a/OPTYap/or.cut.c +++ b/OPTYap/or.cut.c @@ -256,7 +256,7 @@ void prune_shared_branch(choiceptr prune_cp) { end_prune_more: CUT_reset_prune_request(); #ifdef TABLING - Set_LOCAL_top_cp_on_stack(LOCAL_top_cp); + Set_LOCAL_top_cp_on_stack(Get_LOCAL_top_cp()); #endif /* TABLING */ return; diff --git a/OPTYap/or.threadengine.c b/OPTYap/or.threadengine.c index 3d64026b0..6c3262a88 100644 --- a/OPTYap/or.threadengine.c +++ b/OPTYap/or.threadengine.c @@ -365,7 +365,7 @@ void share_private_nodes(int worker_q) { next_node_on_branch = sharing_node; STACK_PUSH_UP(or_frame, stack); STACK_CHECK_EXPAND1(stack, stack_limit, stack_base); - STACK_PUSH(sharing_node, stack); + STACK_PUSH_UP(sharing_node, stack); /* vsc: STACK_PUSH -> STACK_PUSH_UP? */ STACK_CHECK_EXPAND1(stack, stack_limit, stack_base); sharing_node = consumer_cp; dep_frame = DepFr_next(dep_frame); @@ -527,7 +527,7 @@ void share_private_nodes(int worker_q) { /* update top shared nodes */ #ifdef TABLING Set_REMOTE_top_cp_on_stack(worker_q,B); - Set_LOCAL_top_cp_on_stack, B); + Set_LOCAL_top_cp_on_stack( B ); #endif /* TABLING */ Set_REMOTE_top_cp(worker_q,B); Set_LOCAL_top_cp(B); @@ -536,7 +536,7 @@ void share_private_nodes(int worker_q) { #ifdef TABLING_INNER_CUTS /* update worker Q pruning scope */ - if (LOCAL_pruning_scope && EQUAL_OR_YOUNGER_CP(Get_LOCAL_top_cp(), LOCAL_pruning_scope)) { + if (LOCAL_pruning_scope && EQUAL_OR_YOUNGER_CP(Get_LOCAL_top_cp(), LOCAL_pruning_scope)) { REMOTE_pruning_scope(worker_q) = LOCAL_pruning_scope; PUT_IN_PRUNING(worker_q); } else { diff --git a/OPTYap/tab.insts.i b/OPTYap/tab.insts.i index f37efc0e5..6efd5cc88 100644 --- a/OPTYap/tab.insts.i +++ b/OPTYap/tab.insts.i @@ -303,9 +303,14 @@ #ifdef YAPOR if (SCH_top_shared_cp(B)) { +#if 0 PROBLEM: cp_last_answer field is local to the cp! -> we need a shared data structure to avoid redundant computations! UNLOCK_OR_FRAME(LOCAL_top_or_fr); +#else + fprintf(stderr,"PROBLEM: cp_last_answer field is local to the cp!\n"); + exit(1); +#endif } #endif /* YAPOR */ subs_ptr = (CELL *) (LOAD_CP(B) + 1); @@ -918,7 +923,7 @@ for (i = 0; i < number_workers; i++) { if (BITMAP_member(members, i) && BRANCH_LTT(i, depth) > ltt && - EQUAL_OR_YOUNGER_CP(OrFr_node(leftmost_or_fr), REMOTE_pruning_scope(i))) + EQUAL_OR_YOUNGER_CP(GetOrFr_node(leftmost_or_fr), REMOTE_pruning_scope(i))) goto pending_table_new_answer; } BITMAP_minus(prune_members, members); @@ -933,7 +938,7 @@ for (i = 0; i < number_workers; i++) { if (BITMAP_member(members, i) && BRANCH_LTT(i, depth) > ltt && - EQUAL_OR_YOUNGER_CP(OrFr_node(leftmost_or_fr), REMOTE_pruning_scope(i))) { + EQUAL_OR_YOUNGER_CP(GetOrFr_node(leftmost_or_fr), REMOTE_pruning_scope(i))) { /* update nearest leftnode data */ or_fr = LOCAL_top_or_fr; nearest_or_fr = OrFr_nearest_leftnode(or_fr); @@ -1153,9 +1158,9 @@ end_or_fr = DepFr_top_or_fr(dep_fr); if (start_or_fr != end_or_fr) { LOCAL_top_or_fr = end_or_fr; - Set_LOCAL_top_cp(OrFr_node(end_or_fr)); + Set_LOCAL_top_cp(GetOrFr_node(end_or_fr)); do { - while (YOUNGER_CP(OrFr_node(start_or_fr), OrFr_node(end_or_fr))) { + while (YOUNGER_CP(GetOrFr_node(start_or_fr), GetOrFr_node(end_or_fr))) { LOCK_OR_FRAME(start_or_fr); BITMAP_delete(OrFr_members(start_or_fr), worker_id); if (BITMAP_empty(OrFr_members(start_or_fr))) { @@ -1187,7 +1192,7 @@ #endif /* TABLING_INNER_CUTS */ start_or_fr = OrFr_next(start_or_fr); } - while (YOUNGER_CP(OrFr_node(end_or_fr), OrFr_node(start_or_fr))) { + while (YOUNGER_CP(GetOrFr_node(end_or_fr), GetOrFr_node(start_or_fr))) { LOCK_OR_FRAME(end_or_fr); BITMAP_insert(OrFr_members(end_or_fr), worker_id); BRANCH(worker_id, OrFr_depth(end_or_fr)) = 1; @@ -1247,7 +1252,7 @@ start_or_fr = LOCAL_top_or_fr; if (start_or_fr != end_or_fr) { LOCAL_top_or_fr = end_or_fr; - Set_LOCAL_top_cp(OrFr_node(end_or_fr)); + Set_LOCAL_top_cp(GetOrFr_node(end_or_fr)); while (start_or_fr != end_or_fr) { LOCK_OR_FRAME(start_or_fr); BITMAP_delete(OrFr_members(start_or_fr), worker_id); @@ -1447,7 +1452,7 @@ or_frame = OrFr_next(or_frame); } LOCAL_top_or_fr = DepFr_top_or_fr(dep_fr); - Set_LOCAL_top_cp(OrFr_node(LOCAL_top_or_fr)); + Set_LOCAL_top_cp(GetOrFr_node(LOCAL_top_or_fr)); } #endif /* YAPOR */ #ifdef OPTYAP_ERRORS @@ -1508,7 +1513,7 @@ if (YOUNGER_CP(B_FZ, B)) { suspend_branch(); /* check for suspension frames to be resumed */ - while (YOUNGER_CP(OrFr_node(LOCAL_top_susp_or_fr), Get_LOCAL_top_cp())) { + while (YOUNGER_CP(GetOrFr_node(LOCAL_top_susp_or_fr), Get_LOCAL_top_cp())) { or_fr_ptr susp_or_fr; susp_fr_ptr resume_fr; susp_or_fr = LOCAL_top_susp_or_fr; @@ -1524,7 +1529,7 @@ OrFr_nearest_suspnode(susp_or_fr) = susp_or_fr; } UNLOCK_OR_FRAME(susp_or_fr); - rebind_variables(OrFr_node(susp_or_fr)->cp_tr, B->cp_tr); + rebind_variables(GetOrFr_node(susp_or_fr)->cp_tr, B->cp_tr); resume_suspension_frame(resume_fr, susp_or_fr); B = Get_LOCAL_top_cp(); SET_BB(B_FZ); @@ -1542,7 +1547,7 @@ if (frame_with_suspensions_not_collected(LOCAL_top_or_fr)) collect_suspension_frames(LOCAL_top_or_fr); /* check for suspension frames to be resumed */ - while (EQUAL_OR_YOUNGER_CP(OrFr_node(LOCAL_top_susp_or_fr), Get_LOCAL_top_cp())) { + while (EQUAL_OR_YOUNGER_CP(GetOrFr_node(LOCAL_top_susp_or_fr), Get_LOCAL_top_cp())) { or_fr_ptr susp_or_fr; susp_fr_ptr resume_fr; susp_or_fr = LOCAL_top_susp_or_fr; @@ -1559,7 +1564,7 @@ if (YOUNGER_CP(B_FZ, B)) { suspend_branch(); } - rebind_variables(OrFr_node(susp_or_fr)->cp_tr, B->cp_tr); + rebind_variables(GetOrFr_node(susp_or_fr)->cp_tr, B->cp_tr); resume_suspension_frame(resume_fr, susp_or_fr); B = Get_LOCAL_top_cp(); SET_BB(B_FZ); @@ -1605,7 +1610,7 @@ UNLOCK(DepFr_lock(LOCAL_top_dep_fr)); if (OrFr_owners(LOCAL_top_or_fr) > 1) { /* more owners -> move up one node */ - Set_LOCAL_top_cp_on_stack( OrFr_node(OrFr_next_on_stack(LOCAL_top_or_fr)) ); + Set_LOCAL_top_cp_on_stack( GetOrFr_node(OrFr_next_on_stack(LOCAL_top_or_fr)) ); BITMAP_delete(OrFr_members(LOCAL_top_or_fr), worker_id); OrFr_owners(LOCAL_top_or_fr)--; LOCAL_top_dep_fr = DepFr_next(LOCAL_top_dep_fr); diff --git a/OPTYap/tab.macros.h b/OPTYap/tab.macros.h index 3565d63da..3431b0ecd 100644 --- a/OPTYap/tab.macros.h +++ b/OPTYap/tab.macros.h @@ -14,6 +14,9 @@ ** ------------------ */ #include +#if HAVE_STRING_H +#include +#endif #include "opt.mavar.h" @@ -104,7 +107,12 @@ STD_PROTO(static inline tg_sol_fr_ptr CUT_prune_tg_solution_frames, (tg_sol_fr_p #ifdef YAPOR #define STACK_CHECK_EXPAND(STACK, STACK_LIMIT, STACK_BASE) \ if (STACK_LIMIT >= STACK) { \ - Yap_Error(INTERNAL_ERROR, TermNil, "stack full (STACK_CHECK_EXPAND)") + Yap_Error(INTERNAL_ERROR, TermNil, "stack full (STACK_CHECK_EXPAND)"); \ + } + +/* should work for now */ +#define STACK_CHECK_EXPAND1(STACK, STACK_LIMIT, STACK_BASE) STACK_CHECK_EXPAND(STACK, STACK_LIMIT, STACK_BASE) + #else #define STACK_CHECK_EXPAND(STACK, STACK_LIMIT, STACK_BASE) \ if (STACK_LIMIT >= STACK) { \ diff --git a/OPTYap/tab.suspend.c b/OPTYap/tab.suspend.c index 84bb93f5e..2ee227e0e 100644 --- a/OPTYap/tab.suspend.c +++ b/OPTYap/tab.suspend.c @@ -341,9 +341,9 @@ void resume_suspension_frame(susp_fr_ptr resume_fr, or_fr_ptr top_or_fr) { SetOrFr_node(top_or_fr, Get_LOCAL_top_cp()); LOCAL_top_sg_fr = SuspFr_top_sg_fr(resume_fr); LOCAL_top_dep_fr = SuspFr_top_dep_fr(resume_fr); - Set_LOCAL_top_cp_on_stack( OrFr_node(SuspFr_top_or_fr_on_stack(resume_fr)) ); + Set_LOCAL_top_cp_on_stack( GetOrFr_node(SuspFr_top_or_fr_on_stack(resume_fr)) ); sg_frame = LOCAL_top_sg_fr; - while (sg_frame && YOUNGER_CP(SgFr_gen_cp(sg_frame), LOCAL_top_cp_on_stack)) { + while (sg_frame && YOUNGER_CP(SgFr_gen_cp(sg_frame), Get_LOCAL_top_cp_on_stack())) { SgFr_gen_worker(sg_frame) = worker_id; sg_frame = SgFr_next(sg_frame); }