call cleanup
This commit is contained in:
		| @@ -6,455 +6,413 @@ | |||||||
| { | { | ||||||
| #endif /* INDENT_CODE */ | #endif /* INDENT_CODE */ | ||||||
|  |  | ||||||
| 	/* trust_fail                       */ |   /* trust_fail                       */ | ||||||
| 	BOp(trust_fail, e); |   BOp(trust_fail, e); | ||||||
| 	{ |   { | ||||||
| 		while (POP_CHOICE_POINT(B->cp_b)) |     while (POP_CHOICE_POINT(B->cp_b)) { | ||||||
| 		{ |       POP_EXECUTE(); | ||||||
| 			POP_EXECUTE(); |     } | ||||||
| 		} |   } | ||||||
| 	} |  | ||||||
| #ifdef YAPOR | #ifdef YAPOR | ||||||
| 	{ |   { | ||||||
| 		choiceptr cut_pt; |     choiceptr cut_pt; | ||||||
| 		cut_pt = B->cp_b; |     cut_pt = B->cp_b; | ||||||
| 		CUT_prune_to(cut_pt); |     CUT_prune_to(cut_pt); | ||||||
| 		B = cut_pt; |     B = cut_pt; | ||||||
| 	} |   } | ||||||
| #else | #else | ||||||
| 	B = B->cp_b; |   B = B->cp_b; | ||||||
| #endif /* YAPOR */ | #endif /* YAPOR */ | ||||||
| 	goto fail; |   goto fail; | ||||||
| 	ENDBOp(); |   ENDBOp(); | ||||||
|  |  | ||||||
| #ifdef YAPOR | #ifdef YAPOR | ||||||
| shared_fail: | shared_fail: | ||||||
| 	B = Get_LOCAL_top_cp(); |   B = Get_LOCAL_top_cp(); | ||||||
| 	SET_BB(PROTECT_FROZEN_B(B)); |   SET_BB(PROTECT_FROZEN_B(B)); | ||||||
| 	goto fail; |   goto fail; | ||||||
| #endif /* YAPOR */ | #endif /* YAPOR */ | ||||||
|  |  | ||||||
| 	/* fail                             */ |   /* fail                             */ | ||||||
| 	PBOp(op_fail, e); |   PBOp(op_fail, e); | ||||||
|  |  | ||||||
| 	if (PP) |   if (PP) { | ||||||
| 	{ |     UNLOCK(PP->PELock); | ||||||
| 		UNLOCK(PP->PELock); |     PP = NULL; | ||||||
| 		PP = NULL; |   } | ||||||
| 	} |  | ||||||
| #ifdef COROUTINING | #ifdef COROUTINING | ||||||
| 	CACHE_Y_AS_ENV(YREG); |   CACHE_Y_AS_ENV(YREG); | ||||||
| 	check_stack(NoStackFail, HR); |   check_stack(NoStackFail, HR); | ||||||
| 	ENDCACHE_Y_AS_ENV(); |   ENDCACHE_Y_AS_ENV(); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| fail: | fail : { | ||||||
| { |   register tr_fr_ptr pt0 = TR; | ||||||
| 	register tr_fr_ptr pt0 = TR; |  | ||||||
| #if defined(YAPOR) || defined(THREADS) | #if defined(YAPOR) || defined(THREADS) | ||||||
| 	if (PP) |   if (PP) { | ||||||
| 	{ |     UNLOCK(PP->PELock); | ||||||
| 		UNLOCK(PP->PELock); |     PP = NULL; | ||||||
| 		PP = NULL; |   } | ||||||
| 	} |  | ||||||
| #endif | #endif | ||||||
| 	PREG = B->cp_ap; |   PREG = B->cp_ap; | ||||||
| 	save_pc(); |   save_pc(); | ||||||
| 	CACHE_TR(B->cp_tr); |   CACHE_TR(B->cp_tr); | ||||||
| 	PREFETCH_OP(PREG); |   PREFETCH_OP(PREG); | ||||||
| failloop: | failloop: | ||||||
| 	if (pt0 == S_TR) |   if (pt0 == S_TR) { | ||||||
| 	{ |     SP = SP0; | ||||||
| 		SP = SP0; |  | ||||||
| #ifdef LOW_LEVEL_TRACER | #ifdef LOW_LEVEL_TRACER | ||||||
| 		if (Yap_do_low_level_trace) |     if (Yap_do_low_level_trace) { | ||||||
| 		{ |       int go_on = true; | ||||||
| 			int go_on = true; |       yamop *ipc = PREG; | ||||||
| 			yamop *ipc = PREG; |  | ||||||
|  |  | ||||||
| 			while (go_on) |       while (go_on) { | ||||||
| 			{ |         op_numbers opnum = Yap_op_from_opcode(ipc->opc); | ||||||
| 				op_numbers opnum = Yap_op_from_opcode(ipc->opc); |  | ||||||
|  |  | ||||||
| 				go_on = false; |         go_on = false; | ||||||
| 				switch (opnum) |         switch (opnum) { | ||||||
| 				{ |  | ||||||
| #ifdef TABLING | #ifdef TABLING | ||||||
| 				case _table_load_answer: |         case _table_load_answer: | ||||||
| 					low_level_trace(retry_table_loader, LOAD_CP(B)->cp_pred_entry, NULL); |           low_level_trace(retry_table_loader, LOAD_CP(B)->cp_pred_entry, NULL); | ||||||
| 					break; |           break; | ||||||
| 				case _table_try_answer: |         case _table_try_answer: | ||||||
| 				case _table_retry_me: |         case _table_retry_me: | ||||||
| 				case _table_trust_me: |         case _table_trust_me: | ||||||
| 				case _table_retry: |         case _table_retry: | ||||||
| 				case _table_trust: |         case _table_trust: | ||||||
| 				case _table_completion: |         case _table_completion: | ||||||
| #ifdef THREADS_CONSUMER_SHARING | #ifdef THREADS_CONSUMER_SHARING | ||||||
| 				case _table_answer_resolution_completion: |         case _table_answer_resolution_completion: | ||||||
| #endif /* THREADS_CONSUMER_SHARING */ | #endif /* THREADS_CONSUMER_SHARING */ | ||||||
| #ifdef DETERMINISTIC_TABLING | #ifdef DETERMINISTIC_TABLING | ||||||
| 					if (IS_DET_GEN_CP(B)) |           if (IS_DET_GEN_CP(B)) | ||||||
| 						low_level_trace(retry_table_generator, DET_GEN_CP(B)->cp_pred_entry, NULL); |             low_level_trace(retry_table_generator, DET_GEN_CP(B)->cp_pred_entry, | ||||||
| 					else |                             NULL); | ||||||
|  |           else | ||||||
| #endif /* DETERMINISTIC_TABLING */ | #endif /* DETERMINISTIC_TABLING */ | ||||||
| 						low_level_trace(retry_table_generator, GEN_CP(B)->cp_pred_entry, (CELL *)(GEN_CP(B) + 1)); |             low_level_trace(retry_table_generator, GEN_CP(B)->cp_pred_entry, | ||||||
| 					break; |                             (CELL *)(GEN_CP(B) + 1)); | ||||||
| 				case _table_answer_resolution: |           break; | ||||||
| 					low_level_trace(retry_table_consumer, CONS_CP(B)->cp_pred_entry, NULL); |         case _table_answer_resolution: | ||||||
| 					break; |           low_level_trace(retry_table_consumer, CONS_CP(B)->cp_pred_entry, | ||||||
| 				case _trie_trust_var: |                           NULL); | ||||||
| 				case _trie_retry_var: |           break; | ||||||
| 				case _trie_trust_var_in_pair: |         case _trie_trust_var: | ||||||
| 				case _trie_retry_var_in_pair: |         case _trie_retry_var: | ||||||
| 				case _trie_trust_val: |         case _trie_trust_var_in_pair: | ||||||
| 				case _trie_retry_val: |         case _trie_retry_var_in_pair: | ||||||
| 				case _trie_trust_val_in_pair: |         case _trie_trust_val: | ||||||
| 				case _trie_retry_val_in_pair: |         case _trie_retry_val: | ||||||
| 				case _trie_trust_atom: |         case _trie_trust_val_in_pair: | ||||||
| 				case _trie_retry_atom: |         case _trie_retry_val_in_pair: | ||||||
| 				case _trie_trust_atom_in_pair: |         case _trie_trust_atom: | ||||||
| 				case _trie_retry_atom_in_pair: |         case _trie_retry_atom: | ||||||
| 				case _trie_trust_null: |         case _trie_trust_atom_in_pair: | ||||||
| 				case _trie_retry_null: |         case _trie_retry_atom_in_pair: | ||||||
| 				case _trie_trust_null_in_pair: |         case _trie_trust_null: | ||||||
| 				case _trie_retry_null_in_pair: |         case _trie_retry_null: | ||||||
| 				case _trie_trust_pair: |         case _trie_trust_null_in_pair: | ||||||
| 				case _trie_retry_pair: |         case _trie_retry_null_in_pair: | ||||||
| 				case _trie_trust_appl: |         case _trie_trust_pair: | ||||||
| 				case _trie_retry_appl: |         case _trie_retry_pair: | ||||||
| 				case _trie_trust_appl_in_pair: |         case _trie_trust_appl: | ||||||
| 				case _trie_retry_appl_in_pair: |         case _trie_retry_appl: | ||||||
| 				case _trie_trust_extension: |         case _trie_trust_appl_in_pair: | ||||||
| 				case _trie_retry_extension: |         case _trie_retry_appl_in_pair: | ||||||
| 				case _trie_trust_double: |         case _trie_trust_extension: | ||||||
| 				case _trie_retry_double: |         case _trie_retry_extension: | ||||||
| 				case _trie_trust_longint: |         case _trie_trust_double: | ||||||
| 				case _trie_retry_longint: |         case _trie_retry_double: | ||||||
| 				case _trie_trust_gterm: |         case _trie_trust_longint: | ||||||
| 				case _trie_retry_gterm: |         case _trie_retry_longint: | ||||||
| 					low_level_trace(retry_table_loader, UndefCode, NULL); |         case _trie_trust_gterm: | ||||||
| 					break; |         case _trie_retry_gterm: | ||||||
|  |           low_level_trace(retry_table_loader, UndefCode, NULL); | ||||||
|  |           break; | ||||||
| #endif /* TABLING */ | #endif /* TABLING */ | ||||||
| 				case _or_else: |         case _or_else: | ||||||
| 				case _or_last: |         case _or_last: | ||||||
| 					low_level_trace(retry_or, NULL, NULL); |           low_level_trace(retry_or, NULL, NULL); | ||||||
| 					break; |           break; | ||||||
| 				case _retry2: |         case _retry2: | ||||||
| 				case _retry3: |         case _retry3: | ||||||
| 				case _retry4: |         case _retry4: | ||||||
| 					ipc = NEXTOP(ipc, l); |           ipc = NEXTOP(ipc, l); | ||||||
| 					go_on = true; |           go_on = true; | ||||||
| 					break; |           break; | ||||||
| 				case _jump: |         case _jump: | ||||||
| 					ipc = ipc->y_u.l.l; |           ipc = ipc->y_u.l.l; | ||||||
| 					go_on = true; |           go_on = true; | ||||||
| 					break; |           break; | ||||||
| 				case _retry_c: |         case _retry_c: | ||||||
| 				case _retry_userc: |         case _retry_userc: | ||||||
| 					low_level_trace(retry_pred, ipc->y_u.OtapFs.p, B->cp_args); |           low_level_trace(retry_pred, ipc->y_u.OtapFs.p, B->cp_args); | ||||||
| 					break; |           break; | ||||||
| 				case _retry_profiled: |         case _retry_profiled: | ||||||
| 				case _count_retry: |         case _count_retry: | ||||||
| 					ipc = NEXTOP(ipc, p); |           ipc = NEXTOP(ipc, p); | ||||||
| 					go_on = true; |           go_on = true; | ||||||
| 					break; |           break; | ||||||
| 				case _retry_me: |         case _retry_me: | ||||||
| 				case _trust_me: |         case _trust_me: | ||||||
| 				case _count_retry_me: |         case _count_retry_me: | ||||||
| 				case _count_trust_me: |         case _count_trust_me: | ||||||
| 				case _profiled_retry_me: |         case _profiled_retry_me: | ||||||
| 				case _profiled_trust_me: |         case _profiled_trust_me: | ||||||
| 				case _retry_and_mark: |         case _retry_and_mark: | ||||||
| 				case _profiled_retry_and_mark: |         case _profiled_retry_and_mark: | ||||||
| 				case _retry: |         case _retry: | ||||||
| 				case _trust: |         case _trust: | ||||||
| 					low_level_trace(retry_pred, ipc->y_u.Otapl.p, B->cp_args); |           low_level_trace(retry_pred, ipc->y_u.Otapl.p, B->cp_args); | ||||||
| 					break; |           break; | ||||||
| 				case _try_logical: |         case _try_logical: | ||||||
| 				case _retry_logical: |         case _retry_logical: | ||||||
| 				case _profiled_retry_logical: |         case _profiled_retry_logical: | ||||||
| 				case _count_retry_logical: |         case _count_retry_logical: | ||||||
| 				case _trust_logical: |         case _trust_logical: | ||||||
| 				case _profiled_trust_logical: |         case _profiled_trust_logical: | ||||||
| 				case _count_trust_logical: |         case _count_trust_logical: | ||||||
| 					low_level_trace(retry_pred, ipc->y_u.OtILl.d->ClPred, B->cp_args); |           low_level_trace(retry_pred, ipc->y_u.OtILl.d->ClPred, B->cp_args); | ||||||
| 					break; |           break; | ||||||
| 				case _Nstop: |         case _Nstop: | ||||||
| 				case _Ystop: |         case _Ystop: | ||||||
| 					low_level_trace(retry_pred, NULL, B->cp_args); |           low_level_trace(retry_pred, NULL, B->cp_args); | ||||||
| 					break; |           break; | ||||||
| 				default: |         default: | ||||||
| 					break; |           break; | ||||||
| 				} |         } | ||||||
| 			} |       } | ||||||
| 		} |     } | ||||||
| #endif /* LOW_LEVEL_TRACER */ | #endif /* LOW_LEVEL_TRACER */ | ||||||
| #ifdef FROZEN_STACKS | #ifdef FROZEN_STACKS | ||||||
| #ifdef YAPOR_SBA | #ifdef YAPOR_SBA | ||||||
| 		if (pt0 < TR_FZ || pt0 > (ADDR)CurrentTrailTop + MinTrailGap) |     if (pt0 < TR_FZ || pt0 > (ADDR)CurrentTrailTop + MinTrailGap) | ||||||
| #else | #else | ||||||
| 		if (pt0 < TR_FZ) |     if (pt0 < TR_FZ) | ||||||
| #endif /* YAPOR_SBA */ | #endif /* YAPOR_SBA */ | ||||||
| 		{ |     { | ||||||
| 			TR = TR_FZ; |       TR = TR_FZ; | ||||||
| 			TRAIL_LINK(pt0); |       TRAIL_LINK(pt0); | ||||||
| 		} |     } else | ||||||
| 		else |  | ||||||
| #endif /* FROZEN_STACKS */ | #endif /* FROZEN_STACKS */ | ||||||
| 			RESTORE_TR(); |       RESTORE_TR(); | ||||||
| 		GONext(); |     GONext(); | ||||||
| 	} |   } | ||||||
| 	BEGD(d1); |   BEGD(d1); | ||||||
| 	d1 = TrailTerm(pt0 - 1); |   d1 = TrailTerm(pt0 - 1); | ||||||
| 	pt0--; |   pt0--; | ||||||
| 	if (IsVarTerm(d1)) |   if (IsVarTerm(d1)) { | ||||||
| 	{ |  | ||||||
| #if defined(YAPOR_SBA) && defined(YAPOR) | #if defined(YAPOR_SBA) && defined(YAPOR) | ||||||
| 		/* clean up the trail when we backtrack */ |     /* clean up the trail when we backtrack */ | ||||||
| 		if (Unsigned((Int)(d1) - (Int)(H_FZ)) > |     if (Unsigned((Int)(d1) - (Int)(H_FZ)) > | ||||||
| 		    Unsigned((Int)(B_FZ) - (Int)(H_FZ))) |         Unsigned((Int)(B_FZ) - (Int)(H_FZ))) { | ||||||
| 		{ |       RESET_VARIABLE(STACK_TO_SBA(d1)); | ||||||
| 			RESET_VARIABLE(STACK_TO_SBA(d1)); |     } else | ||||||
| 		} |  | ||||||
| 		else |  | ||||||
| #endif | #endif | ||||||
| 			/* normal variable */ |       /* normal variable */ | ||||||
| 			RESET_VARIABLE(d1); |       RESET_VARIABLE(d1); | ||||||
| 		goto failloop; |     goto failloop; | ||||||
| 	} |   } | ||||||
| /* pointer to code space */ | /* pointer to code space */ | ||||||
| /* or updatable variable */ | /* or updatable variable */ | ||||||
| #if defined(TERM_EXTENSIONS) || defined(FROZEN_STACKS) || defined(MULTI_ASSIGNMENT_VARIABLES) | #if defined(TERM_EXTENSIONS) || defined(FROZEN_STACKS) ||                      \ | ||||||
| 	if (IsPairTerm(d1)) |     defined(MULTI_ASSIGNMENT_VARIABLES) | ||||||
|  |   if (IsPairTerm(d1)) | ||||||
| #endif /* TERM_EXTENSIONS || FROZEN_STACKS || MULTI_ASSIGNMENT_VARIABLES */ | #endif /* TERM_EXTENSIONS || FROZEN_STACKS || MULTI_ASSIGNMENT_VARIABLES */ | ||||||
| 	{ |   { | ||||||
| 		register CELL flags; |     register CELL flags; | ||||||
| 		CELL *pt1 = RepPair(d1); |     CELL *pt1 = RepPair(d1); | ||||||
| #ifdef LIMIT_TABLING | #ifdef LIMIT_TABLING | ||||||
| 		if ((ADDR)pt1 == LOCAL_TrailBase) |     if ((ADDR)pt1 == LOCAL_TrailBase) { | ||||||
| 		{ |       sg_fr_ptr sg_fr = (sg_fr_ptr)TrailVal(pt0); | ||||||
| 			sg_fr_ptr sg_fr = (sg_fr_ptr)TrailVal(pt0); |       TrailTerm(pt0) = AbsPair((CELL *)(pt0 - 1)); | ||||||
| 			TrailTerm(pt0) = AbsPair((CELL *)(pt0 - 1)); |       SgFr_state(sg_fr)--; /* complete_in_use --> complete : compiled_in_use --> | ||||||
| 			SgFr_state(sg_fr)--; /* complete_in_use --> complete : compiled_in_use --> compiled */ |                               compiled */ | ||||||
| 			insert_into_global_sg_fr_list(sg_fr); |       insert_into_global_sg_fr_list(sg_fr); | ||||||
| 			goto failloop; |       goto failloop; | ||||||
| 		} |     } | ||||||
| #endif		   /* LIMIT_TABLING */ | #endif               /* LIMIT_TABLING */ | ||||||
| #ifdef FROZEN_STACKS /* TRAIL */ | #ifdef FROZEN_STACKS /* TRAIL */ | ||||||
| 		/* avoid frozen segments */ |     /* avoid frozen segments */ | ||||||
| 		if ( |     if ( | ||||||
| #ifdef YAPOR_SBA | #ifdef YAPOR_SBA | ||||||
| 		    (ADDR)pt1 >= HeapTop |         (ADDR)pt1 >= HeapTop | ||||||
| #else | #else | ||||||
| 		    IN_BETWEEN(LOCAL_TrailBase, pt1, (ADDR)CurrentTrailTop + MinTrailGap) |         IN_BETWEEN(LOCAL_TrailBase, pt1, (ADDR)CurrentTrailTop + MinTrailGap) | ||||||
| #endif /* YAPOR_SBA */ | #endif /* YAPOR_SBA */ | ||||||
| 		    ) |     ) { | ||||||
| 		{ |       pt0 = (tr_fr_ptr)pt1; | ||||||
| 			pt0 = (tr_fr_ptr)pt1; |       goto failloop; | ||||||
| 			goto failloop; |     } else | ||||||
| 		} |  | ||||||
| 		else |  | ||||||
| #endif /* FROZEN_STACKS */ | #endif /* FROZEN_STACKS */ | ||||||
| 		    if (IN_BETWEEN(H0, pt1, HR)) |         if (IN_BETWEEN(H0, pt1, HR)) { | ||||||
| 		{ |       if (IsAttVar(pt1)) { | ||||||
| 			if (IsAttVar(pt1)) |         goto failloop; | ||||||
| 			{ |       } else { | ||||||
| 				goto failloop; |         TR = pt0; | ||||||
| 			} |         Yap_CleanOpaqueVariable(d1); | ||||||
| 			else |  | ||||||
| 			{ |         goto failloop; | ||||||
| 				TR = pt0; |       } | ||||||
| 				Yap_CleanOpaqueVariable(d1); |     } | ||||||
| 				goto fail; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| #ifdef FROZEN_STACKS /* TRAIL */ | #ifdef FROZEN_STACKS /* TRAIL */ | ||||||
| 		/* don't reset frozen variables */ |     /* don't reset frozen variables */ | ||||||
| 		if (pt0 < TR_FZ) |     if (pt0 < TR_FZ) | ||||||
| 			goto failloop; |       goto failloop; | ||||||
| #endif | #endif | ||||||
| 		flags = *pt1; |     flags = *pt1; | ||||||
| #if MULTIPLE_STACKS | #if MULTIPLE_STACKS | ||||||
| 		if (FlagOn(DBClMask, flags)) |     if (FlagOn(DBClMask, flags)) { | ||||||
| 		{ |       DBRef dbr = DBStructFlagsToDBStruct(pt1); | ||||||
| 			DBRef dbr = DBStructFlagsToDBStruct(pt1); |       int erase; | ||||||
| 			int erase; |  | ||||||
|  |  | ||||||
| 			LOCK(dbr->lock); |       LOCK(dbr->lock); | ||||||
| 			DEC_DBREF_COUNT(dbr); |       DEC_DBREF_COUNT(dbr); | ||||||
| 			erase = (dbr->Flags & ErasedMask) && (dbr->ref_count == 0); |       erase = (dbr->Flags & ErasedMask) && (dbr->ref_count == 0); | ||||||
| 			UNLOCK(dbr->lock); |       UNLOCK(dbr->lock); | ||||||
| 			if (erase) |       if (erase) { | ||||||
| 			{ |         saveregs(); | ||||||
| 				saveregs(); |         Yap_ErDBE(dbr); | ||||||
| 				Yap_ErDBE(dbr); |         setregs(); | ||||||
| 				setregs(); |       } | ||||||
| 			} |     } else { | ||||||
| 		} |       if (flags & LogUpdMask) { | ||||||
| 		else |         if (flags & IndexMask) { | ||||||
| 		{ |           LogUpdIndex *cl = ClauseFlagsToLogUpdIndex(pt1); | ||||||
| 			if (flags & LogUpdMask) |           int erase; | ||||||
| 			{ |  | ||||||
| 				if (flags & IndexMask) |  | ||||||
| 				{ |  | ||||||
| 					LogUpdIndex *cl = ClauseFlagsToLogUpdIndex(pt1); |  | ||||||
| 					int erase; |  | ||||||
| #if PARALLEL_YAP | #if PARALLEL_YAP | ||||||
| 					PredEntry *ap = cl->ClPred; |           PredEntry *ap = cl->ClPred; | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| 					PELOCK(8, ap); |           PELOCK(8, ap); | ||||||
| 					DEC_CLREF_COUNT(cl); |           DEC_CLREF_COUNT(cl); | ||||||
| 					erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); |           erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); | ||||||
| 					if (erase) |           if (erase) { | ||||||
| 					{ |             saveregs(); | ||||||
| 						saveregs(); |             /* at this point, | ||||||
| 						/* at this point, | we are the only ones accessing the clause, | ||||||
| 		       we are the only ones accessing the clause, | hence we don't need to have a lock it */ | ||||||
| 		       hence we don't need to have a lock it */ |             Yap_ErLogUpdIndex(cl); | ||||||
| 						Yap_ErLogUpdIndex(cl); |             setregs(); | ||||||
| 						setregs(); |           } else if (cl->ClFlags & DirtyMask) { | ||||||
| 					} |             saveregs(); | ||||||
| 					else if (cl->ClFlags & DirtyMask) |             /* at this point, | ||||||
| 					{ | we are the only ones accessing the clause, | ||||||
| 						saveregs(); | hence we don't need to have a lock it */ | ||||||
| 						/* at this point, |             Yap_CleanUpIndex(cl); | ||||||
| 		       we are the only ones accessing the clause, |             setregs(); | ||||||
| 		       hence we don't need to have a lock it */ |           } | ||||||
| 						Yap_CleanUpIndex(cl); |           UNLOCK(ap->PELock); | ||||||
| 						setregs(); |         } else { | ||||||
| 					} |           LogUpdClause *cl = ClauseFlagsToLogUpdClause(pt1); | ||||||
| 					UNLOCK(ap->PELock); |           int erase; | ||||||
| 				} |  | ||||||
| 				else |  | ||||||
| 				{ |  | ||||||
| 					LogUpdClause *cl = ClauseFlagsToLogUpdClause(pt1); |  | ||||||
| 					int erase; |  | ||||||
| #if PARALLEL_YAP | #if PARALLEL_YAP | ||||||
| 					PredEntry *ap = cl->ClPred; |           PredEntry *ap = cl->ClPred; | ||||||
| #endif | #endif | ||||||
| 					/* BB support */ |           /* BB support */ | ||||||
| 					if (ap) |           if (ap) { | ||||||
| 					{ |  | ||||||
|  |  | ||||||
| 						PELOCK(9, ap); |             PELOCK(9, ap); | ||||||
| 						DEC_CLREF_COUNT(cl); |             DEC_CLREF_COUNT(cl); | ||||||
| 						erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); |             erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); | ||||||
| 						if (erase) |             if (erase) { | ||||||
| 						{ |               saveregs(); | ||||||
| 							saveregs(); |               /* at this point, | ||||||
| 							/* at this point, | we are the only ones accessing the clause, | ||||||
| 			 we are the only ones accessing the clause, | hence we don't need to have a lock it */ | ||||||
| 			 hence we don't need to have a lock it */ |               Yap_ErLogUpdCl(cl); | ||||||
| 							Yap_ErLogUpdCl(cl); |               setregs(); | ||||||
| 							setregs(); |             } | ||||||
| 						} |             UNLOCK(ap->PELock); | ||||||
| 						UNLOCK(ap->PELock); |           } | ||||||
| 					} |         } | ||||||
| 				} |       } else { | ||||||
| 			} |         DynamicClause *cl = ClauseFlagsToDynamicClause(pt1); | ||||||
| 			else |         int erase; | ||||||
| 			{ |  | ||||||
| 				DynamicClause *cl = ClauseFlagsToDynamicClause(pt1); |  | ||||||
| 				int erase; |  | ||||||
|  |  | ||||||
| 				LOCK(cl->ClLock); |         LOCK(cl->ClLock); | ||||||
| 				DEC_CLREF_COUNT(cl); |         DEC_CLREF_COUNT(cl); | ||||||
| 				erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); |         erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); | ||||||
| 				UNLOCK(cl->ClLock); |         UNLOCK(cl->ClLock); | ||||||
| 				if (erase) |         if (erase) { | ||||||
| 				{ |           saveregs(); | ||||||
| 					saveregs(); |           /* at this point, | ||||||
| 					/* at this point, | we are the only ones accessing the clause, | ||||||
| 		     we are the only ones accessing the clause, | hence we don't need to have a lock it */ | ||||||
| 		     hence we don't need to have a lock it */ |           Yap_ErCl(cl); | ||||||
| 					Yap_ErCl(cl); |           setregs(); | ||||||
| 					setregs(); |         } | ||||||
| 				} |       } | ||||||
| 			} |     } | ||||||
| 		} |  | ||||||
| #else | #else | ||||||
| 		ResetFlag(InUseMask, flags); |     ResetFlag(InUseMask, flags); | ||||||
| 		*pt1 = flags; |     *pt1 = flags; | ||||||
| 		if (FlagOn((ErasedMask | DirtyMask), flags)) |     if (FlagOn((ErasedMask | DirtyMask), flags)) { | ||||||
| 		{ |       if (FlagOn(DBClMask, flags)) { | ||||||
| 			if (FlagOn(DBClMask, flags)) |         saveregs(); | ||||||
| 			{ |         Yap_ErDBE(DBStructFlagsToDBStruct(pt1)); | ||||||
| 				saveregs(); |         setregs(); | ||||||
| 				Yap_ErDBE(DBStructFlagsToDBStruct(pt1)); |       } else { | ||||||
| 				setregs(); |         saveregs(); | ||||||
| 			} |         if (flags & LogUpdMask) { | ||||||
| 			else |           if (flags & IndexMask) { | ||||||
| 			{ |             if (FlagOn(ErasedMask, flags)) { | ||||||
| 				saveregs(); |               Yap_ErLogUpdIndex(ClauseFlagsToLogUpdIndex(pt1)); | ||||||
| 				if (flags & LogUpdMask) |             } else { | ||||||
| 				{ |               Yap_CleanUpIndex(ClauseFlagsToLogUpdIndex(pt1)); | ||||||
| 					if (flags & IndexMask) |             } | ||||||
| 					{ |           } else { | ||||||
| 						if (FlagOn(ErasedMask, flags)) |             Yap_ErLogUpdCl(ClauseFlagsToLogUpdClause(pt1)); | ||||||
| 						{ |           } | ||||||
| 							Yap_ErLogUpdIndex(ClauseFlagsToLogUpdIndex(pt1)); |         } else { | ||||||
| 						} |           Yap_ErCl(ClauseFlagsToDynamicClause(pt1)); | ||||||
| 						else |         } | ||||||
| 						{ |         setregs(); | ||||||
| 							Yap_CleanUpIndex(ClauseFlagsToLogUpdIndex(pt1)); |       } | ||||||
| 						} |     } | ||||||
| 					} |  | ||||||
| 					else |  | ||||||
| 					{ |  | ||||||
| 						Yap_ErLogUpdCl(ClauseFlagsToLogUpdClause(pt1)); |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 				else |  | ||||||
| 				{ |  | ||||||
| 					Yap_ErCl(ClauseFlagsToDynamicClause(pt1)); |  | ||||||
| 				} |  | ||||||
| 				setregs(); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| #endif | #endif | ||||||
| 		goto failloop; |     goto failloop; | ||||||
| 	} |   } | ||||||
| #ifdef MULTI_ASSIGNMENT_VARIABLES | #ifdef MULTI_ASSIGNMENT_VARIABLES | ||||||
| 	else /* if (IsApplTerm(d1)) */ |   else /* if (IsApplTerm(d1)) */ | ||||||
| 	{ |   { | ||||||
| 		CELL *pt = RepAppl(d1); |     CELL *pt = RepAppl(d1); | ||||||
| /* AbsAppl means */ | /* AbsAppl means */ | ||||||
| /* multi-assignment variable */ | /* multi-assignment variable */ | ||||||
| /* so the next cell is the old value */ | /* so the next cell is the old value */ | ||||||
| #ifdef FROZEN_STACKS | #ifdef FROZEN_STACKS | ||||||
| 		--pt0; |     --pt0; | ||||||
| 		pt[0] = TrailVal(pt0); |     pt[0] = TrailVal(pt0); | ||||||
| #else | #else | ||||||
| 		pt[0] = TrailTerm(pt0 - 1); |     pt[0] = TrailTerm(pt0 - 1); | ||||||
| 		pt0 -= 2; |     pt0 -= 2; | ||||||
| #endif /* FROZEN_STACKS */ | #endif /* FROZEN_STACKS */ | ||||||
| 		goto failloop; |     goto failloop; | ||||||
| 	} |   } | ||||||
| #endif | #endif | ||||||
| 	ENDD(d1); |   ENDD(d1); | ||||||
| 	ENDCACHE_TR(); |   ENDCACHE_TR(); | ||||||
| } | } | ||||||
|  |  | ||||||
| #ifdef COROUTINING | #ifdef COROUTINING | ||||||
| NoStackFail: | NoStackFail: | ||||||
| 	BEGD(d0); |   BEGD(d0); | ||||||
| #ifdef SHADOW_S | #ifdef SHADOW_S | ||||||
| 	Yap_REGS.S_ = SREG; |   Yap_REGS.S_ = SREG; | ||||||
| #endif | #endif | ||||||
| 	saveregs(); |   saveregs(); | ||||||
| 	d0 = interrupt_fail(PASS_REGS1); |   d0 = interrupt_fail(PASS_REGS1); | ||||||
| 	setregs(); |   setregs(); | ||||||
| #ifdef SHADOW_S | #ifdef SHADOW_S | ||||||
| 	SREG = Yap_REGS.S_; |   SREG = Yap_REGS.S_; | ||||||
| #endif | #endif | ||||||
| 	if (!d0) |   if (!d0) | ||||||
| 		FAIL(); |     FAIL(); | ||||||
| 	JMPNext(); |   JMPNext(); | ||||||
| 	ENDD(d0); |   ENDD(d0); | ||||||
|  |  | ||||||
| #endif /* COROUTINING */ | #endif /* COROUTINING */ | ||||||
| 	ENDPBOp(); |   ENDPBOp(); | ||||||
| #ifdef INDENT_CODE | #ifdef INDENT_CODE | ||||||
| } | } | ||||||
| #endif /* INDENT_CODE */ | #endif /* INDENT_CODE */ | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								C/text.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								C/text.c
									
									
									
									
									
								
							| @@ -537,7 +537,7 @@ static Term write_strings(unsigned char *s0, seq_tv_t *out, | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   char *s = (char *)s0, *lim = s + max; |   char *s = (char *)s0; | ||||||
|   Term t = init_tstring(PASS_REGS1); |   Term t = init_tstring(PASS_REGS1); | ||||||
|   LOCAL_TERM_ERROR(t, 2 * max); |   LOCAL_TERM_ERROR(t, 2 * max); | ||||||
|   unsigned char *buf = buf_from_tstring(HR); |   unsigned char *buf = buf_from_tstring(HR); | ||||||
|   | |||||||
| @@ -354,7 +354,7 @@ bool low_level_trace__(yap_low_level_port port, PredEntry *pred, CELL *args) { | |||||||
|     printf("\n"); |     printf("\n"); | ||||||
|   } |   } | ||||||
| #endif | #endif | ||||||
|   b += snprintf(b, top - b, Int_FORMAT " "UInt_FORMAT " ", vsc_count, LCL0 - (CELL *)B); |   b += snprintf(b, top - b,  "%llud "UInt_FORMAT " ", vsc_count, LCL0 - (CELL *)B); | ||||||
|   b += snprintf(b, top - b, Int_FORMAT " ", LCL0 - (CELL *)Yap_REGS.CUT_C_TOP); |   b += snprintf(b, top - b, Int_FORMAT " ", LCL0 - (CELL *)Yap_REGS.CUT_C_TOP); | ||||||
| #if defined(THREADS) || defined(YAPOR) | #if defined(THREADS) || defined(YAPOR) | ||||||
|   b += snprintf(b, top - b, "(%d)", worker_id); |   b += snprintf(b, top - b, "(%d)", worker_id); | ||||||
| @@ -482,7 +482,7 @@ static Int reset_total_choicepoints(USES_REGS1) { | |||||||
| } | } | ||||||
|  |  | ||||||
| static Int show_low_level_trace(USES_REGS1) { | static Int show_low_level_trace(USES_REGS1) { | ||||||
|   fprintf(stderr, "Call counter=" Int_FORMAT "\n", vsc_count); |   fprintf(stderr, "Call counter=%lld\n", vsc_count); | ||||||
|   return (TRUE); |   return (TRUE); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -610,7 +610,7 @@ static void putAtom(Atom atom, int Quote_illegal, struct write_globs *wglb) { | |||||||
|     while (*s) { |     while (*s) { | ||||||
|       int32_t ch; |       int32_t ch; | ||||||
|       s += get_utf8(s, 1, &ch); |       s += get_utf8(s, 1, &ch); | ||||||
|       write_quoted(ch, '\'', stream); |       write_quoted( ch, '\'', stream); | ||||||
|     } |     } | ||||||
|     wrputc('\'', stream); |     wrputc('\'', stream); | ||||||
|   } else { |   } else { | ||||||
|   | |||||||
| @@ -1,8 +1,7 @@ | |||||||
| #ifdef FROZEN_STACKS | #ifdef FROZEN_STACKS | ||||||
| { | { | ||||||
|   tr_fr_ptr pt0, pt1, pbase; |   tr_fr_ptr pt0, pt1, pbase, ptop; | ||||||
|  restart: |   pbase = B->cp_tr, ptop = TR; | ||||||
|   pbase = B->cp_tr; |  | ||||||
|   pt0 = pt1 = TR - 1; |   pt0 = pt1 = TR - 1; | ||||||
|   while (pt1 >= pbase) { |   while (pt1 >= pbase) { | ||||||
|     BEGD(d1); |     BEGD(d1); | ||||||
| @@ -33,10 +32,7 @@ | |||||||
|         Functor f = FunctorOfTerm(t); |         Functor f = FunctorOfTerm(t); | ||||||
|         if (f == FunctorBigInt) { |         if (f == FunctorBigInt) { | ||||||
|           Int tag = Yap_blob_tag(t) - USER_BLOB_START; |           Int tag = Yap_blob_tag(t) - USER_BLOB_START; | ||||||
| 	  RESET_VARIABLE(&TrailTerm(pt1)); |  | ||||||
| 	  RESET_VARIABLE(&TrailVal(pt1)); |  | ||||||
|           GLOBAL_OpaqueHandlers[tag].cut_handler(d1); |           GLOBAL_OpaqueHandlers[tag].cut_handler(d1); | ||||||
| 	  goto restart; |  | ||||||
|         } else { |         } else { | ||||||
|           pt0--; |           pt0--; | ||||||
|         } |         } | ||||||
| @@ -91,8 +87,12 @@ | |||||||
|   if (pt0 != pt1) { |   if (pt0 != pt1) { | ||||||
|     int size; |     int size; | ||||||
|     pt0++; |     pt0++; | ||||||
|     size = TR - pt0; |     size = ptop - pt0; | ||||||
|     memmove(pbase, pt0, size * sizeof(struct trail_frame)); |     memmove(pbase, pt0, size * sizeof(struct trail_frame)); | ||||||
|  |     if (ptop != TR) { | ||||||
|  |       memmove(pbase + size, ptop, (TR - ptop) * sizeof(struct trail_frame)); | ||||||
|  |       size += (TR - ptop); | ||||||
|  |     } | ||||||
|     TR = pbase + size; |     TR = pbase + size; | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -113,7 +113,7 @@ extern VFS_t *GLOBAL_VFS; | |||||||
|  |  | ||||||
| extern void init_android_stream(void); | extern void init_android_stream(void); | ||||||
|  |  | ||||||
| extern void Yap_InitStdStream(int sno, SMALLUNSGN flags, FILE *file, VFS_t *vfsp); | extern void Yap_InitStdStream(int sno, unsigned int flags, FILE *file, VFS_t *vfsp); | ||||||
|  |  | ||||||
| static inline VFS_t *vfs_owner(const char *fname) { | static inline VFS_t *vfs_owner(const char *fname) { | ||||||
|   VFS_t *me = GLOBAL_VFS; |   VFS_t *me = GLOBAL_VFS; | ||||||
|   | |||||||
| @@ -7,9 +7,9 @@ | |||||||
|  *									 * |  *									 * | ||||||
|  ************************************************************************** |  ************************************************************************** | ||||||
|  *									 * |  *									 * | ||||||
|  * File:		YapInterface.h						 * |  * File:		YapInterface.h * | ||||||
|  * Last rev:	19/2/88							 * |  * Last rev:	19/2/88							 * | ||||||
|  * mods:									 * |  * mods: * | ||||||
|  * comments:	c_interface header file for YAP				 * |  * comments:	c_interface header file for YAP				 * | ||||||
|  *									 * |  *									 * | ||||||
|  *************************************************************************/ |  *************************************************************************/ | ||||||
| @@ -79,7 +79,6 @@ __BEGIN_DECLS | |||||||
|  |  | ||||||
| #include "YapFormat.h" | #include "YapFormat.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| /* Primitive Functions */ | /* Primitive Functions */ | ||||||
|  |  | ||||||
| #define YAP_Deref(t) (t) | #define YAP_Deref(t) (t) | ||||||
| @@ -661,18 +660,18 @@ extern X_API int YAP_RequiresExtraStack(size_t); | |||||||
|  * |  * | ||||||
|  * @return |  * @return | ||||||
|  */ /* |  */ /* | ||||||
|    * proccess command line arguments: valid switches are: |      * proccess command line arguments: valid switches are: | ||||||
|    *  -b    boot file |      *  -b    boot file | ||||||
|    *  -l    load file |      *  -l    load file | ||||||
|    *  -L    load file, followed by exit. |      *  -L    load file, followed by exit. | ||||||
|    *  -s    stack area size (K) |      *  -s    stack area size (K) | ||||||
|    *  -h    heap area size |      *  -h    heap area size | ||||||
|    *  -a    aux stack size |      *  -a    aux stack size | ||||||
|    *  -e    emacs_mode -m |      *  -e    emacs_mode -m | ||||||
|    *  -DVar=Value |      *  -DVar=Value | ||||||
|    *  reserved memory for alloc IF DEBUG |      *  reserved memory for alloc IF DEBUG | ||||||
|    *  -P    only in development versions |      *  -P    only in development versions | ||||||
|    */ |      */ | ||||||
| extern X_API YAP_file_type_t YAP_parse_yap_arguments(int argc, char *argv[], | extern X_API YAP_file_type_t YAP_parse_yap_arguments(int argc, char *argv[], | ||||||
|                                                      YAP_init_args *iap); |                                                      YAP_init_args *iap); | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user