fix cut handling with threads

do not compile or.threadengine unless yapor on.
This commit is contained in:
Vitor Santos Costa 2010-01-27 11:01:28 +00:00
parent f9bf676cb8
commit 995e8f6dc7
11 changed files with 55 additions and 37 deletions

View File

@ -184,7 +184,7 @@ void Yap_init_local(void) {
#ifdef ENV_COPY
INIT_LOCK(LOCAL_lock_signals);
#endif /* ENV_COPY */
LOCAL_prune_request = NULL;
Set_LOCAL_prune_request(NULL);
#endif /* YAPOR */
INIT_LOCK(LOCAL_lock);
#ifdef TABLING

View File

@ -402,7 +402,7 @@ Int p_parallel_new_answer(void) {
AnsFr_next(actual_answer) = NULL;
leftmost_or_fr = CUT_leftmost_or_frame();
LOCK_OR_FRAME(leftmost_or_fr);
if (LOCAL_prune_request) {
if (Get_LOCAL_prune_request()) {
UNLOCK_OR_FRAME(leftmost_or_fr);
FREE_QG_ANSWER_FRAME(actual_answer);
} else {

View File

@ -324,7 +324,11 @@ struct local_data{
choiceptr top_choice_point;
#endif
struct or_frame *top_or_frame;
choiceptr prune_request;
#if THREADS
Int prune_request_offset;
#else
choiceptr prune_request_offset;
#endif
volatile int share_request;
struct local_signals share_signals;
volatile struct {
@ -365,7 +369,14 @@ extern struct local_data *LOCAL;
#define Set_LOCAL_top_cp(cpt) (LOCAL->top_choice_point = cpt)
#endif
#define LOCAL_top_or_fr (LOCAL->top_or_frame)
#if THREADS
#define Get_LOCAL_prune_request() offset_to_cptr(LOCAL->prune_request_offset)
#define Set_LOCAL_prune_request(cpt) (LOCAL->prune_request_offset = cptr_to_offset(cpt))
#else
#define LOCAL_prune_request (LOCAL->prune_request)
#define Get_LOCAL_prune_request() (LOCAL->prune_request)
#define Set_LOCAL_prune_request(cpt) (LOCAL->prune_request = cpt)
#endif
#define LOCAL_share_request (LOCAL->share_request)
#define LOCAL_reply_signal (LOCAL->share_signals.reply)
#define LOCAL_p_fase_signal (LOCAL->share_signals.P_fase)
@ -401,7 +412,14 @@ extern struct local_data *LOCAL;
#define Set_REMOTE_top_cp(worker, bptr) (REMOTE[worker].top_choice_point = (bptr))
#endif
#define REMOTE_top_or_fr(worker) (REMOTE[worker].top_or_frame)
#if THREADS
#define Get_REMOTE_prune_request(worker) offset_to_cptr(REMOTE[worker].prune_request_offset)
#define Set_REMOTE_prune_request(worker,cp) (REMOTE[worker].prune_request_offset = cptr_to_offset(cp))
#else
#define REMOTE_prune_request(worker) (REMOTE[worker].prune_request)
#define Get_REMOTE_prune_request(worker) (REMOTE[worker].prune_request)
#define Set_REMOTE_prune_request(worker,cp) (REMOTE[worker].prune_request = cp)
#endif
#define REMOTE_share_request(worker) (REMOTE[worker].share_request)
#define REMOTE_reply_signal(worker) (REMOTE[worker].share_signals.reply)
#define REMOTE_p_fase_signal(worker) (REMOTE[worker].share_signals.P_fase)

View File

@ -120,7 +120,7 @@ int p_share_work(void) {
int q_share_work(int worker_p) {
LOCK_OR_FRAME(LOCAL_top_or_fr);
if (REMOTE_prune_request(worker_p)) {
if (Get_REMOTE_prune_request(worker_p)) {
/* worker p with prune request */
UNLOCK_OR_FRAME(LOCAL_top_or_fr);
return FALSE;

View File

@ -102,14 +102,14 @@ void prune_shared_branch(choiceptr prune_cp) {
} while (Get_LOCAL_top_cp() != prune_cp);
#ifdef YAPOR_ERRORS
if (LOCAL_prune_request && EQUAL_OR_YOUNGER_CP(LOCAL_prune_request, LOCAL_top_cp))
if (Get_LOCAL_prune_request() && EQUAL_OR_YOUNGER_CP(LOCAL_prune_request, LOCAL_top_cp))
YAPOR_ERROR_MESSAGE("EQUAL_OR_YOUNGER_CP(LOCAL_prune_request, LOCAL_top_cp) (prune_shared_branch)");
#endif /* YAPOR_ERRORS */
/* store answers not pruned */
if (qg_solutions)
CUT_join_answers_in_an_unique_frame(qg_solutions);
LOCK_OR_FRAME(leftmost_or_fr);
if (LOCAL_prune_request) {
if (Get_LOCAL_prune_request()) {
UNLOCK_OR_FRAME(leftmost_or_fr);
if (qg_solutions)
CUT_free_solution_frame(qg_solutions);
@ -192,14 +192,14 @@ void prune_shared_branch(choiceptr prune_cp) {
}
#ifdef YAPOR_ERRORS
if (LOCAL_prune_request && EQUAL_OR_YOUNGER_CP(LOCAL_prune_request, Get_LOCAL_top_cp()))
if (Get_LOCAL_prune_request() && EQUAL_OR_YOUNGER_CP(LOCAL_prune_request, Get_LOCAL_top_cp()))
YAPOR_ERROR_MESSAGE("EQUAL_OR_YOUNGER_CP(LOCAL_prune_request, Get_LOCAL_top_cp()) (prune_shared_branch)");
#endif /* YAPOR_ERRORS */
/* store answers not pruned */
if (qg_solutions)
CUT_join_answers_in_an_unique_frame(qg_solutions);
LOCK_OR_FRAME(leftmost_or_fr);
if (LOCAL_prune_request) {
if (Get_LOCAL_prune_request()) {
UNLOCK_OR_FRAME(leftmost_or_fr);
if (qg_solutions)
CUT_free_solution_frame(qg_solutions);

View File

@ -94,7 +94,7 @@ void make_root_choice_point(void) {
B->cp_or_fr = GLOBAL_root_or_fr;
LOCAL_top_or_fr = GLOBAL_root_or_fr;
LOCAL_load = 0;
LOCAL_prune_request = NULL;
Set_LOCAL_prune_request(NULL);
BRANCH(worker_id, 0) = 0;
#ifdef TABLING_INNER_CUTS
LOCAL_pruning_scope = NULL;
@ -196,7 +196,7 @@ int q_share_work(int worker_p) {
#endif /* YAPOR_ERRORS */
/* there is no pending prune with worker p at right --> safe move to worker p branch */
BRANCH(worker_id, OrFr_depth(LOCAL_top_or_fr)) = BRANCH(worker_p, OrFr_depth(LOCAL_top_or_fr));
LOCAL_prune_request = NULL;
SetLOCAL_prune_request = NULL;
UNLOCK_OR_FRAME(LOCAL_top_or_fr);
/* unbind variables */

View File

@ -129,7 +129,7 @@ STD_PROTO(static inline qg_sol_fr_ptr CUT_prune_solution_frames, (qg_sol_fr_ptr,
goto shared_end
#define SCH_check_prune_request() \
if (LOCAL_prune_request) { \
if (Get_LOCAL_prune_request()) { \
SCHEDULER_GET_WORK(); \
}
@ -167,7 +167,7 @@ STD_PROTO(static inline qg_sol_fr_ptr CUT_prune_solution_frames, (qg_sol_fr_ptr,
#define CUT_prune_to(PRUNE_CP) \
if (YOUNGER_CP(Get_LOCAL_top_cp(), PRUNE_CP)) { \
if (! LOCAL_prune_request) \
if (! Get_LOCAL_prune_request()) \
prune_shared_branch(PRUNE_CP); \
PRUNE_CP = Get_LOCAL_top_cp(); \
}
@ -342,8 +342,8 @@ static inline
void CUT_send_prune_request(int worker, choiceptr prune_cp) {
LOCK_WORKER(worker);
if (YOUNGER_CP(REMOTE_top_cp(worker), prune_cp) &&
(! REMOTE_prune_request(worker) || YOUNGER_CP(REMOTE_prune_request(worker), prune_cp)))
REMOTE_prune_request(worker) = prune_cp;
(! Get_REMOTE_prune_request(worker) || YOUNGER_CP(Get_REMOTE_prune_request(worker), prune_cp)))
Set_REMOTE_prune_request(worker, prune_cp);
UNLOCK_WORKER(worker);
return;
}
@ -352,8 +352,8 @@ void CUT_send_prune_request(int worker, choiceptr prune_cp) {
static inline
void CUT_reset_prune_request(void) {
LOCK_WORKER(worker_id);
if (LOCAL_prune_request && EQUAL_OR_YOUNGER_CP(LOCAL_prune_request, Get_LOCAL_top_cp()))
LOCAL_prune_request = NULL;
if (Get_LOCAL_prune_request() && EQUAL_OR_YOUNGER_CP(Get_LOCAL_prune_request(), Get_LOCAL_top_cp()))
Set_LOCAL_prune_request(NULL);
UNLOCK_WORKER(worker_id);
return;
}

View File

@ -151,7 +151,7 @@ int q_share_work(int worker_p) {
register CELL aux_cell;
LOCK_OR_FRAME(LOCAL_top_or_fr);
if (REMOTE_prune_request(worker_p)) {
if (Get_REMOTE_prune_request(worker_p)) {
/* worker p with prune request */
UNLOCK_OR_FRAME(LOCAL_top_or_fr);
return FALSE;

View File

@ -99,7 +99,7 @@ void PUT_OUT_ROOT_NODE(int worker_num) {
static inline
void move_up_to_prune_request(void) {
#ifdef YAPOR_ERRORS
if (EQUAL_OR_YOUNGER_CP(LOCAL_prune_request, Get_LOCAL_top_cp()))
if (EQUAL_OR_YOUNGER_CP(Get_LOCAL_prune_request(), Get_LOCAL_top_cp()))
YAPOR_ERROR_MESSAGE("invalid LOCAL_prune_request (move_up_to_prune_request)");
#endif /* YAPOR_ERRORS */
@ -123,7 +123,7 @@ void move_up_to_prune_request(void) {
UNLOCK_OR_FRAME(LOCAL_top_or_fr);
}
SCH_update_local_or_tops();
} while (Get_LOCAL_top_cp() != LOCAL_prune_request);
} while (Get_LOCAL_top_cp() != Get_LOCAL_prune_request());
CUT_reset_prune_request();
#ifdef TABLING
@ -153,7 +153,7 @@ int get_work(void) {
LOCAL_load = 0;
/* check for prune request */
if (LOCAL_prune_request)
if (Get_LOCAL_prune_request())
move_up_to_prune_request();
/* find nearest node with available work */
@ -267,7 +267,7 @@ int get_work(void) {
static
int move_up_one_node(or_fr_ptr nearest_livenode) {
#ifdef YAPOR_ERRORS
if (LOCAL_prune_request && EQUAL_OR_YOUNGER_CP(LOCAL_prune_request, Get_LOCAL_top_cp()))
if (Get_LOCAL_prune_request() && EQUAL_OR_YOUNGER_CP(Get_LOCAL_prune_request(), Get_LOCAL_top_cp()))
YAPOR_ERROR_MESSAGE("invalid LOCAL_prune_request (move_up_one_node)");
#endif /* YAPOR_ERRORS */
@ -286,7 +286,7 @@ int move_up_one_node(or_fr_ptr nearest_livenode) {
/* pending prune ? */
if (OrFr_pend_prune_cp(LOCAL_top_or_fr)
&& ! LOCAL_prune_request
&& ! Get_LOCAL_prune_request()
&& CUT_last_worker_left_pending_prune(LOCAL_top_or_fr)) {
#ifdef TABLING
choiceptr aux_cp = Get_LOCAL_top_cp();
@ -351,7 +351,7 @@ int move_up_one_node(or_fr_ptr nearest_livenode) {
update_local_tops1:
#endif /* TABLING_INNER_CUTS */
SCH_update_local_or_tops();
if (LOCAL_prune_request)
if (Get_LOCAL_prune_request())
pruning_over_tabling_data_structures();
return TRUE;
}
@ -420,7 +420,7 @@ int move_up_one_node(or_fr_ptr nearest_livenode) {
update_local_tops2:
#endif /* TABLING_INNER_CUTS */
SCH_update_local_or_tops();
if (LOCAL_prune_request)
if (Get_LOCAL_prune_request())
pruning_over_tabling_data_structures();
return TRUE;
}
@ -453,7 +453,7 @@ int move_up_one_node(or_fr_ptr nearest_livenode) {
/* last member worker in node ? */
if (BITMAP_alone(OrFr_members(LOCAL_top_or_fr), worker_id)) {
#endif /* TABLING */
if (LOCAL_prune_request) {
if (Get_LOCAL_prune_request()) {
CUT_free_solution_frames(OrFr_qg_solutions(LOCAL_top_or_fr));
#ifdef TABLING_INNER_CUTS
CUT_free_tg_solution_frames(OrFr_tg_solutions(LOCAL_top_or_fr));
@ -512,7 +512,7 @@ int move_up_one_node(or_fr_ptr nearest_livenode) {
or_fr_ptr leftmost_until;
tg_solutions = OrFr_tg_solutions(LOCAL_top_or_fr);
leftmost_until = CUT_leftmost_until(LOCAL_top_or_fr, OrFr_depth(TgSolFr_gen_cp(tg_solutions)->cp_or_fr));
if (LOCAL_prune_request)
if (Get_LOCAL_prune_request())
pruning_over_tabling_data_structures();
OrFr_tg_solutions(LOCAL_top_or_fr) = NULL;
UNLOCK_OR_FRAME(LOCAL_top_or_fr);
@ -526,7 +526,7 @@ int move_up_one_node(or_fr_ptr nearest_livenode) {
goto update_local_tops3;
}
#endif /* TABLING_INNER_CUTS */
if (LOCAL_prune_request)
if (Get_LOCAL_prune_request())
pruning_over_tabling_data_structures();
}
#endif /* TABLING */

View File

@ -14,7 +14,7 @@
** ------------------ */
#include "Yap.h"
#ifdef THREADS
#if defined(THREADS) && defined(YAPOR)
#ifdef HAVE_STRING_H
#include <string.h>
#endif /* HAVE_STRING_H */
@ -60,7 +60,7 @@ void make_root_choice_point(void) {
B->cp_or_fr = GLOBAL_root_or_fr;
LOCAL_top_or_fr = GLOBAL_root_or_fr;
LOCAL_load = 0;
LOCAL_prune_request = NULL;
Set_LOCAL_prune_request(NULL);
BRANCH(worker_id, 0) = 0;
#ifdef TABLING_INNER_CUTS
LOCAL_pruning_scope = NULL;
@ -118,7 +118,7 @@ int p_share_work(void) {
int q_share_work(int worker_p) {
LOCK_OR_FRAME(LOCAL_top_or_fr);
if (REMOTE_prune_request(worker_p)) {
if (Get_REMOTE_prune_request(worker_p)) {
/* worker p with prune request */
UNLOCK_OR_FRAME(LOCAL_top_or_fr);
return FALSE;
@ -130,7 +130,7 @@ int q_share_work(int worker_p) {
#endif /* YAPOR_ERRORS */
/* there is no pending prune with worker p at right --> safe move to worker p branch */
BRANCH(worker_id, OrFr_depth(LOCAL_top_or_fr)) = BRANCH(worker_p, OrFr_depth(LOCAL_top_or_fr));
LOCAL_prune_request = NULL;
Set_LOCAL_prune_request(NULL);
UNLOCK_OR_FRAME(LOCAL_top_or_fr);
#ifdef OPTYAP_ERRORS
@ -546,8 +546,8 @@ void share_private_nodes(int worker_q) {
#endif /* TABLING_INNER_CUTS */
/* update worker Q prune request */
if (LOCAL_prune_request) {
CUT_send_prune_request(worker_q, LOCAL_prune_request);
if (Get_LOCAL_prune_request()) {
CUT_send_prune_request(worker_q, Get_LOCAL_prune_request());
}
/* update load and return */

View File

@ -888,7 +888,7 @@
UNLOCK_TABLE(ans_node);
#endif /* TABLE_LOCK_LEVEL */
LOCK_OR_FRAME(leftmost_or_fr);
if (LOCAL_prune_request) {
if (Get_LOCAL_prune_request()) {
UNLOCK_OR_FRAME(leftmost_or_fr);
SCHEDULER_GET_WORK();
} else {
@ -972,7 +972,7 @@
}
/* check for prune requests */
if (LOCAL_prune_request) {
if (Get_LOCAL_prune_request()) {
#if defined(TABLE_LOCK_AT_ENTRY_LEVEL)
UNLOCK(SgFr_lock(sg_fr));
#elif defined(TABLE_LOCK_AT_NODE_LEVEL)
@ -1200,7 +1200,7 @@
end_or_fr = OrFr_next(end_or_fr);
}
} while (start_or_fr != end_or_fr);
if (LOCAL_prune_request)
if (Get_LOCAL_prune_request())
pruning_over_tabling_data_structures();
}
#endif /* YAPOR */
@ -1285,7 +1285,7 @@
#endif /* TABLING_INNER_CUTS */
start_or_fr = OrFr_next(start_or_fr);
}
if (LOCAL_prune_request)
if (Get_LOCAL_prune_request())
pruning_over_tabling_data_structures();
}
}