|
From: Vitor S. C. <vs...@us...> - 2008-08-13 01:16:18
|
Update of /cvsroot/yap/C In directory sc8-pr-cvs10.sourceforge.net:/tmp/cvs-serv23329/C Modified Files: absmi.c sysbits.c Log Message: more locking fixes Index: absmi.c =================================================================== RCS file: /cvsroot/yap/C/absmi.c,v retrieving revision 1.246 retrieving revision 1.247 diff -u -r1.246 -r1.247 --- absmi.c 12 Aug 2008 01:27:22 -0000 1.246 +++ absmi.c 13 Aug 2008 01:16:26 -0000 1.247 @@ -12,6 +12,9 @@ * comments: Portable abstract machine interpreter * * Last rev: $Date$,$Author$ * * $Log$ +* Revision 1.247 2008/08/13 01:16:26 vsc +* more locking fixes +* * Revision 1.246 2008/08/12 01:27:22 vsc * MaxOS fixes * Avoid a thread deadlock @@ -13812,8 +13815,8 @@ if (ASP > (CELL *)PROTECT_FROZEN_B(B)) ASP = (CELL *)PROTECT_FROZEN_B(B); LOCK(SignalLock); - UNLOCK(SignalLock); if (ActiveSignals & YAP_CDOVF_SIGNAL) { + UNLOCK(SignalLock); saveregs_and_ycache(); if (!Yap_growheap(FALSE, 0, NULL)) { Yap_Error(OUT_OF_HEAP_ERROR, TermNil, "YAP failed to grow heap: %s", Yap_ErrorMessage); @@ -13824,12 +13827,13 @@ LOCK(SignalLock); ActiveSignals &= ~YAP_CDOVF_SIGNAL; CreepFlag = CalculateStackGap(); - UNLOCK(SignalLock); if (!ActiveSignals) { + UNLOCK(SignalLock); goto execute_after_comma; } } if (ActiveSignals & YAP_TROVF_SIGNAL) { + UNLOCK(SignalLock); #ifdef SHADOW_S S = SREG; #endif @@ -13843,17 +13847,20 @@ LOCK(SignalLock); ActiveSignals &= ~YAP_TROVF_SIGNAL; CreepFlag = CalculateStackGap(); - UNLOCK(SignalLock); if (!ActiveSignals) { + UNLOCK(SignalLock); goto execute_after_comma; } } if (ActiveSignals) { if (ActiveSignals & YAP_CDOVF_SIGNAL) { + UNLOCK(SignalLock); goto noheapleft; } + UNLOCK(SignalLock); goto creep; } + UNLOCK(SignalLock); saveregs(); if (!Yap_gc(((PredEntry *)SREG)->ArityOfPE, ENV, NEXTOP(PREG, sla))) { Yap_Error(OUT_OF_STACK_ERROR,TermNil,Yap_ErrorMessage); Index: sysbits.c =================================================================== RCS file: /cvsroot/yap/C/sysbits.c,v retrieving revision 1.109 retrieving revision 1.110 diff -u -r1.109 -r1.110 --- sysbits.c 23 May 2008 10:02:13 -0000 1.109 +++ sysbits.c 13 Aug 2008 01:16:26 -0000 1.110 @@ -2529,36 +2529,57 @@ non-backtrackable variable bad */ if (ActiveSignals & YAP_WAKEUP_SIGNAL) { ActiveSignals &= ~YAP_WAKEUP_SIGNAL; +#ifdef THREADS + pthread_mutex_unlock(&(ThreadHandle[worker_id].tlock)); +#endif UNLOCK(SignalLock); return Yap_unify(ARG1, MkAtomTerm(Yap_LookupAtom("sig_wake_up"))); } if (ActiveSignals & YAP_ITI_SIGNAL) { ActiveSignals &= ~YAP_ITI_SIGNAL; +#ifdef THREADS + pthread_mutex_unlock(&(ThreadHandle[worker_id].tlock)); +#endif UNLOCK(SignalLock); return Yap_unify(ARG1, MkAtomTerm(Yap_LookupAtom("sig_iti"))); } if (ActiveSignals & YAP_INT_SIGNAL) { ActiveSignals &= ~YAP_INT_SIGNAL; +#ifdef THREADS + pthread_mutex_unlock(&(ThreadHandle[worker_id].tlock)); +#endif UNLOCK(SignalLock); return Yap_unify(ARG1, MkAtomTerm(Yap_LookupAtom("sig_int"))); } if (ActiveSignals & YAP_USR2_SIGNAL) { ActiveSignals &= ~YAP_USR2_SIGNAL; +#ifdef THREADS + pthread_mutex_unlock(&(ThreadHandle[worker_id].tlock)); +#endif UNLOCK(SignalLock); return Yap_unify(ARG1, MkAtomTerm(Yap_LookupAtom("sig_usr2"))); } if (ActiveSignals & YAP_USR1_SIGNAL) { ActiveSignals &= ~YAP_USR1_SIGNAL; +#ifdef THREADS + pthread_mutex_unlock(&(ThreadHandle[worker_id].tlock)); +#endif UNLOCK(SignalLock); return Yap_unify(ARG1, MkAtomTerm(Yap_LookupAtom("sig_usr1"))); } if (ActiveSignals & YAP_PIPE_SIGNAL) { ActiveSignals &= ~YAP_PIPE_SIGNAL; +#ifdef THREADS + pthread_mutex_unlock(&(ThreadHandle[worker_id].tlock)); +#endif UNLOCK(SignalLock); return Yap_unify(ARG1, MkAtomTerm(Yap_LookupAtom("sig_pipe"))); } if (ActiveSignals & YAP_HUP_SIGNAL) { ActiveSignals &= ~YAP_HUP_SIGNAL; +#ifdef THREADS + pthread_mutex_unlock(&(ThreadHandle[worker_id].tlock)); +#endif UNLOCK(SignalLock); return Yap_unify(ARG1, MkAtomTerm(Yap_LookupAtom("sig_hup"))); } @@ -2569,43 +2590,64 @@ } if (ActiveSignals & YAP_DELAY_CREEP_SIGNAL) { ActiveSignals &= ~(YAP_CREEP_SIGNAL|YAP_DELAY_CREEP_SIGNAL); +#ifdef THREADS + pthread_mutex_unlock(&(ThreadHandle[worker_id].tlock)); +#endif UNLOCK(SignalLock); return Yap_unify(ARG1, MkAtomTerm(Yap_LookupAtom("sig_delay_creep"))); } if (ActiveSignals & YAP_CREEP_SIGNAL) { ActiveSignals &= ~YAP_CREEP_SIGNAL; +#ifdef THREADS + pthread_mutex_unlock(&(ThreadHandle[worker_id].tlock)); +#endif UNLOCK(SignalLock); return Yap_unify(ARG1, MkAtomTerm(Yap_LookupAtom("sig_creep"))); } if (ActiveSignals & YAP_TRACE_SIGNAL) { ActiveSignals &= ~YAP_TRACE_SIGNAL; +#ifdef THREADS + pthread_mutex_unlock(&(ThreadHandle[worker_id].tlock)); +#endif UNLOCK(SignalLock); return Yap_unify(ARG1, MkAtomTerm(Yap_LookupAtom("sig_trace"))); } if (ActiveSignals & YAP_DEBUG_SIGNAL) { ActiveSignals &= ~YAP_DEBUG_SIGNAL; +#ifdef THREADS + pthread_mutex_unlock(&(ThreadHandle[worker_id].tlock)); +#endif UNLOCK(SignalLock); return Yap_unify(ARG1, MkAtomTerm(Yap_LookupAtom("sig_debug"))); } if (ActiveSignals & YAP_BREAK_SIGNAL) { ActiveSignals &= ~YAP_BREAK_SIGNAL; +#ifdef THREADS + pthread_mutex_unlock(&(ThreadHandle[worker_id].tlock)); +#endif UNLOCK(SignalLock); return Yap_unify(ARG1, MkAtomTerm(Yap_LookupAtom("sig_break"))); } if (ActiveSignals & YAP_STACK_DUMP_SIGNAL) { ActiveSignals &= ~YAP_STACK_DUMP_SIGNAL; +#ifdef THREADS + pthread_mutex_unlock(&(ThreadHandle[worker_id].tlock)); +#endif UNLOCK(SignalLock); return Yap_unify(ARG1, MkAtomTerm(Yap_LookupAtom("sig_stack_dump"))); } if (ActiveSignals & YAP_STATISTICS_SIGNAL) { ActiveSignals &= ~YAP_STATISTICS_SIGNAL; +#ifdef THREADS + pthread_mutex_unlock(&(ThreadHandle[worker_id].tlock)); +#endif UNLOCK(SignalLock); return Yap_unify(ARG1, MkAtomTerm(Yap_LookupAtom("sig_statistics"))); } - UNLOCK(SignalLock); #ifdef THREADS - pthread_mutex_unlock(&(ThreadHandle[worker_id].tlock)); + pthread_mutex_unlock(&(ThreadHandle[worker_id].tlock)); #endif + UNLOCK(SignalLock); return FALSE; } |