From dc3b7079f42f0034ba972ae41d7d592c2074d058 Mon Sep 17 00:00:00 2001 From: vsc Date: Wed, 18 Apr 2007 23:01:16 +0000 Subject: [PATCH] fix deadlock when trying to create a module with the same name as a predicate (for now, just don't lock modules). obs Paulo Moura. git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1869 b08c6af1-5177-4d33-ba66-4b1c6b8b522a --- C/c_interface.c | 12 ++++++++++-- C/modules.c | 17 +++++++++-------- C/stdpreds.c | 9 ++++++--- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/C/c_interface.c b/C/c_interface.c index c3487e9e2..f3897b875 100644 --- a/C/c_interface.c +++ b/C/c_interface.c @@ -10,8 +10,11 @@ * File: c_interface.c * * comments: c_interface primitives definition * * * -* Last rev: $Date: 2007-03-30 16:47:22 $,$Author: vsc $ * +* Last rev: $Date: 2007-04-18 23:01:16 $,$Author: vsc $ * * $Log: not supported by cvs2svn $ +* Revision 1.91 2007/03/30 16:47:22 vsc +* fix gmpless blob handling +* * Revision 1.90 2007/03/22 11:12:20 vsc * make sure that YAP_Restart does not restart a failed goal. * @@ -1645,7 +1648,12 @@ YAP_CurrentModule(void) X_API Term YAP_CreateModule(Atom at) { - return Yap_Module(MkAtomTerm(at)); + Term t; + WRITE_LOCK(RepAtom(at)->ARWLock); + t = Yap_Module(MkAtomTerm(at)); + WRITE_UNLOCK(RepAtom(at)->ARWLock); + return t; + } X_API int diff --git a/C/modules.c b/C/modules.c index 0a2cb0a7d..b013d7de1 100644 --- a/C/modules.c +++ b/C/modules.c @@ -33,17 +33,18 @@ FetchModuleEntry(Atom at) Prop p0; AtomEntry *ae = RepAtom(at); - WRITE_LOCK(ae->ARWLock); + READ_LOCK(ae->ARWLock); p0 = ae->PropsOfAE; while (p0) { ModEntry *me = RepModProp(p0); if ( me->KindOfPE == ModProperty ) { - WRITE_UNLOCK(ae->ARWLock); + READ_UNLOCK(ae->ARWLock); return me; } p0 = me->NextOfPE; } + READ_UNLOCK(ae->ARWLock); return NULL; } @@ -55,13 +56,11 @@ GetModuleEntry(Atom at) AtomEntry *ae = RepAtom(at); ModEntry *new; - WRITE_LOCK(ae->ARWLock); p0 = ae->PropsOfAE; while (p0) { ModEntry *me = RepModProp(p0); if ( me->KindOfPE == ModProperty ) { - WRITE_UNLOCK(ae->ARWLock); return me; } p0 = me->NextOfPE; @@ -75,7 +74,6 @@ GetModuleEntry(Atom at) new->AtomOfME = ae; new->NextOfPE = ae->PropsOfAE; ae->PropsOfAE = AbsModProp(new); - WRITE_UNLOCK(ae->ARWLock); return new; } @@ -105,12 +103,14 @@ static ModEntry * LookupModule(Term a) { Atom at; + ModEntry *me; /* prolog module */ if (a == 0) return GetModuleEntry(AtomOfTerm(TermProlog)); at = AtomOfTerm(a); - return GetModuleEntry(at); + me = GetModuleEntry(at); + return me; } Term @@ -136,9 +136,10 @@ Yap_NewModulePred(Term mod, struct pred_entry *ap) if (!(me = LookupModule(mod))) return; - /* LOCK THIS */ + WRITE_LOCK(me->ModRWLock); ap->NextPredOfModule = me->PredForME; me->PredForME = ap; + WRITE_UNLOCK(me->ModRWLock); } static Int @@ -162,7 +163,7 @@ p_current_module(void) CurrentModule = t; LookupModule(CurrentModule); } - return (TRUE); + return TRUE; } static Int diff --git a/C/stdpreds.c b/C/stdpreds.c index 37ad18345..7fc6ee9c8 100644 --- a/C/stdpreds.c +++ b/C/stdpreds.c @@ -11,8 +11,11 @@ * File: stdpreds.c * * comments: General-purpose C implemented system predicates * * * -* Last rev: $Date: 2007-02-26 10:41:40 $,$Author: vsc $ * +* Last rev: $Date: 2007-04-18 23:01:16 $,$Author: vsc $ * * $Log: not supported by cvs2svn $ +* Revision 1.118 2007/02/26 10:41:40 vsc +* fix prolog_flags for chr. +* * Revision 1.117 2007/01/28 14:26:37 vsc * WIN32 support * @@ -2480,9 +2483,9 @@ cont_current_predicate(void) Term name; while (pp != NULL) { - if (pp->PredFlags & HiddenPredFlag) + if (pp->PredFlags & HiddenPredFlag) { pp = pp->NextPredOfModule; - else + } else break; } if (pp == NULL)