diff --git a/C/absmi.c b/C/absmi.c index d1e17ce60..79e455227 100644 --- a/C/absmi.c +++ b/C/absmi.c @@ -6313,7 +6313,7 @@ Yap_absmi(int inp) saveregs(); { PredEntry *ap = PredFromDefCode(PREG); - WRITE_LOCK(ap->PRWLock); + WRITE_LOCK(ap->PRWLock); #if defined(YAPOR) || defined(THREADS) /* we do not lock access to the predicate, @@ -6369,6 +6369,10 @@ Yap_absmi(int inp) UNLOCK(pe->PELock); JMPNext(); } + if (PP == NULL) { + READ_LOCK(pe->PRWLock); + PP = pe; + } #endif saveregs(); pt0 = Yap_ExpandIndex(pe); diff --git a/C/alloc.c b/C/alloc.c index 8ae097ab8..f7ff7ad8c 100644 --- a/C/alloc.c +++ b/C/alloc.c @@ -12,7 +12,7 @@ * Last rev: * * mods: * * comments: allocating space * -* version:$Id: alloc.c,v 1.46 2004-02-19 19:24:44 vsc Exp $ * +* version:$Id: alloc.c,v 1.47 2004-02-20 18:56:06 vsc Exp $ * *************************************************************************/ #ifdef SCCS static char SccsId[] = "%W% %G%"; @@ -189,7 +189,7 @@ Yap_InitExStacks(int Trail, int Stack) void Yap_KillStacks(int wid) { - ADDR gb = Yap_thread_gl[worker_id].global_base; + ADDR gb = Yap_thread_gl[wid].global_base; if (gb) { free(gb); Yap_thread_gl[wid].global_base = NULL; diff --git a/C/cdmgr.c b/C/cdmgr.c index 41e6c309e..082b194b2 100644 --- a/C/cdmgr.c +++ b/C/cdmgr.c @@ -1130,6 +1130,9 @@ addclause(Term t, yamop *cp, int mode, int mod) /* we are redefining a prolog module predicate */ if (p->ModuleOfPred == PROLOG_MODULE && mod != TermProlog && mod) { +#if defined(YAPOR) || defined(THREADS) + WPP = NULL; +#endif WRITE_UNLOCK(p->PRWLock); addcl_permission_error(RepAtom(at), Arity, FALSE); return TermNil; @@ -1236,6 +1239,9 @@ Yap_EraseStaticClause(StaticClause *cl, Term mod) { } } WRITE_LOCK(ap->PRWLock); +#if defined(YAPOR) || defined(THREADS) + WPP = NULL; +#endif if (ap->PredFlags & IndexedPredFlag) RemoveIndexation(ap); ap->cs.p_code.NOfClauses--; @@ -1277,6 +1283,9 @@ Yap_EraseStaticClause(StaticClause *cl, Term mod) { ap->OpcodeOfPred = ap->cs.p_code.TrueCodeOfPred->opc; } +#if defined(YAPOR) || defined(THREADS) + WPP = NULL; +#endif WRITE_UNLOCK(ap->PRWLock); if (cl->ClFlags & HasBlobsMask || static_in_use(ap,TRUE)) { DeadClause *dcl = (DeadClause *)cl; diff --git a/C/dbase.c b/C/dbase.c index 9810fffbb..b2bc6b644 100644 --- a/C/dbase.c +++ b/C/dbase.c @@ -3850,8 +3850,13 @@ static void EraseLogUpdCl(LogUpdClause *clau) { PredEntry *ap; - LOCK(clau->ClLock); ap = clau->ClPred; +#if defined(YAPOR) || defined(THREADS) + if (WPP != ap) { + WRITE_LOCK(ap->PRWLock); + } +#endif + LOCK(clau->ClLock); /* no need to erase what has been erased */ if (!(clau->ClFlags & ErasedMask)) { /* get ourselves out of the list */ @@ -3865,7 +3870,7 @@ EraseLogUpdCl(LogUpdClause *clau) clau->ClPrev->ClNext = clau->ClNext; UNLOCK(clau->ClPrev->ClLock); } - WRITE_LOCK(ap->PRWLock); + UNLOCK(clau->ClLock); if (clau->ClCode == ap->cs.p_code.FirstClause) { if (clau->ClNext == NULL) { ap->cs.p_code.FirstClause = NULL; @@ -3881,7 +3886,6 @@ EraseLogUpdCl(LogUpdClause *clau) } } ap->cs.p_code.NOfClauses--; - WRITE_UNLOCK(ap->PRWLock); clau->ClFlags |= ErasedMask; #ifdef DEBUG { @@ -3906,6 +3910,11 @@ EraseLogUpdCl(LogUpdClause *clau) } UNLOCK(clau->ClLock); complete_lu_erase(clau); +#if defined(YAPOR) || defined(THREADS) + if (WPP != ap) { + WRITE_UNLOCK(ap->PRWLock); + } +#endif } static void diff --git a/C/exec.c b/C/exec.c index 12a37f579..1ac5481be 100644 --- a/C/exec.c +++ b/C/exec.c @@ -1162,6 +1162,9 @@ do_goal(yamop *CodeAdr, int arity, CELL *pt, int top) #endif /* DEPTH_LIMIT */ YENV = ASP = (CELL *)B; HB = H; +#if defined(YAPOR) || defined(THREADS) + WPP = NULL; +#endif YENV[E_CB] = Unsigned (B); P = (yamop *) CodeAdr; CP = YESCODE; diff --git a/C/sysbits.c b/C/sysbits.c index 4a1bd2c02..1d9224f01 100644 --- a/C/sysbits.c +++ b/C/sysbits.c @@ -1326,7 +1326,7 @@ InitSignals (void) #ifndef MPW my_signal (SIGFPE, HandleMatherr); #endif -#if HAVE_SIGSEGV +#if HAVE_SIGSEGV && !defined(THREADS) my_signal_info (SIGSEGV, HandleSIGSEGV); #endif #ifdef ACOW diff --git a/C/tracer.c b/C/tracer.c index 9aaa282e1..90a5d78b4 100644 --- a/C/tracer.c +++ b/C/tracer.c @@ -116,9 +116,6 @@ low_level_trace(yap_low_level_port port, PredEntry *pred, CELL *args) LOCK(heap_regs->low_level_trace_lock); vsc_count++; - if (vsc_count == 52404) vsc_xstop = 1; - UNLOCK(heap_regs->low_level_trace_lock); - return; #ifdef COMMENTED // if (vsc_count == 218280) // vsc_xstop = 1; diff --git a/m4/Yap.h.m4 b/m4/Yap.h.m4 index 2559770bc..155f0c9bf 100644 --- a/m4/Yap.h.m4 +++ b/m4/Yap.h.m4 @@ -10,7 +10,7 @@ * File: Yap.h.m4 * * mods: * * comments: main header file for YAP * -* version: $Id: Yap.h.m4,v 1.53 2004-02-13 18:39:29 vsc Exp $ * +* version: $Id: Yap.h.m4,v 1.54 2004-02-20 18:56:07 vsc Exp $ * *************************************************************************/ #include "config.h" @@ -333,6 +333,11 @@ typedef CELL Term; #if !defined(YAPOR) && !defined(THREADS) #include #elif USE_PTHREAD_LOCKING + +#ifndef _XOPEN_SOURCE +#define _XOPEN_SOURCE 600 +#endif + typedef pthread_mutex_t lockvar; typedef pthread_rwlock_t rwlock_t; #include @@ -349,6 +354,11 @@ typedef volatile int lockvar; typedef volatile int lockvar; #include #else + +#ifndef _XOPEN_SOURCE +#define _XOPEN_SOURCE 600 +#endif + typedef pthread_mutex_t lockvar; typedef pthread_rwlock_t rwlock_t; #include