use PP with care:
- clean after interrupt; - use it only for indexing code.
This commit is contained in:
parent
827be2f8d0
commit
18506025c3
47
C/absmi.c
47
C/absmi.c
@ -949,6 +949,7 @@ interrupt_execute( USES_REGS1 )
|
|||||||
if ((v = check_alarm_fail_int( true PASS_REGS )) >= 0) {
|
if ((v = check_alarm_fail_int( true PASS_REGS )) >= 0) {
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
if (PP) UNLOCKPE(1,PP);
|
||||||
PP = P->y_u.pp.p0;
|
PP = P->y_u.pp.p0;
|
||||||
if ((PP->ExtraPredFlags & (NoTracePredFlag|HiddenPredFlag)) && Yap_only_has_signal(YAP_CREEP_SIGNAL)) {
|
if ((PP->ExtraPredFlags & (NoTracePredFlag|HiddenPredFlag)) && Yap_only_has_signal(YAP_CREEP_SIGNAL)) {
|
||||||
return 2;
|
return 2;
|
||||||
@ -975,6 +976,7 @@ interrupt_call( USES_REGS1 )
|
|||||||
if ((v = check_alarm_fail_int( true PASS_REGS )) >= 0) {
|
if ((v = check_alarm_fail_int( true PASS_REGS )) >= 0) {
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
if (PP) UNLOCKPE(1,PP);
|
||||||
PP = P->y_u.Osbpp.p0;
|
PP = P->y_u.Osbpp.p0;
|
||||||
if (Yap_only_has_signal(YAP_CREEP_SIGNAL) &&
|
if (Yap_only_has_signal(YAP_CREEP_SIGNAL) &&
|
||||||
(PP->ExtraPredFlags & (NoTracePredFlag|HiddenPredFlag)) ) {
|
(PP->ExtraPredFlags & (NoTracePredFlag|HiddenPredFlag)) ) {
|
||||||
@ -1002,6 +1004,7 @@ interrupt_pexecute( PredEntry *pen USES_REGS )
|
|||||||
if ((v = check_alarm_fail_int( 2 PASS_REGS )) >= 0) {
|
if ((v = check_alarm_fail_int( 2 PASS_REGS )) >= 0) {
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
if (PP) UNLOCKPE(1,PP);
|
||||||
PP = NULL;
|
PP = NULL;
|
||||||
if (Yap_only_has_signal(YAP_CREEP_SIGNAL)) {
|
if (Yap_only_has_signal(YAP_CREEP_SIGNAL)) {
|
||||||
return 2; /* keep on creeping */
|
return 2; /* keep on creeping */
|
||||||
@ -1046,6 +1049,7 @@ interrupt_deallocate( USES_REGS1 )
|
|||||||
} else {
|
} else {
|
||||||
CELL cut_b = LCL0-(CELL *)(S[E_CB]);
|
CELL cut_b = LCL0-(CELL *)(S[E_CB]);
|
||||||
|
|
||||||
|
if (PP) UNLOCKPE(1,PP);
|
||||||
PP = PREVOP(P,p)->y_u.p.p;
|
PP = PREVOP(P,p)->y_u.p.p;
|
||||||
ASP = YENV+E_CB;
|
ASP = YENV+E_CB;
|
||||||
/* cut_e */
|
/* cut_e */
|
||||||
@ -1174,6 +1178,7 @@ interrupt_commit_x( USES_REGS1 )
|
|||||||
if (Yap_only_has_signals(YAP_CDOVF_SIGNAL , YAP_CREEP_SIGNAL )) {
|
if (Yap_only_has_signals(YAP_CDOVF_SIGNAL , YAP_CREEP_SIGNAL )) {
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
if (PP) UNLOCKPE(1,PP);
|
||||||
PP = P->y_u.xps.p0;
|
PP = P->y_u.xps.p0;
|
||||||
/* find something to fool S */
|
/* find something to fool S */
|
||||||
if (P->opc == Yap_opcode(_fcall)) {
|
if (P->opc == Yap_opcode(_fcall)) {
|
||||||
@ -1205,6 +1210,7 @@ interrupt_either( USES_REGS1 )
|
|||||||
if (Yap_only_has_signal(YAP_CREEP_SIGNAL)) {
|
if (Yap_only_has_signal(YAP_CREEP_SIGNAL)) {
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
if (PP) UNLOCKPE(1,PP);
|
||||||
PP = P->y_u.Osblp.p0;
|
PP = P->y_u.Osblp.p0;
|
||||||
/* find something to fool S */
|
/* find something to fool S */
|
||||||
SET_ASP(YENV, P->y_u.Osbpp.s);
|
SET_ASP(YENV, P->y_u.Osbpp.s);
|
||||||
@ -1229,6 +1235,7 @@ interrupt_dexecute( USES_REGS1 )
|
|||||||
if (trace_interrupts) fprintf(stderr,"[%d] %lu--%lu %s/%d (YENV=%p ENV=%p ASP=%p)\n", worker_id, LOCAL_FirstActiveSignal, LOCAL_LastActiveSignal, \
|
if (trace_interrupts) fprintf(stderr,"[%d] %lu--%lu %s/%d (YENV=%p ENV=%p ASP=%p)\n", worker_id, LOCAL_FirstActiveSignal, LOCAL_LastActiveSignal, \
|
||||||
__FUNCTION__, __LINE__,YENV,ENV,ASP);
|
__FUNCTION__, __LINE__,YENV,ENV,ASP);
|
||||||
#endif
|
#endif
|
||||||
|
if (PP) UNLOCKPE(1,PP);
|
||||||
PP = P->y_u.pp.p0;
|
PP = P->y_u.pp.p0;
|
||||||
pe = P->y_u.pp.p;
|
pe = P->y_u.pp.p;
|
||||||
if ((PP->ExtraPredFlags & (NoTracePredFlag|HiddenPredFlag)) && Yap_only_has_signal(YAP_CREEP_SIGNAL)) {
|
if ((PP->ExtraPredFlags & (NoTracePredFlag|HiddenPredFlag)) && Yap_only_has_signal(YAP_CREEP_SIGNAL)) {
|
||||||
@ -2042,6 +2049,13 @@ Yap_absmi(int inp)
|
|||||||
UInt timestamp;
|
UInt timestamp;
|
||||||
CACHE_Y(B);
|
CACHE_Y(B);
|
||||||
|
|
||||||
|
#if defined(YAPOR) || defined(THREADS)
|
||||||
|
if (PP != PREG->y_u.OtaLl.d->ClPred) {
|
||||||
|
if (PP) UNLOCKPE(15,PP);
|
||||||
|
PP = PREG->y_u.OtaLl.d->ClPred;
|
||||||
|
PELOCK(15,PP);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
timestamp = IntegerOfTerm(((CELL *)(B_YREG+1))[PREG->y_u.OtaLl.s]);
|
timestamp = IntegerOfTerm(((CELL *)(B_YREG+1))[PREG->y_u.OtaLl.s]);
|
||||||
if (!VALID_TIMESTAMP(timestamp, PREG->y_u.OtaLl.d)) {
|
if (!VALID_TIMESTAMP(timestamp, PREG->y_u.OtaLl.d)) {
|
||||||
/* jump to next instruction */
|
/* jump to next instruction */
|
||||||
@ -2077,6 +2091,13 @@ Yap_absmi(int inp)
|
|||||||
LogUpdClause *lcl = PREG->y_u.OtILl.d;
|
LogUpdClause *lcl = PREG->y_u.OtILl.d;
|
||||||
UInt timestamp = IntegerOfTerm(((CELL *)(B_YREG+1))[ap->ArityOfPE]);
|
UInt timestamp = IntegerOfTerm(((CELL *)(B_YREG+1))[ap->ArityOfPE]);
|
||||||
|
|
||||||
|
#if defined(YAPOR) || defined(THREADS)
|
||||||
|
if (PP != ap) {
|
||||||
|
if (PP) UNLOCKPE(16,PP);
|
||||||
|
PP = ap;
|
||||||
|
PELOCK(16,PP);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (!VALID_TIMESTAMP(timestamp, lcl)) {
|
if (!VALID_TIMESTAMP(timestamp, lcl)) {
|
||||||
/* jump to next alternative */
|
/* jump to next alternative */
|
||||||
PREG = FAILCODE;
|
PREG = FAILCODE;
|
||||||
@ -2089,8 +2110,6 @@ Yap_absmi(int inp)
|
|||||||
/* HEY, leave indexing block alone!! */
|
/* HEY, leave indexing block alone!! */
|
||||||
/* check if we are the ones using this code */
|
/* check if we are the ones using this code */
|
||||||
#if MULTIPLE_STACKS
|
#if MULTIPLE_STACKS
|
||||||
PELOCK(1, ap);
|
|
||||||
PP = ap;
|
|
||||||
DEC_CLREF_COUNT(cl);
|
DEC_CLREF_COUNT(cl);
|
||||||
/* clear the entry from the trail */
|
/* clear the entry from the trail */
|
||||||
B->cp_tr--;
|
B->cp_tr--;
|
||||||
@ -2322,6 +2341,13 @@ Yap_absmi(int inp)
|
|||||||
UInt timestamp;
|
UInt timestamp;
|
||||||
CACHE_Y(B);
|
CACHE_Y(B);
|
||||||
|
|
||||||
|
#if defined(YAPOR) || defined(THREADS)
|
||||||
|
if (PP != PREG->y_u.OtaLl.d->ClPred) {
|
||||||
|
if (PP) UNLOCKPE(15,PP);
|
||||||
|
PP = PREG->y_u.OtaLl.d->ClPred;
|
||||||
|
PELOCK(15,PP);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
timestamp = IntegerOfTerm(((CELL *)(B_YREG+1))[PREG->y_u.OtaLl.s]);
|
timestamp = IntegerOfTerm(((CELL *)(B_YREG+1))[PREG->y_u.OtaLl.s]);
|
||||||
if (!VALID_TIMESTAMP(timestamp, PREG->y_u.OtaLl.d)) {
|
if (!VALID_TIMESTAMP(timestamp, PREG->y_u.OtaLl.d)) {
|
||||||
/* jump to next instruction */
|
/* jump to next instruction */
|
||||||
@ -2371,6 +2397,13 @@ Yap_absmi(int inp)
|
|||||||
LogUpdClause *lcl = PREG->y_u.OtILl.d;
|
LogUpdClause *lcl = PREG->y_u.OtILl.d;
|
||||||
UInt timestamp = IntegerOfTerm(((CELL *)(B_YREG+1))[ap->ArityOfPE]);
|
UInt timestamp = IntegerOfTerm(((CELL *)(B_YREG+1))[ap->ArityOfPE]);
|
||||||
|
|
||||||
|
#if defined(YAPOR) || defined(THREADS)
|
||||||
|
if (PP != ap) {
|
||||||
|
if (PP) UNLOCKPE(16,PP);
|
||||||
|
PP = ap;
|
||||||
|
PELOCK(16,PP);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (!VALID_TIMESTAMP(timestamp, lcl)) {
|
if (!VALID_TIMESTAMP(timestamp, lcl)) {
|
||||||
/* jump to next alternative */
|
/* jump to next alternative */
|
||||||
PREG = FAILCODE;
|
PREG = FAILCODE;
|
||||||
@ -2511,8 +2544,10 @@ Yap_absmi(int inp)
|
|||||||
/* lock logical updates predicate. */
|
/* lock logical updates predicate. */
|
||||||
Op(unlock_lu, e);
|
Op(unlock_lu, e);
|
||||||
#if defined(YAPOR) || defined(THREADS)
|
#if defined(YAPOR) || defined(THREADS)
|
||||||
|
if (PP) {
|
||||||
UNLOCKPE(1,PP);
|
UNLOCKPE(1,PP);
|
||||||
PP = NULL;
|
PP = NULL;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
PREG = NEXTOP(PREG, e);
|
PREG = NEXTOP(PREG, e);
|
||||||
GONext();
|
GONext();
|
||||||
@ -8620,7 +8655,8 @@ Yap_absmi(int inp)
|
|||||||
CACHE_Y(B);
|
CACHE_Y(B);
|
||||||
|
|
||||||
#if defined(YAPOR) || defined(THREADS)
|
#if defined(YAPOR) || defined(THREADS)
|
||||||
if (!PP) {
|
if (PP != PREG->y_u.OtaLl.d->ClPred) {
|
||||||
|
if (PP) UNLOCKPE(15,PP);
|
||||||
PP = PREG->y_u.OtaLl.d->ClPred;
|
PP = PREG->y_u.OtaLl.d->ClPred;
|
||||||
PELOCK(15,PP);
|
PELOCK(15,PP);
|
||||||
}
|
}
|
||||||
@ -8660,9 +8696,10 @@ Yap_absmi(int inp)
|
|||||||
|
|
||||||
/* fprintf(stderr,"- %p/%p %d %d %p\n",PREG,ap,timestamp,ap->TimeStampOfPred,PREG->y_u.OtILl.d->ClCode);*/
|
/* fprintf(stderr,"- %p/%p %d %d %p\n",PREG,ap,timestamp,ap->TimeStampOfPred,PREG->y_u.OtILl.d->ClCode);*/
|
||||||
#if defined(YAPOR) || defined(THREADS)
|
#if defined(YAPOR) || defined(THREADS)
|
||||||
if (!PP) {
|
if (PP != ap) {
|
||||||
PELOCK(16,ap);
|
if (PP) UNLOCKPE(16,PP);
|
||||||
PP = ap;
|
PP = ap;
|
||||||
|
PELOCK(16,PP);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (!VALID_TIMESTAMP(timestamp, lcl)) {
|
if (!VALID_TIMESTAMP(timestamp, lcl)) {
|
||||||
|
27
C/amasm.c
27
C/amasm.c
@ -3054,6 +3054,13 @@ do_pass(int pass_no, yamop **entry_codep, int assembling, int *clause_has_blobsp
|
|||||||
code_p = a_try(_try_me, 0, LOCAL_IPredArity, code_p, pass_no, cip);
|
code_p = a_try(_try_me, 0, LOCAL_IPredArity, code_p, pass_no, cip);
|
||||||
#endif /* YAPOR */
|
#endif /* YAPOR */
|
||||||
}
|
}
|
||||||
|
#if THREADS||YAPOR
|
||||||
|
if (log_update) {
|
||||||
|
// separate from indexing code,
|
||||||
|
//clauses are protected by time-stamps
|
||||||
|
code_p = a_e(_unlock_lu, code_p, pass_no);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
/* index code */
|
/* index code */
|
||||||
if (log_update) {
|
if (log_update) {
|
||||||
@ -3365,13 +3372,6 @@ do_pass(int pass_no, yamop **entry_codep, int assembling, int *clause_has_blobsp
|
|||||||
(*clause_has_blobsp || *clause_has_dbtermp) &&
|
(*clause_has_blobsp || *clause_has_dbtermp) &&
|
||||||
!clinfo.alloc_found)
|
!clinfo.alloc_found)
|
||||||
code_p = a_cle(_alloc_for_logical_pred, code_p, pass_no, cip);
|
code_p = a_cle(_alloc_for_logical_pred, code_p, pass_no, cip);
|
||||||
#if defined(THREADS) || defined(YAPOR)
|
|
||||||
else
|
|
||||||
if (cip->CurrentPred->PredFlags & LogUpdatePredFlag &&
|
|
||||||
!(cip->CurrentPred->PredFlags & ThreadLocalPredFlag) &&
|
|
||||||
!clinfo.alloc_found)
|
|
||||||
code_p = a_e(_unlock_lu, code_p, pass_no);
|
|
||||||
#endif
|
|
||||||
code_p = a_cut(&clinfo, code_p, pass_no, cip);
|
code_p = a_cut(&clinfo, code_p, pass_no, cip);
|
||||||
break;
|
break;
|
||||||
case allocate_op:
|
case allocate_op:
|
||||||
@ -3465,25 +3465,12 @@ do_pass(int pass_no, yamop **entry_codep, int assembling, int *clause_has_blobsp
|
|||||||
(*clause_has_blobsp || *clause_has_dbtermp) &&
|
(*clause_has_blobsp || *clause_has_dbtermp) &&
|
||||||
!clinfo.alloc_found)
|
!clinfo.alloc_found)
|
||||||
code_p = a_cle(_alloc_for_logical_pred, code_p, pass_no, cip);
|
code_p = a_cle(_alloc_for_logical_pred, code_p, pass_no, cip);
|
||||||
#if defined(THREADS) || defined(YAPOR)
|
|
||||||
else
|
|
||||||
if (cip->CurrentPred->PredFlags & LogUpdatePredFlag &&
|
|
||||||
!(cip->CurrentPred->PredFlags & ThreadLocalPredFlag) &&
|
|
||||||
!clinfo.alloc_found)
|
|
||||||
code_p = a_e(_unlock_lu, code_p, pass_no);
|
|
||||||
#endif
|
|
||||||
code_p = a_pl(_procceed, cip->CurrentPred, code_p, pass_no);
|
code_p = a_pl(_procceed, cip->CurrentPred, code_p, pass_no);
|
||||||
break;
|
break;
|
||||||
case call_op:
|
case call_op:
|
||||||
code_p = a_p(_call, &clinfo, code_p, pass_no, cip);
|
code_p = a_p(_call, &clinfo, code_p, pass_no, cip);
|
||||||
break;
|
break;
|
||||||
case execute_op:
|
case execute_op:
|
||||||
#if defined(THREADS) || defined(YAPOR)
|
|
||||||
if (cip->CurrentPred->PredFlags & LogUpdatePredFlag &&
|
|
||||||
!(cip->CurrentPred->PredFlags & ThreadLocalPredFlag) &&
|
|
||||||
!clinfo.alloc_found)
|
|
||||||
code_p = a_e(_unlock_lu, code_p, pass_no);
|
|
||||||
#endif
|
|
||||||
code_p = a_p(_execute, &clinfo, code_p, pass_no, cip);
|
code_p = a_p(_execute, &clinfo, code_p, pass_no, cip);
|
||||||
break;
|
break;
|
||||||
case safe_call_op:
|
case safe_call_op:
|
||||||
|
@ -1616,6 +1616,7 @@ prune(choiceptr cp USES_REGS)
|
|||||||
setregs(); \
|
setregs(); \
|
||||||
SREG = Yap_REGS.S_; \
|
SREG = Yap_REGS.S_; \
|
||||||
if (!d0) FAIL(); \
|
if (!d0) FAIL(); \
|
||||||
|
PP = NULL;\
|
||||||
if (d0 == 2) goto C; \
|
if (d0 == 2) goto C; \
|
||||||
JMPNext(); \
|
JMPNext(); \
|
||||||
ENDD(d0);
|
ENDD(d0);
|
||||||
@ -1625,6 +1626,7 @@ prune(choiceptr cp USES_REGS)
|
|||||||
saveregs(); \
|
saveregs(); \
|
||||||
d0 = F ( PASS_REGS1 );\
|
d0 = F ( PASS_REGS1 );\
|
||||||
setregs(); \
|
setregs(); \
|
||||||
|
PP = NULL;\
|
||||||
if (!d0) FAIL(); \
|
if (!d0) FAIL(); \
|
||||||
if (d0 == 2) goto C; \
|
if (d0 == 2) goto C; \
|
||||||
JMPNext(); \
|
JMPNext(); \
|
||||||
|
Reference in New Issue
Block a user