|
|
@ -10,14 +10,14 @@ ERL_NIF_TERM atomTrue; |
|
|
|
ERL_NIF_TERM atomFalse; |
|
|
|
ERL_NIF_TERM atomUndefined; |
|
|
|
|
|
|
|
int nifLoad(ErlNifEnv *env, void **priv_data, ERL_NIF_TERM){ |
|
|
|
int nifLoad(ErlNifEnv *env, void **priv_data, ERL_NIF_TERM load_info){ |
|
|
|
atomTrue = enif_make_atom(env, "true"); |
|
|
|
atomFalse = enif_make_atom(env, "false"); |
|
|
|
atomUndefined = enif_make_atom(env, "undefined"); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
bool lockOne(ErlNifEnv *env, ErlNifPid *ThePid, int KeyIx, uint64_t Val){ |
|
|
|
inline bool lockOne(ErlNifEnv *env, ErlNifPid *ThePid, int KeyIx, uint64_t Val){ |
|
|
|
uint64_t Expected = 0; |
|
|
|
if (LockSlot[KeyIx].compare_exchange_strong(Expected, Val)){ |
|
|
|
return true; |
|
|
@ -31,7 +31,7 @@ bool lockOne(ErlNifEnv *env, ErlNifPid *ThePid, int KeyIx, uint64_t Val){ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
ERL_NIF_TERM tryLock(ErlNifEnv *env, int, const ERL_NIF_TERM argv[]){ |
|
|
|
ERL_NIF_TERM tryLock(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]){ |
|
|
|
int KeyIx; |
|
|
|
enif_get_int(env, argv[0], &KeyIx); |
|
|
|
ErlNifPid ThePid; |
|
|
@ -41,7 +41,7 @@ ERL_NIF_TERM tryLock(ErlNifEnv *env, int, const ERL_NIF_TERM argv[]){ |
|
|
|
return lockOne(env, &ThePid, KeyIx, Val) ? atomTrue : atomFalse; |
|
|
|
} |
|
|
|
|
|
|
|
ERL_NIF_TERM tryLocks(ErlNifEnv *env, int, const ERL_NIF_TERM argv[]){ |
|
|
|
ERL_NIF_TERM tryLocks(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]){ |
|
|
|
ERL_NIF_TERM allList = argv[0]; |
|
|
|
ERL_NIF_TERM head; |
|
|
|
ErlNifPid ThePid; |
|
|
@ -67,7 +67,7 @@ ERL_NIF_TERM tryLocks(ErlNifEnv *env, int, const ERL_NIF_TERM argv[]){ |
|
|
|
return atomTrue; |
|
|
|
} |
|
|
|
|
|
|
|
ERL_NIF_TERM releaseLock(ErlNifEnv *env, int, const ERL_NIF_TERM argv[]){ |
|
|
|
ERL_NIF_TERM releaseLock(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]){ |
|
|
|
int KeyIx; |
|
|
|
enif_get_int(env, argv[0], &KeyIx); |
|
|
|
ErlNifPid ThePid; |
|
|
@ -77,7 +77,7 @@ ERL_NIF_TERM releaseLock(ErlNifEnv *env, int, const ERL_NIF_TERM argv[]){ |
|
|
|
return LockSlot[KeyIx].compare_exchange_strong(Expected, 0) ? atomTrue : atomFalse; |
|
|
|
} |
|
|
|
|
|
|
|
ERL_NIF_TERM releaseLocks(ErlNifEnv *env, int, const ERL_NIF_TERM argv[]){ |
|
|
|
ERL_NIF_TERM releaseLocks(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]){ |
|
|
|
ERL_NIF_TERM allList = argv[0]; |
|
|
|
ERL_NIF_TERM head; |
|
|
|
ErlNifPid ThePid; |
|
|
@ -97,7 +97,7 @@ ERL_NIF_TERM releaseLocks(ErlNifEnv *env, int, const ERL_NIF_TERM argv[]){ |
|
|
|
return isAllOk > 0 ? atomTrue : atomFalse; |
|
|
|
} |
|
|
|
|
|
|
|
ERL_NIF_TERM getLockPid(ErlNifEnv *env, int, const ERL_NIF_TERM argv[]){ |
|
|
|
ERL_NIF_TERM getLockPid(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]){ |
|
|
|
int KeyIx; |
|
|
|
enif_get_int(env, argv[0], &KeyIx); |
|
|
|
ErlNifPid ThePid; |
|
|
|