void p_share_work(void) { int worker_q = LOCAL_share_request; if (! BITMAP_member(OrFr_members(REMOTE_top_or_fr(worker_q)), worker_id) || B == REMOTE_top_cp(worker_q) || (LOCAL_load <= GLOBAL_delayed_release_load && OrFr_nearest_livenode(LOCAL_top_or_fr) == NULL)) { /* refuse sharing request */ REMOTE_reply_signal(LOCAL_share_request) = no_sharing; LOCAL_share_request = MAX_WORKERS; PUT_OUT_REQUESTABLE(worker_id); return; } /* sharing request accepted */ /* LOCAL_reply_signal = sharing; */ COMPUTE_SEGMENTS_TO_COPY_TO(worker_q); share_private_nodes(worker_q); REMOTE_reply_signal(worker_q) = sharing; /* REMOTE_reply_signal(worker_q) = nodes_shared; */ /* while (LOCAL_reply_signal == sharing); */ LOCAL_share_request = MAX_WORKERS; PUT_IN_REQUESTABLE(worker_id); return; }
int p_share_work(void) { int worker_q = LOCAL_share_request; if (! BITMAP_member(OrFr_members(REMOTE_top_or_fr(worker_q)), worker_id) || B == REMOTE_top_cp(worker_q) || (LOCAL_load <= GLOBAL_delayed_release_load && OrFr_nearest_livenode(LOCAL_top_or_fr) == NULL)) { /* refuse sharing request */ REMOTE_reply_signal(LOCAL_share_request) = no_sharing; LOCAL_share_request = MAX_WORKERS; PUT_OUT_REQUESTABLE(worker_id); return 0; } /* sharing request accepted */ COMPUTE_SEGMENTS_TO_COPY_TO(worker_q); REMOTE_q_fase_signal(worker_q) = Q_idle; REMOTE_p_fase_signal(worker_q) = P_idle; #ifndef TABLING /* wait for incomplete installations */ while (LOCAL_reply_signal != worker_ready); #endif /* TABLING */ LOCAL_reply_signal = sharing; REMOTE_reply_signal(worker_q) = sharing; share_private_nodes(worker_q); if(Get_LOCAL_prune_request()) CUT_send_prune_request(worker_q, Get_LOCAL_prune_request()); REMOTE_reply_signal(worker_q) = nodes_shared; /* copy local stack ? */ LOCK(REMOTE_lock_signals(worker_q)); if (REMOTE_q_fase_signal(worker_q) < local) { REMOTE_p_fase_signal(worker_q) = local; UNLOCK(REMOTE_lock_signals(worker_q)); P_COPY_LOCAL_TO(worker_q); } else { UNLOCK(REMOTE_lock_signals(worker_q)); goto sync_with_q; } /* copy global stack ? */ LOCK(REMOTE_lock_signals(worker_q)); if (REMOTE_q_fase_signal(worker_q) < global) { REMOTE_p_fase_signal(worker_q) = global; UNLOCK(REMOTE_lock_signals(worker_q)); P_COPY_GLOBAL_TO(worker_q); } else { UNLOCK(REMOTE_lock_signals(worker_q)); goto sync_with_q; } /* copy trail stack ? */ LOCK(REMOTE_lock_signals(worker_q)); if (REMOTE_q_fase_signal(worker_q) < trail) { REMOTE_p_fase_signal(worker_q) = trail; UNLOCK(REMOTE_lock_signals(worker_q)); P_COPY_TRAIL_TO(worker_q); } else UNLOCK(REMOTE_lock_signals(worker_q)); sync_with_q: REMOTE_reply_signal(worker_q) = copy_done; while (LOCAL_reply_signal == sharing); while (REMOTE_reply_signal(worker_q) != worker_ready); LOCAL_share_request = MAX_WORKERS; PUT_IN_REQUESTABLE(worker_id); return 1; }