fix mutex creation
This commit is contained in:
parent
dc21270454
commit
6d82d4816a
76
C/threads.c
76
C/threads.c
@ -918,6 +918,12 @@ static SWIMutex *MutexOfTerm__(Term t USES_REGS){
|
|||||||
mut = AddressOfTerm(t1);
|
mut = AddressOfTerm(t1);
|
||||||
} else if (IsAtomTerm(t1)) {
|
} else if (IsAtomTerm(t1)) {
|
||||||
mut = Yap_GetMutexFromProp(AtomOfTerm(t1));
|
mut = Yap_GetMutexFromProp(AtomOfTerm(t1));
|
||||||
|
if (!mut) {
|
||||||
|
mut = NewMutex();
|
||||||
|
if ( !Yap_PutAtomMutex( AtomOfTerm(t1), mut ) ) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return mut;
|
return mut;
|
||||||
}
|
}
|
||||||
@ -931,9 +937,18 @@ p_new_mutex( USES_REGS1 ){
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
return Yap_unify(ARG1, MkAddressTerm(mutp));
|
return Yap_unify(ARG1, MkAddressTerm(mutp));
|
||||||
} else if(IsAtomTerm(t1)) {
|
} else if(IsAtomTerm(t1)) {
|
||||||
mutp = NewMutex( );
|
if (!(mutp = NewMutex()))
|
||||||
|
return FALSE;
|
||||||
return Yap_PutAtomMutex( AtomOfTerm(t1), mutp );
|
return Yap_PutAtomMutex( AtomOfTerm(t1), mutp );
|
||||||
} else if (IsAddressTerm(t1)) {
|
} else if (IsAddressTerm(t1)) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -943,21 +958,16 @@ p_new_mutex( USES_REGS1 ){
|
|||||||
{
|
{
|
||||||
SWIMutex *mut = MutexOfTerm(Deref(ARG1));
|
SWIMutex *mut = MutexOfTerm(Deref(ARG1));
|
||||||
if (!mut)
|
if (!mut)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (pthread_mutex_destroy(&mut->m) < 0)
|
if (pthread_mutex_destroy(&mut->m) < 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
Yap_FreeCodeSpace((void *)mut);
|
Yap_FreeCodeSpace((void *)mut);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Int
|
static bool
|
||||||
p_lock_mutex( USES_REGS1 )
|
LockMutex( SWIMutex *mut USES_REGS)
|
||||||
{
|
{
|
||||||
SWIMutex *mut = MutexOfTerm(Deref(ARG1));
|
|
||||||
if (!mut)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
#if DEBUG_LOCKS
|
#if DEBUG_LOCKS
|
||||||
MUTEX_LOCK(&mut->m);
|
MUTEX_LOCK(&mut->m);
|
||||||
#else
|
#else
|
||||||
@ -966,6 +976,28 @@ p_lock_mutex( USES_REGS1 )
|
|||||||
#endif
|
#endif
|
||||||
mut->owners++;
|
mut->owners++;
|
||||||
mut->tid_own = worker_id;
|
mut->tid_own = worker_id;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
UnLockMutex( SWIMutex *mut )
|
||||||
|
{
|
||||||
|
#if DEBUG_LOCKS
|
||||||
|
MUTEX_UNLOCK(&mut->m);
|
||||||
|
#else
|
||||||
|
if (MUTEX_UNLOCK(&mut->m) < 0)
|
||||||
|
return FALSE;
|
||||||
|
#endif
|
||||||
|
mut->owners--;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Int
|
||||||
|
p_lock_mutex( USES_REGS1 )
|
||||||
|
{
|
||||||
|
SWIMutex *mut = MutexOfTerm(Deref(ARG1));
|
||||||
|
if (!mut || !LockMutex( mut PASS_REGS))
|
||||||
|
return FALSE;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -987,34 +1019,25 @@ static Int
|
|||||||
p_unlock_mutex( USES_REGS1 )
|
p_unlock_mutex( USES_REGS1 )
|
||||||
{
|
{
|
||||||
SWIMutex *mut = MutexOfTerm(Deref(ARG1));
|
SWIMutex *mut = MutexOfTerm(Deref(ARG1));
|
||||||
if (!mut)
|
if (!mut || !UnLockMutex( mut ))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
#if DEBUG_LOCKS
|
|
||||||
MUTEX_UNLOCK(&mut->m);
|
|
||||||
#else
|
|
||||||
if (MUTEX_UNLOCK(&mut->m) < 0)
|
|
||||||
return FALSE;
|
|
||||||
#endif
|
|
||||||
mut->owners--;
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Int
|
static Int
|
||||||
p_with_mutex( USES_REGS1 )
|
p_with_mutex( USES_REGS1 )
|
||||||
{
|
{
|
||||||
Term t1 = Deref(ARG1), excep;
|
Term excep;
|
||||||
Int rc = FALSE;
|
Int rc = FALSE;
|
||||||
Int creeping = Yap_get_signal(YAP_CREEP_SIGNAL);
|
Int creeping = Yap_get_signal(YAP_CREEP_SIGNAL);
|
||||||
PredEntry *pe;
|
PredEntry *pe;
|
||||||
Term tm = CurrentModule;
|
Term tm = CurrentModule;
|
||||||
Term tg = Deref(ARG2);
|
Term tg = Deref(ARG2);
|
||||||
|
SWIMutex *mut = MutexOfTerm( ARG1 );
|
||||||
|
|
||||||
if (!p_lock_mutex( PASS_REGS1 )) {
|
if (!mut || !LockMutex(mut PASS_REGS)) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
// this created the mutex
|
|
||||||
t1 = Deref(ARG1);
|
|
||||||
|
|
||||||
tg = Yap_StripModule(tg, &tm);
|
tg = Yap_StripModule(tg, &tm);
|
||||||
if (IsVarTerm(tg)) {
|
if (IsVarTerm(tg)) {
|
||||||
@ -1060,9 +1083,10 @@ p_with_mutex( USES_REGS1 )
|
|||||||
rc = TRUE;
|
rc = TRUE;
|
||||||
}
|
}
|
||||||
end:
|
end:
|
||||||
ARG1 = t1;
|
|
||||||
excep = Yap_GetException();
|
excep = Yap_GetException();
|
||||||
p_unlock_mutex( PASS_REGS1 );
|
if ( !UnLockMutex(mut) ) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
if (creeping) {
|
if (creeping) {
|
||||||
Yap_signal( YAP_CREEP_SIGNAL );
|
Yap_signal( YAP_CREEP_SIGNAL );
|
||||||
} else if ( excep != 0) {
|
} else if ( excep != 0) {
|
||||||
@ -1534,7 +1558,7 @@ void Yap_InitThreadPreds(void)
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
Yap_InitCPred("$valid_thread", 1, p_valid_thread, 0);
|
Yap_InitCPred("$valid_thread", 1, p_valid_thread, 0);
|
||||||
Yap_InitCPred("$new_mutex", 1, p_new_mutex, SafePredFlag);
|
Yap_InitCPred("mutex_create", 1, p_new_mutex, SafePredFlag);
|
||||||
Yap_InitCPred("$destroy_mutex", 1, p_destroy_mutex, SafePredFlag);
|
Yap_InitCPred("$destroy_mutex", 1, p_destroy_mutex, SafePredFlag);
|
||||||
Yap_InitCPred("$lock_mutex", 1, p_lock_mutex, SafePredFlag);
|
Yap_InitCPred("$lock_mutex", 1, p_lock_mutex, SafePredFlag);
|
||||||
Yap_InitCPred("$trylock_mutex", 1, p_trylock_mutex, SafePredFlag);
|
Yap_InitCPred("$trylock_mutex", 1, p_trylock_mutex, SafePredFlag);
|
||||||
@ -1722,7 +1746,7 @@ Yap_InitFirstWorkerThreadHandle(void)
|
|||||||
void Yap_InitThreadPreds(void)
|
void Yap_InitThreadPreds(void)
|
||||||
{
|
{
|
||||||
Yap_InitCPred("$with_mutex", 2, p_with_mutex, MetaPredFlag);
|
Yap_InitCPred("$with_mutex", 2, p_with_mutex, MetaPredFlag);
|
||||||
Yap_InitCPred("$new_mutex", 1, p_new_mutex, SafePredFlag);
|
Yap_InitCPred("mutex_create", 1, p_new_mutex, SafePredFlag);
|
||||||
Yap_InitCPred("$max_workers", 1, p_max_workers, 0);
|
Yap_InitCPred("$max_workers", 1, p_max_workers, 0);
|
||||||
Yap_InitCPred("$thread_self", 1, p_thread_self, SafePredFlag);
|
Yap_InitCPred("$thread_self", 1, p_thread_self, SafePredFlag);
|
||||||
Yap_InitCPred("$no_threads", 0, p_no_threads, SafePredFlag);
|
Yap_InitCPred("$no_threads", 0, p_no_threads, SafePredFlag);
|
||||||
|
Reference in New Issue
Block a user