static void ReclaimDSandMarkReset(th_context *th, VariantSF to, int leader) { CPtr csf = openreg ; for(;;) { if( !is_completed(compl_subgoal_ptr(csf))) /* Handle early completion */ { subg_grabbed(compl_subgoal_ptr(csf)) = TRUE ; subg_tid(compl_subgoal_ptr(csf)) = leader ; subg_asf_list_ptr(compl_subgoal_ptr(csf)) = NULL; subg_compl_susp_ptr(compl_subgoal_ptr(csf)) = NULL; } if( compl_subgoal_ptr(csf) == to ) break; csf = prev_compl_frame(csf) ; } }
static void handle_empty_dl_creation(DL dl) { NODEptr as_leaf = dl_asl(dl); ASI asi = Delay(as_leaf); VariantSF subgoal; #ifdef DEBUG_DELAYVAR fprintf(stddbg, ">>>> start handle_empty_dl_creation()\n"); #endif /* * Only when `as_leaf' is still a conditional answer can we do * remove_dl_from_dl_list(), simplify_pos_unconditional(), and * simplify_neg_succeeds() here. * * If `as_leaf' is already marked UNCONDITIONAL (by * unmark_conditional_answer(as_leaf) in simplify_pos_unconditional()), * that means this is the second time when `as_leaf' becomes * unconditional. So we don't need do anything. All the DLs have been * released in the first time. */ if (is_conditional_answer(as_leaf)) { /* if it is still conditional */ remove_dl_from_dl_list(dl, asi); subgoal = asi_subgoal(Delay(as_leaf)); #ifdef DEBUG_DELAYVAR xsb_dbgmsg((LOG_DEBUG, ">>>> the subgoal is:")); dbg_print_subgoal(LOG_DEBUG,stddbg, subgoal); xsb_dbgmsg((LOG_DEBUG, "\n")); #endif /* * simplify_pos_unconditional(as_leaf) will release all other DLs for * as_leaf, and mark as_leaf as UNCONDITIONAL. */ simplify_pos_unconditional(as_leaf); /*-- perform early completion if necessary; please preserve invariants --*/ if (!is_completed(subgoal) && most_general_answer(as_leaf)) { perform_early_completion(subgoal, subg_cp_ptr(subgoal)); subg_compl_susp_ptr(subgoal) = NULL; } simplify_neg_succeeds(subgoal); } }