multiprocessing: add predicate "mp:holding-lock-p"

This predicate returns T if lock is hold by the process and NIL if it is
hold by another process or is released.
This commit is contained in:
Daniel Kochmański 2016-10-05 13:42:45 +02:00
parent 69a28761d9
commit 0badafcd35
4 changed files with 13 additions and 0 deletions

View file

@ -1550,6 +1550,7 @@ cl_symbols[] = {
{MP_ "MAKE-LOCK", MP_ORDINARY, IF_MP(mp_make_lock), -1, OBJNULL},
{KEY_ "RECURSIVE", KEYWORD, NULL, -1, OBJNULL},
{MP_ "RECURSIVE-LOCK-P", MP_ORDINARY, IF_MP(mp_recursive_lock_p), 1, OBJNULL},
{MP_ "HOLDING-LOCK-P", MP_ORDINARY, IF_MP(mp_holding_lock_p), 1, OBJNULL},
{MP_ "LOCK-NAME", MP_ORDINARY, IF_MP(mp_lock_name), 1, OBJNULL},
{MP_ "LOCK-OWNER", MP_ORDINARY, IF_MP(mp_lock_owner), 1, OBJNULL},
{MP_ "LOCK-COUNT", MP_ORDINARY, IF_MP(mp_lock_count), 1, OBJNULL},

View file

@ -1550,6 +1550,7 @@ cl_symbols[] = {
{MP_ "MAKE-LOCK",IF_MP("mp_make_lock")},
{KEY_ "RECURSIVE",NULL},
{MP_ "RECURSIVE-LOCK-P",IF_MP("mp_recursive_lock_p")},
{MP_ "HOLDING-LOCK-P",IF_MP("mp_holding_lock_p")},
{MP_ "LOCK-NAME",IF_MP("mp_lock_name")},
{MP_ "LOCK-OWNER",IF_MP("mp_lock_owner")},
{MP_ "LOCK-COUNT",IF_MP("mp_lock_count")},

View file

@ -67,6 +67,16 @@ mp_recursive_lock_p(cl_object lock)
ecl_return1(env, lock->lock.recursive? ECL_T : ECL_NIL);
}
cl_object
mp_holding_lock_p(cl_object lock)
{
cl_env_ptr env = ecl_process_env();
cl_object own_process = env->own_process;
unlikely_if (ecl_t_of(lock) != t_lock)
FEerror_not_a_lock(lock);
ecl_return1(env, (lock->lock.owner == own_process) ? ECL_T : ECL_NIL);
}
cl_object
mp_lock_name(cl_object lock)
{

View file

@ -1776,6 +1776,7 @@ extern ECL_API cl_index ecl_atomic_index_incf(cl_index *slot);
extern ECL_API cl_object mp_make_lock _ECL_ARGS((cl_narg narg, ...));
extern ECL_API cl_object mp_recursive_lock_p(cl_object lock);
extern ECL_API cl_object mp_holding_lock_p(cl_object lock);
extern ECL_API cl_object mp_lock_name(cl_object lock);
extern ECL_API cl_object mp_lock_owner(cl_object lock);
extern ECL_API cl_object mp_lock_count(cl_object lock);