summaryrefslogtreecommitdiff
path: root/erts/emulator/beam/erl_drv_thread.c
diff options
context:
space:
mode:
authorSverker Eriksson <sverker@erlang.org>2019-12-18 23:48:24 +0100
committerSverker Eriksson <sverker@erlang.org>2020-01-24 19:47:21 +0100
commitcf604c5ad135252fe9109eb429302d421ba9952b (patch)
tree5dc1f086eac676a3a8b228681ac59543cb1f1632 /erts/emulator/beam/erl_drv_thread.c
parentb41296b8c1014b17135fd6b64766fe43968dc04a (diff)
downloaderlang-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.c16
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