more thread work to cean-up mutexes. Not finshed yet
This commit is contained in:
parent
afc6c5d04e
commit
624183b78e
@ -944,13 +944,13 @@ static Int init_current_predicate(USES_REGS1) {
|
|||||||
if (IsExtensionFunctor(f)) {
|
if (IsExtensionFunctor(f)) {
|
||||||
Yap_Error(TYPE_ERROR_CALLABLE, t3, "current_predicate/2");
|
Yap_Error(TYPE_ERROR_CALLABLE, t3, "current_predicate/2");
|
||||||
cut_fail();
|
cut_fail();
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
at = NameOfFunctor(f);
|
at = NameOfFunctor(f);
|
||||||
arity = ArityOfFunctor(f);
|
arity = ArityOfFunctor(f);
|
||||||
}
|
}
|
||||||
if (IsAtomTerm(t2)) // we know the module and the main predicate
|
if (IsAtomTerm(t2)) // we know the module and the main predicate
|
||||||
// so that we are deterministic
|
// so that we are deterministic
|
||||||
{
|
|
||||||
if (arity == 0) {
|
if (arity == 0) {
|
||||||
if (Yap_GetPredPropByAtom(at, t2) != NIL &&
|
if (Yap_GetPredPropByAtom(at, t2) != NIL &&
|
||||||
Yap_unify(ARG1, MkAtomTerm(at)))
|
Yap_unify(ARG1, MkAtomTerm(at)))
|
||||||
|
511
C/threads.c
511
C/threads.c
@ -880,21 +880,7 @@ typedef struct swi_mutex {
|
|||||||
pthread_mutex_t m;
|
pthread_mutex_t m;
|
||||||
} SWIMutex;
|
} SWIMutex;
|
||||||
|
|
||||||
static SWIMutex *MutexOfTerm(Term t)
|
static SWIMutex *NewMutex(void) {
|
||||||
{
|
|
||||||
Term t1 = Deref(t);
|
|
||||||
SWIMutex *mut = NULL;
|
|
||||||
if (IsVarTerm(t1)) {
|
|
||||||
} else if (IsAtomTerm(t1)) {
|
|
||||||
} else {
|
|
||||||
mut = AddressOfTerm(t1);
|
|
||||||
}
|
|
||||||
return mut;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Int
|
|
||||||
p_new_mutex( USES_REGS1 )
|
|
||||||
{
|
|
||||||
SWIMutex* mutp;
|
SWIMutex* mutp;
|
||||||
pthread_mutexattr_t mat;
|
pthread_mutexattr_t mat;
|
||||||
#if defined(HAVE_PTHREAD_MUTEXATTR_SETKIND_NP) && !defined(__MINGW32__)
|
#if defined(HAVE_PTHREAD_MUTEXATTR_SETKIND_NP) && !defined(__MINGW32__)
|
||||||
@ -916,19 +902,49 @@ p_new_mutex( USES_REGS1 )
|
|||||||
pthread_mutex_init(&mutp->m, &mat);
|
pthread_mutex_init(&mutp->m, &mat);
|
||||||
mutp->owners = 0;
|
mutp->owners = 0;
|
||||||
mutp->tid_own = 0;
|
mutp->tid_own = 0;
|
||||||
if (IsVarTerm((t1 = Deref(ARG1)))) {
|
return mutp;
|
||||||
return Yap_unify(t1, MkAddressTerm(mutp));
|
|
||||||
} else if(IsAtomTerm(t1)) {
|
|
||||||
return Yap_PutAtomMutex( AtomOfTerm(t1), mutp );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MutexOfTerm(t) MutexOfTerm__(t PASS_REGS)
|
||||||
|
|
||||||
|
static SWIMutex *MutexOfTerm__(Term t USES_REGS){
|
||||||
|
Term t1 = Deref(t);
|
||||||
|
SWIMutex *mut = NULL;
|
||||||
|
|
||||||
|
if (IsVarTerm(t1)) {
|
||||||
|
mut = NewMutex();
|
||||||
|
Yap_unify(MkAddressTerm(mut), ARG1);
|
||||||
|
} else if (IsIntegerTerm(t1)) {
|
||||||
|
mut = AddressOfTerm(t1);
|
||||||
|
} else if (IsAtomTerm(t1)) {
|
||||||
|
mut = Yap_GetMutexFromProp(AtomOfTerm(t1));
|
||||||
|
}
|
||||||
|
return mut;
|
||||||
|
}
|
||||||
|
|
||||||
static Int
|
static Int
|
||||||
p_destroy_mutex( USES_REGS1 )
|
p_new_mutex( USES_REGS1 ){
|
||||||
|
SWIMutex* mutp;
|
||||||
|
Term t1;
|
||||||
|
if (IsVarTerm((t1 = Deref(ARG1)))) {
|
||||||
|
if (!(mutp = NewMutex()))
|
||||||
|
return FALSE;
|
||||||
|
return Yap_unify(ARG1, MkAddressTerm(mutp));
|
||||||
|
} else if(IsAtomTerm(t1)) {
|
||||||
|
mutp = NewMutex( );
|
||||||
|
return Yap_PutAtomMutex( AtomOfTerm(t1), mutp );
|
||||||
|
} else if (IsAddressTerm(t1)) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Int p_destroy_mutex( USES_REGS1 )
|
||||||
{
|
{
|
||||||
SWIMutex *mut = (SWIMutex*)IntegerOfTerm(Deref(ARG1));
|
SWIMutex *mut = MutexOfTerm(Deref(ARG1));
|
||||||
|
if (!mut)
|
||||||
|
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);
|
||||||
@ -938,8 +954,10 @@ p_destroy_mutex( USES_REGS1 )
|
|||||||
static Int
|
static Int
|
||||||
p_lock_mutex( USES_REGS1 )
|
p_lock_mutex( USES_REGS1 )
|
||||||
{
|
{
|
||||||
SWIMutex *mut = (SWIMutex*)IntegerOfTerm(Deref(ARG1));
|
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
|
||||||
@ -954,8 +972,10 @@ p_lock_mutex( USES_REGS1 )
|
|||||||
static Int
|
static Int
|
||||||
p_trylock_mutex( USES_REGS1 )
|
p_trylock_mutex( USES_REGS1 )
|
||||||
{
|
{
|
||||||
SWIMutex *mut = (SWIMutex*)IntegerOfTerm(Deref(ARG1));
|
SWIMutex *mut = MutexOfTerm(Deref(ARG1));
|
||||||
|
if (!mut)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
if (MUTEX_TRYLOCK(&mut->m) == EBUSY)
|
if (MUTEX_TRYLOCK(&mut->m) == EBUSY)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
mut->owners++;
|
mut->owners++;
|
||||||
@ -966,8 +986,10 @@ p_trylock_mutex( USES_REGS1 )
|
|||||||
static Int
|
static Int
|
||||||
p_unlock_mutex( USES_REGS1 )
|
p_unlock_mutex( USES_REGS1 )
|
||||||
{
|
{
|
||||||
SWIMutex *mut = (SWIMutex*)IntegerOfTerm(Deref(ARG1));
|
SWIMutex *mut = MutexOfTerm(Deref(ARG1));
|
||||||
|
if (!mut)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
#if DEBUG_LOCKS
|
#if DEBUG_LOCKS
|
||||||
MUTEX_UNLOCK(&mut->m);
|
MUTEX_UNLOCK(&mut->m);
|
||||||
#else
|
#else
|
||||||
@ -981,7 +1003,6 @@ p_unlock_mutex( USES_REGS1 )
|
|||||||
static Int
|
static Int
|
||||||
p_with_mutex( USES_REGS1 )
|
p_with_mutex( USES_REGS1 )
|
||||||
{
|
{
|
||||||
SWIMutex *mut;
|
|
||||||
Term t1 = Deref(ARG1), excep;
|
Term t1 = Deref(ARG1), excep;
|
||||||
Int rc = FALSE;
|
Int rc = FALSE;
|
||||||
Int creeping = Yap_get_signal(YAP_CREEP_SIGNAL);
|
Int creeping = Yap_get_signal(YAP_CREEP_SIGNAL);
|
||||||
@ -989,14 +1010,11 @@ p_with_mutex( USES_REGS1 )
|
|||||||
Term tm = CurrentModule;
|
Term tm = CurrentModule;
|
||||||
Term tg = Deref(ARG2);
|
Term tg = Deref(ARG2);
|
||||||
|
|
||||||
if (IsVarTerm(t1)) {
|
|
||||||
p_new_mutex( PASS_REGS1 );
|
|
||||||
t1 = Deref(ARG1);
|
|
||||||
}
|
|
||||||
mut = (SWIMutex*)IntegerOfTerm(t1);
|
|
||||||
if (!p_lock_mutex( PASS_REGS1 )) {
|
if (!p_lock_mutex( PASS_REGS1 )) {
|
||||||
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)) {
|
||||||
@ -1042,7 +1060,7 @@ p_with_mutex( USES_REGS1 )
|
|||||||
rc = TRUE;
|
rc = TRUE;
|
||||||
}
|
}
|
||||||
end:
|
end:
|
||||||
ARG1 = MkIntegerTerm((Int)mut);
|
ARG1 = t1;
|
||||||
excep = Yap_GetException();
|
excep = Yap_GetException();
|
||||||
p_unlock_mutex( PASS_REGS1 );
|
p_unlock_mutex( PASS_REGS1 );
|
||||||
if (creeping) {
|
if (creeping) {
|
||||||
@ -1073,251 +1091,23 @@ p_unlock_with_mutex( USES_REGS1 )
|
|||||||
return p_unlock_mutex( PASS_REGS1 );
|
return p_unlock_mutex( PASS_REGS1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static Int
|
static Int
|
||||||
p_mutex_info( USES_REGS1 )
|
p_mutex_info( USES_REGS1 )
|
||||||
{
|
{
|
||||||
SWIMutex *mut = (SWIMutex*)IntegerOfTerm(Deref(ARG1));
|
SWIMutex *mut = MutexOfTerm(Deref(ARG1));
|
||||||
|
if (!mut)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
return Yap_unify(ARG2, MkIntegerTerm(mut->owners)) &&
|
return Yap_unify(ARG2, MkIntegerTerm(mut->owners)) &&
|
||||||
Yap_unify(ARG3, MkIntegerTerm(mut->tid_own));
|
Yap_unify(ARG3, MkIntegerTerm(mut->tid_own));
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Int
|
|
||||||
p_cond_create( USES_REGS1 )
|
|
||||||
{
|
|
||||||
pthread_cond_t* condp;
|
|
||||||
|
|
||||||
condp = (pthread_cond_t *)Yap_AllocCodeSpace(sizeof(pthread_cond_t));
|
|
||||||
if (condp == NULL) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
pthread_cond_init(condp, NULL);
|
|
||||||
return Yap_unify(ARG1, MkIntegerTerm((Int)condp));
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UInt indx;
|
UInt indx;
|
||||||
mbox_t mbox;
|
mbox_t mbox;
|
||||||
} counted_mbox;
|
} counted_mbox;
|
||||||
|
|
||||||
static Int
|
|
||||||
p_mbox_create( USES_REGS1 )
|
|
||||||
{
|
|
||||||
Term namet = Deref(ARG1);
|
|
||||||
mbox_t* mboxp = GLOBAL_named_mboxes;
|
|
||||||
|
|
||||||
if (IsVarTerm(namet)) {
|
|
||||||
AtomEntry *ae;
|
|
||||||
int new;
|
|
||||||
mbox_t mbox;
|
|
||||||
|
|
||||||
ae = Yap_lookupBlob(&mbox, sizeof(mbox), &PL_Message_Queue, &new);
|
|
||||||
namet = MkAtomTerm(RepAtom(ae));
|
|
||||||
mboxp = (mbox_t *)(ae->rep.blob[0].data);
|
|
||||||
Yap_unify(ARG1, namet);
|
|
||||||
LOCK(GLOBAL_mboxq_lock);
|
|
||||||
} else if (IsAtomTerm(namet)) {
|
|
||||||
LOCK(GLOBAL_mboxq_lock);
|
|
||||||
while( mboxp && mboxp->name != namet)
|
|
||||||
mboxp = mboxp->next;
|
|
||||||
if (mboxp) {
|
|
||||||
UNLOCK(GLOBAL_mboxq_lock);
|
|
||||||
=======
|
|
||||||
return Yap_unify(ARG1, MkAddressTerm(mutp));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static Int
|
|
||||||
p_destroy_mutex( USES_REGS1 )
|
|
||||||
{
|
|
||||||
Term t1 = Deref(ARG1);
|
|
||||||
SWIMutex *mut;
|
|
||||||
if (IsVarTerm(t1)) {
|
|
||||||
} else if (IsAtomTerm(t1)) {
|
|
||||||
} else {
|
|
||||||
mut = AddressOfTerm(Deref(ARG1));
|
|
||||||
if (pthread_mutex_destroy(&mut->m) < 0)
|
|
||||||
return FALSE;
|
|
||||||
Yap_FreeCodeSpace((void *)mut);
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Int
|
|
||||||
p_lock_mutex( USES_REGS1 )
|
|
||||||
{
|
|
||||||
SWIMutex *mut = MutexOfTerm( ARG1 );
|
|
||||||
|
|
||||||
#if DEBUG_LOCKS
|
|
||||||
MUTEX_LOCK(&mut->m);
|
|
||||||
#else
|
|
||||||
if (MUTEX_LOCK(&mut->m) < 0)
|
|
||||||
return FALSE;
|
|
||||||
#endif
|
|
||||||
mut->owners++;
|
|
||||||
mut->tid_own = worker_id;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Int
|
|
||||||
p_trylock_mutex( USES_REGS1 )
|
|
||||||
{
|
|
||||||
SWIMutex *mut = MutexOfTerm( ARG1 );
|
|
||||||
|
|
||||||
if (MUTEX_TRYLOCK(&mut->m) == EBUSY)
|
|
||||||
return FALSE;
|
|
||||||
mut->owners++;
|
|
||||||
mut->tid_own = worker_id;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Int
|
|
||||||
p_unlock_mutex( USES_REGS1 )
|
|
||||||
{
|
|
||||||
SWIMutex *mut = MutexOfTerm( ARG1 );
|
|
||||||
|
|
||||||
#if DEBUG_LOCKS
|
|
||||||
MUTEX_UNLOCK(&mut->m);
|
|
||||||
#else
|
|
||||||
if (MUTEX_UNLOCK(&mut->m) < 0)
|
|
||||||
return FALSE;
|
|
||||||
#endif
|
|
||||||
mut->owners--;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Int
|
|
||||||
p_with_mutex( USES_REGS1 )
|
|
||||||
{
|
|
||||||
SWIMutex *mut;
|
|
||||||
Term t1 = Deref(ARG1), excep;
|
|
||||||
Int rc = FALSE;
|
|
||||||
Int creeping = Yap_get_signal(YAP_CREEP_SIGNAL);
|
|
||||||
PredEntry *pe;
|
|
||||||
Term tm = CurrentModule;
|
|
||||||
Term tg = Deref(ARG2);
|
|
||||||
|
|
||||||
if (IsVarTerm(t1)) {
|
|
||||||
p_new_mutex( PASS_REGS1 );
|
|
||||||
t1 = Deref(ARG1);
|
|
||||||
}
|
|
||||||
if (IsAtomTerm(t1)) {
|
|
||||||
|
|
||||||
} else {
|
|
||||||
mut = AddressOfTerm(Deref(ARG1));
|
|
||||||
if (FALSE && !p_lock_mutex( PASS_REGS1 )) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tg = Yap_StripModule(tg, &tm);
|
|
||||||
if (IsVarTerm(tg)) {
|
|
||||||
Yap_Error(INSTANTIATION_ERROR, ARG2, "with_mutex/2");
|
|
||||||
goto end;
|
|
||||||
} else if (IsApplTerm(tg)) {
|
|
||||||
register Functor f = FunctorOfTerm(tg);
|
|
||||||
register CELL *pt;
|
|
||||||
size_t i, arity;
|
|
||||||
|
|
||||||
f = FunctorOfTerm(tg);
|
|
||||||
if (IsExtensionFunctor(f)) {
|
|
||||||
Yap_Error(TYPE_ERROR_CALLABLE, tg, "with_mutex/2");
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
arity = ArityOfFunctor(f);
|
|
||||||
if (arity > MaxTemps) {
|
|
||||||
Yap_Error(TYPE_ERROR_CALLABLE, tg, "with_mutex/2");
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
pe = RepPredProp(PredPropByFunc(f, tm));
|
|
||||||
pt = RepAppl(tg)+1;
|
|
||||||
for (i= 0; i < arity; i++ )
|
|
||||||
XREGS[i+1] = pt[i];
|
|
||||||
} else if (IsAtomTerm(tg)) {
|
|
||||||
pe = RepPredProp(PredPropByAtom(AtomOfTerm(tg), tm));
|
|
||||||
} else if (IsPairTerm(tg)) {
|
|
||||||
register CELL *pt;
|
|
||||||
Functor f;
|
|
||||||
|
|
||||||
f = FunctorDot;
|
|
||||||
pe = RepPredProp(PredPropByFunc(f, tm));
|
|
||||||
pt = RepPair(tg);
|
|
||||||
XREGS[1] = pt[0];
|
|
||||||
XREGS[2] = pt[1];
|
|
||||||
} else {
|
|
||||||
Yap_Error(TYPE_ERROR_CALLABLE, tg, "with_mutex/2");
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
if (
|
|
||||||
pe->OpcodeOfPred != FAIL_OPCODE &&
|
|
||||||
Yap_execute_pred(pe, NULL PASS_REGS) ) {
|
|
||||||
rc = TRUE;
|
|
||||||
}
|
|
||||||
end:
|
|
||||||
ARG1 = MkIntegerTerm((Int)mut);
|
|
||||||
excep = Yap_GetException();
|
|
||||||
if (FALSE) p_unlock_mutex( PASS_REGS1 );
|
|
||||||
if (creeping) {
|
|
||||||
Yap_signal( YAP_CREEP_SIGNAL );
|
|
||||||
} else if ( excep != 0) {
|
|
||||||
return Yap_JumpToEnv(excep);
|
|
||||||
}
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static Int
|
|
||||||
p_with_with_mutex( USES_REGS1 )
|
|
||||||
{
|
|
||||||
if (GLOBAL_WithMutex == NULL) {
|
|
||||||
p_new_mutex( PASS_REGS1 );
|
|
||||||
GLOBAL_WithMutex = (SWIMutex*)IntegerOfTerm(Deref(ARG1));
|
|
||||||
} else {
|
|
||||||
ARG1 = MkIntegerTerm((Int)GLOBAL_WithMutex);
|
|
||||||
}
|
|
||||||
return p_lock_mutex( PASS_REGS1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
static Int
|
|
||||||
p_unlock_with_mutex( USES_REGS1 )
|
|
||||||
{
|
|
||||||
ARG1 = MkIntegerTerm((Int)GLOBAL_WithMutex);
|
|
||||||
return p_unlock_mutex( PASS_REGS1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static Int
|
|
||||||
p_mutex_info( USES_REGS1 )
|
|
||||||
{
|
|
||||||
SWIMutex *mut = (SWIMutex*)IntegerOfTerm(Deref(ARG1));
|
|
||||||
|
|
||||||
return Yap_unify(ARG2, MkIntegerTerm(mut->owners)) &&
|
|
||||||
Yap_unify(ARG3, MkIntegerTerm(mut->tid_own));
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Int
|
|
||||||
p_cond_create( USES_REGS1 )
|
|
||||||
{
|
|
||||||
pthread_cond_t* condp;
|
|
||||||
|
|
||||||
condp = (pthread_cond_t *)Yap_AllocCodeSpace(sizeof(pthread_cond_t));
|
|
||||||
if (condp == NULL) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
pthread_cond_init(condp, NULL);
|
|
||||||
return Yap_unify(ARG1, MkIntegerTerm((Int)condp));
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
UInt indx;
|
|
||||||
mbox_t mbox;
|
|
||||||
} counted_mbox;
|
|
||||||
|
|
||||||
static Int
|
static Int
|
||||||
p_mbox_create( USES_REGS1 )
|
p_mbox_create( USES_REGS1 )
|
||||||
{
|
{
|
||||||
@ -1356,28 +1146,6 @@ p_mbox_create( USES_REGS1 )
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Int
|
|
||||||
p_mbox_destroy( USES_REGS1 )
|
|
||||||
{
|
|
||||||
Term namet = Deref(ARG1);
|
|
||||||
mbox_t* mboxp = GLOBAL_named_mboxes, *prevp;
|
|
||||||
|
|
||||||
if (IsVarTerm(namet) )
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
mboxp = (mbox_t *)Yap_AllocCodeSpace(sizeof(mbox_t));
|
|
||||||
if (mboxp == NULL) {
|
|
||||||
UNLOCK(GLOBAL_mboxq_lock);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
// global mbox, for now we'll just insert in list
|
|
||||||
mboxp->next = GLOBAL_named_mboxes;
|
|
||||||
GLOBAL_named_mboxes = mboxp;
|
|
||||||
}
|
|
||||||
bool rc = mboxCreate( namet, mboxp PASS_REGS );
|
|
||||||
UNLOCK(GLOBAL_mboxq_lock);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Int
|
static Int
|
||||||
p_mbox_destroy( USES_REGS1 )
|
p_mbox_destroy( USES_REGS1 )
|
||||||
@ -1408,26 +1176,6 @@ p_mbox_destroy( USES_REGS1 )
|
|||||||
UNLOCK(GLOBAL_mboxq_lock);
|
UNLOCK(GLOBAL_mboxq_lock);
|
||||||
mboxDestroy(mboxp PASS_REGS);
|
mboxDestroy(mboxp PASS_REGS);
|
||||||
Yap_FreeCodeSpace( (char *)mboxp );
|
Yap_FreeCodeSpace( (char *)mboxp );
|
||||||
=======
|
|
||||||
}
|
|
||||||
LOCK(GLOBAL_mboxq_lock);
|
|
||||||
prevp = NULL;
|
|
||||||
while( mboxp && mboxp->name != namet) {
|
|
||||||
prevp = mboxp;
|
|
||||||
mboxp = mboxp->next;
|
|
||||||
}
|
|
||||||
if (!mboxp) {
|
|
||||||
UNLOCK(GLOBAL_mboxq_lock);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
if (mboxp == GLOBAL_named_mboxes) {
|
|
||||||
GLOBAL_named_mboxes = mboxp->next;
|
|
||||||
} else {
|
|
||||||
prevp->next = mboxp->next;
|
|
||||||
}
|
|
||||||
UNLOCK(GLOBAL_mboxq_lock);
|
|
||||||
mboxDestroy(mboxp PASS_REGS);
|
|
||||||
Yap_FreeCodeSpace( (char *)mboxp );
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1520,7 +1268,20 @@ p_mbox_destroy( USES_REGS1 )
|
|||||||
return mboxPeek(mboxp, Deref(ARG2) PASS_REGS);
|
return mboxPeek(mboxp, Deref(ARG2) PASS_REGS);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Int
|
static Int
|
||||||
|
p_cond_create( USES_REGS1 )
|
||||||
|
{
|
||||||
|
pthread_cond_t* condp;
|
||||||
|
|
||||||
|
condp = (pthread_cond_t *)Yap_AllocCodeSpace(sizeof(pthread_cond_t));
|
||||||
|
if (condp == NULL) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
pthread_cond_init(condp, NULL);
|
||||||
|
return Yap_unify(ARG1, MkIntegerTerm((Int)condp));
|
||||||
|
}
|
||||||
|
|
||||||
|
static Int
|
||||||
p_cond_destroy( USES_REGS1 )
|
p_cond_destroy( USES_REGS1 )
|
||||||
{
|
{
|
||||||
pthread_cond_t *condp = (pthread_cond_t *)IntegerOfTerm(Deref(ARG1));
|
pthread_cond_t *condp = (pthread_cond_t *)IntegerOfTerm(Deref(ARG1));
|
||||||
@ -1560,136 +1321,6 @@ p_mbox_destroy( USES_REGS1 )
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static mbox_t*
|
|
||||||
getMbox(Term t)
|
|
||||||
{
|
|
||||||
mbox_t* mboxp;
|
|
||||||
|
|
||||||
if (IsAtomTerm(t=Deref(t))) {
|
|
||||||
Atom at = AtomOfTerm(t);
|
|
||||||
LOCK(GLOBAL_mboxq_lock);
|
|
||||||
if (IsBlob(at)) {
|
|
||||||
mboxp = (mbox_t *)(RepAtom(at)->rep.blob[0].data);
|
|
||||||
} else {
|
|
||||||
mboxp = GLOBAL_named_mboxes;
|
|
||||||
while( mboxp && mboxp->name != t) {
|
|
||||||
mboxp = mboxp->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!mboxp->open)
|
|
||||||
mboxp = NULL;
|
|
||||||
if (mboxp) {
|
|
||||||
pthread_mutex_lock(& mboxp->mutex);
|
|
||||||
}
|
|
||||||
UNLOCK(GLOBAL_mboxq_lock);
|
|
||||||
} else if (IsIntTerm(t)) {
|
|
||||||
int wid = IntOfTerm(t);
|
|
||||||
if (REMOTE(wid) &&
|
|
||||||
(REMOTE_ThreadHandle(wid).in_use || REMOTE_ThreadHandle(wid).zombie))
|
|
||||||
{
|
|
||||||
return &REMOTE_ThreadHandle(wid).mbox_handle;
|
|
||||||
} else {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
if (!mboxp->open)
|
|
||||||
mboxp = NULL;
|
|
||||||
if (mboxp) {
|
|
||||||
pthread_mutex_lock(& mboxp->mutex);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return mboxp;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static Int
|
|
||||||
p_mbox_send( USES_REGS1 )
|
|
||||||
{
|
|
||||||
Term namet = Deref(ARG1);
|
|
||||||
mbox_t* mboxp = getMbox(namet) ;
|
|
||||||
|
|
||||||
if (!mboxp)
|
|
||||||
return FALSE;
|
|
||||||
return mboxSend(mboxp, Deref(ARG2) PASS_REGS);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Int
|
|
||||||
p_mbox_size( USES_REGS1 )
|
|
||||||
{
|
|
||||||
Term namet = Deref(ARG1);
|
|
||||||
mbox_t* mboxp = getMbox(namet) ;
|
|
||||||
|
|
||||||
if (!mboxp)
|
|
||||||
return FALSE;
|
|
||||||
return Yap_unify( ARG2, MkIntTerm(mboxp->nmsgs));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static Int
|
|
||||||
p_mbox_receive( USES_REGS1 )
|
|
||||||
{
|
|
||||||
Term namet = Deref(ARG1);
|
|
||||||
mbox_t* mboxp = getMbox(namet) ;
|
|
||||||
|
|
||||||
if (!mboxp)
|
|
||||||
return FALSE;
|
|
||||||
return mboxReceive(mboxp, Deref(ARG2) PASS_REGS);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static Int
|
|
||||||
p_mbox_peek( USES_REGS1 )
|
|
||||||
{
|
|
||||||
Term namet = Deref(ARG1);
|
|
||||||
mbox_t* mboxp = getMbox(namet) ;
|
|
||||||
|
|
||||||
if (!mboxp)
|
|
||||||
return FALSE;
|
|
||||||
return mboxPeek(mboxp, Deref(ARG2) PASS_REGS);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Int
|
|
||||||
p_cond_destroy( USES_REGS1 )
|
|
||||||
{
|
|
||||||
pthread_cond_t *condp = (pthread_cond_t *)IntegerOfTerm(Deref(ARG1));
|
|
||||||
|
|
||||||
if (pthread_cond_destroy(condp) < 0)
|
|
||||||
return FALSE;
|
|
||||||
Yap_FreeCodeSpace((void *)condp);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Int
|
|
||||||
p_cond_signal( USES_REGS1 )
|
|
||||||
{
|
|
||||||
pthread_cond_t *condp = (pthread_cond_t *)IntegerOfTerm(Deref(ARG1));
|
|
||||||
|
|
||||||
if (pthread_cond_signal(condp) < 0)
|
|
||||||
return FALSE;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Int
|
|
||||||
p_cond_broadcast( USES_REGS1 )
|
|
||||||
{
|
|
||||||
pthread_cond_t *condp = (pthread_cond_t *)IntegerOfTerm(Deref(ARG1));
|
|
||||||
|
|
||||||
if (pthread_cond_broadcast(condp) < 0)
|
|
||||||
return FALSE;
|
|
||||||
else
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Int
|
|
||||||
p_cond_wait( USES_REGS1 )
|
|
||||||
{
|
|
||||||
pthread_cond_t *condp = (pthread_cond_t *)IntegerOfTerm(Deref(ARG1));
|
|
||||||
SWIMutex *mut = (SWIMutex*)IntegerOfTerm(Deref(ARG2));
|
|
||||||
pthread_cond_wait(condp, &mut->m);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Int
|
static Int
|
||||||
p_thread_stacks( USES_REGS1 )
|
p_thread_stacks( USES_REGS1 )
|
||||||
{ /* '$thread_signal'(+P) */
|
{ /* '$thread_signal'(+P) */
|
||||||
|
@ -1333,8 +1333,8 @@ IsTranslationProperty (int flags)
|
|||||||
bool Yap_PutAtomMutex(Atom a, void *ptr);
|
bool Yap_PutAtomMutex(Atom a, void *ptr);
|
||||||
|
|
||||||
/* get mutex prop for atom; */
|
/* get mutex prop for atom; */
|
||||||
static inline MutexEntry *
|
static inline void *
|
||||||
Yap_GetMutexProp(Atom at)
|
Yap_GetMutexFromProp(Atom at)
|
||||||
{
|
{
|
||||||
Prop p0;
|
Prop p0;
|
||||||
AtomEntry *ae = RepAtom(at);
|
AtomEntry *ae = RepAtom(at);
|
||||||
|
@ -64,7 +64,7 @@ static inline int si_callback(void *key, void *data, void *arg)
|
|||||||
/* Judy1 integer sparse set intersection */
|
/* Judy1 integer sparse set intersection */
|
||||||
static inline int j1_callback(void *key, void *data, void *arg)
|
static inline int j1_callback(void *key, void *data, void *arg)
|
||||||
{
|
{
|
||||||
int r;
|
intptr_t r;
|
||||||
Pvoid_t *array = (Pvoid_t *) arg;
|
Pvoid_t *array = (Pvoid_t *) arg;
|
||||||
J1S(r, *array, (int) data);
|
J1S(r, *array, (int) data);
|
||||||
if (r == JERR)
|
if (r == JERR)
|
||||||
|
@ -45,7 +45,7 @@ INFODIR=$(SHAREDIR)/info
|
|||||||
CC=@CC@
|
CC=@CC@
|
||||||
CPP=@CPP@
|
CPP=@CPP@
|
||||||
DEFS=@DEFS@
|
DEFS=@DEFS@
|
||||||
CPPFLAGS=@CPPFLAGS@ -I../.. -I$(srcdir)/../../H
|
CPPFLAGS=@CPPFLAGS@ -I../.. -I$(srcdir)/../../H -I$(srcdir)/../../include
|
||||||
CFLAGS= @SHLIB_CFLAGS@ $(DEFS) $(CPPFLAGS)
|
CFLAGS= @SHLIB_CFLAGS@ $(DEFS) $(CPPFLAGS)
|
||||||
LIBS=@LIBS@
|
LIBS=@LIBS@
|
||||||
LDFLAGS=@LDFLAGS@
|
LDFLAGS=@LDFLAGS@
|
||||||
@ -106,7 +106,7 @@ mpe.o: $(srcdir)/mpe.c
|
|||||||
|
|
||||||
depend: $(HEADERS) $(C_SOURCES)
|
depend: $(HEADERS) $(C_SOURCES)
|
||||||
-@if test "$(GCC)" = yes; then\
|
-@if test "$(GCC)" = yes; then\
|
||||||
$(CC) -MM $(CFLAGS) -I$(srcdir)/include $(C_SOURCES) > .depend;\
|
$(CC) -MM $(CFLAGS) -I$(srcdir)/include -i ../.. $(C_SOURCES) > .depend;\
|
||||||
else\
|
else\
|
||||||
makedepend -f - -- $(CFLAGS) -I$(srcdir)/include -- $(C_SOURCES) |\
|
makedepend -f - -- $(CFLAGS) -I$(srcdir)/include -- $(C_SOURCES) |\
|
||||||
sed 's|.*/\([^:]*\):|\1:|' > .depend ;\
|
sed 's|.*/\([^:]*\):|\1:|' > .depend ;\
|
||||||
|
10
os/pl-os.c
10
os/pl-os.c
@ -2384,6 +2384,7 @@ argument to wait()
|
|||||||
|
|
||||||
#endif /*HAVE_SYS_WAIT_H*/
|
#endif /*HAVE_SYS_WAIT_H*/
|
||||||
|
|
||||||
|
typedef sighandler_t sigf_t;
|
||||||
|
|
||||||
int
|
int
|
||||||
System(char *cmd)
|
System(char *cmd)
|
||||||
@ -2391,9 +2392,8 @@ System(char *cmd)
|
|||||||
int pid;
|
int pid;
|
||||||
char *shell = "/bin/sh";
|
char *shell = "/bin/sh";
|
||||||
int rval;
|
int rval;
|
||||||
void (*old_int)();
|
sigf_t old_int, old_stop;
|
||||||
void (*old_stop)();
|
|
||||||
|
|
||||||
if ( (pid = fork()) == -1 )
|
if ( (pid = fork()) == -1 )
|
||||||
{ return PL_error("shell", 2, OsError(), ERR_SYSCALL, "fork");
|
{ return PL_error("shell", 2, OsError(), ERR_SYSCALL, "fork");
|
||||||
} else if ( pid == 0 ) /* The child */
|
} else if ( pid == 0 ) /* The child */
|
||||||
@ -2407,9 +2407,9 @@ System(char *cmd)
|
|||||||
{ wait_t status; /* the parent */
|
{ wait_t status; /* the parent */
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
old_int = signal(SIGINT, SIG_IGN);
|
old_int = (sigf_t)signal(SIGINT, SIG_IGN);
|
||||||
#ifdef SIGTSTP
|
#ifdef SIGTSTP
|
||||||
old_stop = signal(SIGTSTP, SIG_DFL);
|
old_stop = (sigf_t)signal(SIGTSTP, SIG_DFL);
|
||||||
#endif /* SIGTSTP */
|
#endif /* SIGTSTP */
|
||||||
|
|
||||||
for(;;)
|
for(;;)
|
||||||
|
@ -140,7 +140,7 @@ static int S__seterror(IOSTREAM *s);
|
|||||||
#ifdef O_PLMT
|
#ifdef O_PLMT
|
||||||
#define SLOCK(s) if ( s->mutex ) recursiveMutexLock(s->mutex)
|
#define SLOCK(s) if ( s->mutex ) recursiveMutexLock(s->mutex)
|
||||||
#define SUNLOCK(s) if ( s->mutex ) recursiveMutexUnlock(s->mutex)
|
#define SUNLOCK(s) if ( s->mutex ) recursiveMutexUnlock(s->mutex)
|
||||||
inline int
|
static inline int
|
||||||
STRYLOCK(IOSTREAM *s)
|
STRYLOCK(IOSTREAM *s)
|
||||||
{ if ( s->mutex &&
|
{ if ( s->mutex &&
|
||||||
recursiveMutexTryLock(s->mutex) == EBUSY )
|
recursiveMutexTryLock(s->mutex) == EBUSY )
|
||||||
|
@ -1562,4 +1562,3 @@ thread_local(X) :-
|
|||||||
/**
|
/**
|
||||||
@}
|
@}
|
||||||
*/
|
*/
|
||||||
>
|
|
||||||
|
Reference in New Issue
Block a user