diff options
author | Sverker Eriksson <sverker@erlang.org> | 2019-12-18 23:48:24 +0100 |
---|---|---|
committer | Sverker Eriksson <sverker@erlang.org> | 2020-01-24 19:47:21 +0100 |
commit | cf604c5ad135252fe9109eb429302d421ba9952b (patch) | |
tree | 5dc1f086eac676a3a8b228681ac59543cb1f1632 /erts/emulator/beam/erl_drv_thread.c | |
parent | b41296b8c1014b17135fd6b64766fe43968dc04a (diff) | |
download | erlang-cf604c5ad135252fe9109eb429302d421ba9952b.tar.gz |
erts: Add new dynamic lock checker
Primary aimed to provide lock order checking for NIFs and drivers
where there are no predefined static locking order.
Diffstat (limited to 'erts/emulator/beam/erl_drv_thread.c')
-rw-r--r-- | erts/emulator/beam/erl_drv_thread.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/erts/emulator/beam/erl_drv_thread.c b/erts/emulator/beam/erl_drv_thread.c index c5dbc87dee..d90b8b5e07 100644 --- a/erts/emulator/beam/erl_drv_thread.c +++ b/erts/emulator/beam/erl_drv_thread.c @@ -23,6 +23,7 @@ #endif #include "global.h" +#include "erl_dyn_lock_check.h" #include <string.h> #if defined(__APPLE__) && defined(__MACH__) && !defined(__DARWIN__) @@ -57,6 +58,9 @@ struct ErlDrvMutex_ { erts_lcnt_ref_t lcnt; #endif char *name; +#ifdef ERTS_DYN_LOCK_CHECK + erts_dlc_t dlc; +#endif }; struct ErlDrvCond_ { @@ -163,6 +167,9 @@ erl_drv_mutex_create(char *name) } else { dmtx->name = no_name; } +#ifdef ERTS_DYN_LOCK_CHECK + erts_dlc_create_lock(&dmtx->dlc, name); +#endif #ifdef ERTS_ENABLE_LOCK_COUNT erts_lcnt_init_ref_x(&dmtx->lcnt, dmtx->name, NIL, ERTS_LOCK_TYPE_MUTEX | ERTS_LOCK_FLAGS_CATEGORY_IO); @@ -198,6 +205,9 @@ erl_drv_mutex_trylock(ErlDrvMutex *dmtx) if (!dmtx) fatal_error(EINVAL, "erl_drv_mutex_trylock()"); res = ethr_mutex_trylock(&dmtx->mtx); +#ifdef ERTS_DYN_LOCK_CHECK + erts_dlc_trylock(&dmtx->dlc, res != EBUSY); +#endif #ifdef ERTS_ENABLE_LOCK_COUNT erts_lcnt_trylock(&dmtx->lcnt, res); #endif @@ -209,6 +219,9 @@ erl_drv_mutex_lock(ErlDrvMutex *dmtx) { if (!dmtx) fatal_error(EINVAL, "erl_drv_mutex_lock()"); +#ifdef ERTS_DYN_LOCK_CHECK + erts_dlc_lock(&dmtx->dlc); +#endif #ifdef ERTS_ENABLE_LOCK_COUNT erts_lcnt_lock(&dmtx->lcnt); #endif @@ -223,6 +236,9 @@ erl_drv_mutex_unlock(ErlDrvMutex *dmtx) { if (!dmtx) fatal_error(EINVAL, "erl_drv_mutex_unlock()"); +#ifdef ERTS_DYN_LOCK_CHECK + erts_dlc_unlock(&dmtx->dlc); +#endif #ifdef ERTS_ENABLE_LOCK_COUNT erts_lcnt_unlock(&dmtx->lcnt); #endif |