From f4661e4e1d234fdbcd37bbc4a8a9bfdf2cfaa586 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?John=20H=C3=B6gberg?= <john@erlang.org>
Date: Fri, 7 Jul 2017 16:40:30 +0200
Subject: Add a proper type for lock options

---
 erts/emulator/beam/erl_drv_thread.c | 12 +++++-----
 erts/emulator/beam/erl_lock_count.h | 48 ++++++++++++++++++-------------------
 erts/emulator/beam/erl_lock_flags.c | 13 ++++++++++
 erts/emulator/beam/erl_lock_flags.h | 10 +++++---
 erts/emulator/beam/erl_threads.h    | 20 ++++++++--------
 5 files changed, 60 insertions(+), 43 deletions(-)

diff --git a/erts/emulator/beam/erl_drv_thread.c b/erts/emulator/beam/erl_drv_thread.c
index 49bbab55a8..742c428f2a 100644
--- a/erts/emulator/beam/erl_drv_thread.c
+++ b/erts/emulator/beam/erl_drv_thread.c
@@ -414,7 +414,7 @@ erl_drv_rwlock_tryrlock(ErlDrvRWLock *drwlck)
 	fatal_error(EINVAL, "erl_drv_rwlock_tryrlock()");
     res = ethr_rwmutex_tryrlock(&drwlck->rwmtx);
 #ifdef ERTS_ENABLE_LOCK_COUNT
-    erts_lcnt_trylock_opt(&drwlck->lcnt, res, ERTS_LOCK_OPTION_READ);
+    erts_lcnt_trylock_opt(&drwlck->lcnt, res, ERTS_LOCK_OPTIONS_READ);
 #endif
     return res;
 #else
@@ -429,7 +429,7 @@ erl_drv_rwlock_rlock(ErlDrvRWLock *drwlck)
     if (!drwlck)
 	fatal_error(EINVAL, "erl_drv_rwlock_rlock()");
 #ifdef ERTS_ENABLE_LOCK_COUNT
-    erts_lcnt_lock_opt(&drwlck->lcnt, ERTS_LOCK_OPTION_READ);
+    erts_lcnt_lock_opt(&drwlck->lcnt, ERTS_LOCK_OPTIONS_READ);
 #endif
     ethr_rwmutex_rlock(&drwlck->rwmtx);
 #ifdef ERTS_ENABLE_LOCK_COUNT
@@ -445,7 +445,7 @@ erl_drv_rwlock_runlock(ErlDrvRWLock *drwlck)
     if (!drwlck)
 	fatal_error(EINVAL, "erl_drv_rwlock_runlock()");
 #ifdef ERTS_ENABLE_LOCK_COUNT
-    erts_lcnt_unlock_opt(&drwlck->lcnt, ERTS_LOCK_OPTION_READ);
+    erts_lcnt_unlock_opt(&drwlck->lcnt, ERTS_LOCK_OPTIONS_READ);
 #endif
     ethr_rwmutex_runlock(&drwlck->rwmtx);
 #endif
@@ -460,7 +460,7 @@ erl_drv_rwlock_tryrwlock(ErlDrvRWLock *drwlck)
 	fatal_error(EINVAL, "erl_drv_rwlock_tryrwlock()");
     res = ethr_rwmutex_tryrwlock(&drwlck->rwmtx);
 #ifdef ERTS_ENABLE_LOCK_COUNT
-    erts_lcnt_trylock_opt(&drwlck->lcnt, res, ERTS_LOCK_OPTION_RDWR);
+    erts_lcnt_trylock_opt(&drwlck->lcnt, res, ERTS_LOCK_OPTIONS_RDWR);
 #endif
     return res;
 #else
@@ -475,7 +475,7 @@ erl_drv_rwlock_rwlock(ErlDrvRWLock *drwlck)
     if (!drwlck)
 	fatal_error(EINVAL, "erl_drv_rwlock_rwlock()");
 #ifdef ERTS_ENABLE_LOCK_COUNT
-    erts_lcnt_lock_opt(&drwlck->lcnt, ERTS_LOCK_OPTION_RDWR);
+    erts_lcnt_lock_opt(&drwlck->lcnt, ERTS_LOCK_OPTIONS_RDWR);
 #endif
     ethr_rwmutex_rwlock(&drwlck->rwmtx);
 #ifdef ERTS_ENABLE_LOCK_COUNT
@@ -491,7 +491,7 @@ erl_drv_rwlock_rwunlock(ErlDrvRWLock *drwlck)
     if (!drwlck)
 	fatal_error(EINVAL, "erl_drv_rwlock_rwunlock()");
 #ifdef ERTS_ENABLE_LOCK_COUNT
-    erts_lcnt_unlock_opt(&drwlck->lcnt, ERTS_LOCK_OPTION_RDWR);
+    erts_lcnt_unlock_opt(&drwlck->lcnt, ERTS_LOCK_OPTIONS_RDWR);
 #endif
     ethr_rwmutex_rwunlock(&drwlck->rwmtx);
 #endif
diff --git a/erts/emulator/beam/erl_lock_count.h b/erts/emulator/beam/erl_lock_count.h
index 3181dbcad4..89d95a73cf 100644
--- a/erts/emulator/beam/erl_lock_count.h
+++ b/erts/emulator/beam/erl_lock_count.h
@@ -172,7 +172,7 @@ void erts_lcnt_lock(erts_lcnt_ref_t *ref);
 /** @copydoc erts_lcnt_lock
  * @param option Notes whether the lock is a read or write lock. */
 ERTS_GLB_FORCE_INLINE
-void erts_lcnt_lock_opt(erts_lcnt_ref_t *ref, Uint16 option);
+void erts_lcnt_lock_opt(erts_lcnt_ref_t *ref, erts_lock_options_t option);
 
 /** @brief Records that a lock has been acquired. */
 ERTS_GLB_FORCE_INLINE
@@ -191,7 +191,7 @@ void erts_lcnt_unlock(erts_lcnt_ref_t *ref);
 /** @copydoc erts_lcnt_unlock_opt
  * @param option Whether the lock is a read or write lock. */
 ERTS_GLB_FORCE_INLINE
-void erts_lcnt_unlock_opt(erts_lcnt_ref_t *ref, Uint16 option);
+void erts_lcnt_unlock_opt(erts_lcnt_ref_t *ref, erts_lock_options_t option);
 
 /** @brief Rectifies the case where a lock wasn't actually a lock operation.
  *
@@ -207,7 +207,7 @@ void erts_lcnt_trylock(erts_lcnt_ref_t *ref, int result);
 /** @copydoc erts_lcnt_trylock
  * @param option Whether the lock is a read or write lock. */
 ERTS_GLB_FORCE_INLINE
-void erts_lcnt_trylock_opt(erts_lcnt_ref_t *ref, int result, Uint16 option);
+void erts_lcnt_trylock_opt(erts_lcnt_ref_t *ref, int result, erts_lock_options_t option);
 
 /* Indexed variants of the standard lock operations, for use when a single
  * reference contains many counters (eg. process locks).
@@ -220,7 +220,7 @@ void erts_lcnt_trylock_opt(erts_lcnt_ref_t *ref, int result, Uint16 option);
 ERTS_GLB_INLINE
 void erts_lcnt_lock_idx(erts_lcnt_lock_info_carrier_t *carrier, int index);
 ERTS_GLB_INLINE
-void erts_lcnt_lock_opt_idx(erts_lcnt_lock_info_carrier_t *carrier, int index, Uint16 option);
+void erts_lcnt_lock_opt_idx(erts_lcnt_lock_info_carrier_t *carrier, int index, erts_lock_options_t option);
 
 ERTS_GLB_INLINE
 void erts_lcnt_lock_post_idx(erts_lcnt_lock_info_carrier_t *carrier, int index);
@@ -233,12 +233,12 @@ void erts_lcnt_lock_unacquire_idx(erts_lcnt_lock_info_carrier_t *carrier, int in
 ERTS_GLB_INLINE
 void erts_lcnt_unlock_idx(erts_lcnt_lock_info_carrier_t *carrier, int index);
 ERTS_GLB_INLINE
-void erts_lcnt_unlock_opt_idx(erts_lcnt_lock_info_carrier_t *carrier, int index, Uint16 option);
+void erts_lcnt_unlock_opt_idx(erts_lcnt_lock_info_carrier_t *carrier, int index, erts_lock_options_t option);
 
 ERTS_GLB_INLINE
 void erts_lcnt_trylock_idx(erts_lcnt_lock_info_carrier_t *carrier, int index, int result);
 ERTS_GLB_INLINE
-void erts_lcnt_trylock_opt_idx(erts_lcnt_lock_info_carrier_t *carrier, int index, int result, Uint16 option);
+void erts_lcnt_trylock_opt_idx(erts_lcnt_lock_info_carrier_t *carrier, int index, int result, erts_lock_options_t option);
 
 /* -- Reference operations ------------------------------------------------- */
 
@@ -646,7 +646,7 @@ void erts_lcnt_lock(erts_lcnt_ref_t *ref) {
 }
 
 ERTS_GLB_FORCE_INLINE
-void erts_lcnt_lock_opt(erts_lcnt_ref_t *ref, Uint16 option) {
+void erts_lcnt_lock_opt(erts_lcnt_ref_t *ref, erts_lock_options_t option) {
     erts_lcnt_lock_info_carrier_t *carrier;
     int handle;
 
@@ -706,7 +706,7 @@ void erts_lcnt_unlock(erts_lcnt_ref_t *ref) {
 }
 
 ERTS_GLB_FORCE_INLINE
-void erts_lcnt_unlock_opt(erts_lcnt_ref_t *ref, Uint16 option) {
+void erts_lcnt_unlock_opt(erts_lcnt_ref_t *ref, erts_lock_options_t option) {
     erts_lcnt_lock_info_carrier_t *carrier;
     int handle;
 
@@ -730,7 +730,7 @@ void erts_lcnt_trylock(erts_lcnt_ref_t *ref, int result) {
 }
 
 ERTS_GLB_FORCE_INLINE
-void erts_lcnt_trylock_opt(erts_lcnt_ref_t *ref, int result, Uint16 option) {
+void erts_lcnt_trylock_opt(erts_lcnt_ref_t *ref, int result, erts_lock_options_t option) {
     erts_lcnt_lock_info_carrier_t *carrier;
     int handle;
 
@@ -743,20 +743,20 @@ void erts_lcnt_trylock_opt(erts_lcnt_ref_t *ref, int result, Uint16 option) {
 
 ERTS_GLB_INLINE
 void erts_lcnt_lock_idx(erts_lcnt_lock_info_carrier_t *carrier, int index) {
-    erts_lcnt_lock_opt_idx(carrier, index, ERTS_LOCK_OPTION_WRITE);
+    erts_lcnt_lock_opt_idx(carrier, index, ERTS_LOCK_OPTIONS_WRITE);
 }
 
 ERTS_GLB_INLINE
-void erts_lcnt_lock_opt_idx(erts_lcnt_lock_info_carrier_t *carrier, int index, Uint16 option) {
+void erts_lcnt_lock_opt_idx(erts_lcnt_lock_info_carrier_t *carrier, int index, erts_lock_options_t option) {
     erts_lcnt_lock_info_t *info = &carrier->entries[index];
 
     lcnt_thread_data_t__ *eltd = lcnt_get_thread_data__();
 
     ASSERT(index < carrier->entry_count);
 
-    ASSERT((option & ERTS_LOCK_OPTION_READ) || (option & ERTS_LOCK_OPTION_WRITE));
+    ASSERT((option & ERTS_LOCK_OPTIONS_READ) || (option & ERTS_LOCK_OPTIONS_WRITE));
 
-    if(option & ERTS_LOCK_OPTION_WRITE) {
+    if(option & ERTS_LOCK_OPTIONS_WRITE) {
         ethr_sint_t w_state, r_state;
 
         w_state = ethr_atomic_inc_read(&info->w_state) - 1;
@@ -771,7 +771,7 @@ void erts_lcnt_lock_opt_idx(erts_lcnt_lock_info_carrier_t *carrier, int index, U
         eltd->lock_in_conflict = (w_state > 0);
     }
 
-    if(option & ERTS_LOCK_OPTION_READ) {
+    if(option & ERTS_LOCK_OPTIONS_READ) {
         ASSERT(info->flags & ERTS_LOCK_FLAGS_PROPERTY_READ_WRITE);
         ethr_atomic_inc(&info->r_state);
     }
@@ -825,22 +825,22 @@ ERTS_GLB_INLINE
 void erts_lcnt_unlock_idx(erts_lcnt_lock_info_carrier_t *carrier, int index) {
     ASSERT(index < carrier->entry_count);
 
-    erts_lcnt_unlock_opt_idx(carrier, index, ERTS_LOCK_OPTION_WRITE);
+    erts_lcnt_unlock_opt_idx(carrier, index, ERTS_LOCK_OPTIONS_WRITE);
 }
 
 ERTS_GLB_INLINE
-void erts_lcnt_unlock_opt_idx(erts_lcnt_lock_info_carrier_t *carrier, int index, Uint16 option) {
+void erts_lcnt_unlock_opt_idx(erts_lcnt_lock_info_carrier_t *carrier, int index, erts_lock_options_t option) {
     erts_lcnt_lock_info_t *info = &carrier->entries[index];
 
     ASSERT(index < carrier->entry_count);
 
-    ASSERT((option & ERTS_LOCK_OPTION_READ) || (option & ERTS_LOCK_OPTION_WRITE));
+    ASSERT((option & ERTS_LOCK_OPTIONS_READ) || (option & ERTS_LOCK_OPTIONS_WRITE));
 
-    if(option & ERTS_LOCK_OPTION_WRITE) {
+    if(option & ERTS_LOCK_OPTIONS_WRITE) {
         lcnt_dec_lock_state__(&info->w_state);
     }
 
-    if(option & ERTS_LOCK_OPTION_READ) {
+    if(option & ERTS_LOCK_OPTIONS_READ) {
         ASSERT(info->flags & ERTS_LOCK_FLAGS_PROPERTY_READ_WRITE);
         lcnt_dec_lock_state__(&info->r_state);
     }
@@ -859,23 +859,23 @@ ERTS_GLB_INLINE
 void erts_lcnt_trylock_idx(erts_lcnt_lock_info_carrier_t *carrier, int index, int result) {
     ASSERT(index < carrier->entry_count);
 
-    erts_lcnt_trylock_opt_idx(carrier, index, result, ERTS_LOCK_OPTION_WRITE);
+    erts_lcnt_trylock_opt_idx(carrier, index, result, ERTS_LOCK_OPTIONS_WRITE);
 }
 
 ERTS_GLB_INLINE
-void erts_lcnt_trylock_opt_idx(erts_lcnt_lock_info_carrier_t *carrier, int index, int result, Uint16 option) {
+void erts_lcnt_trylock_opt_idx(erts_lcnt_lock_info_carrier_t *carrier, int index, int result, erts_lock_options_t option) {
     erts_lcnt_lock_info_t *info = &carrier->entries[index];
 
     ASSERT(index < carrier->entry_count);
 
-    ASSERT((option & ERTS_LOCK_OPTION_READ) || (option & ERTS_LOCK_OPTION_WRITE));
+    ASSERT((option & ERTS_LOCK_OPTIONS_READ) || (option & ERTS_LOCK_OPTIONS_WRITE));
 
     if(result != EBUSY) {
-        if(option & ERTS_LOCK_OPTION_WRITE) {
+        if(option & ERTS_LOCK_OPTIONS_WRITE) {
             ethr_atomic_inc(&info->w_state);
         }
 
-        if(option & ERTS_LOCK_OPTION_READ) {
+        if(option & ERTS_LOCK_OPTIONS_READ) {
             ASSERT(info->flags & ERTS_LOCK_FLAGS_PROPERTY_READ_WRITE);
             ethr_atomic_inc(&info->r_state);
         }
diff --git a/erts/emulator/beam/erl_lock_flags.c b/erts/emulator/beam/erl_lock_flags.c
index ba6a7217f2..e0a0e95c09 100644
--- a/erts/emulator/beam/erl_lock_flags.c
+++ b/erts/emulator/beam/erl_lock_flags.c
@@ -44,3 +44,16 @@ const char *erts_lock_flags_get_type_name(erts_lock_flags_t flags) {
             return "garbage";
     }
 }
+
+const char *erts_lock_options_get_short_desc(erts_lock_options_t options) {
+    switch(options) {
+        case ERTS_LOCK_OPTIONS_RDWR:
+            return "rw";
+        case ERTS_LOCK_OPTIONS_READ:
+            return "r";
+        case ERTS_LOCK_OPTIONS_WRITE:
+            return "w";
+        default:
+            return "none";
+    }
+}
diff --git a/erts/emulator/beam/erl_lock_flags.h b/erts/emulator/beam/erl_lock_flags.h
index b66c160af5..d711f69456 100644
--- a/erts/emulator/beam/erl_lock_flags.h
+++ b/erts/emulator/beam/erl_lock_flags.h
@@ -21,10 +21,10 @@
 #ifndef ERTS_LOCK_FLAGS_H__
 #define ERTS_LOCK_FLAGS_H__
 
-#define ERTS_LOCK_OPTION_READ  (1 << 1)
-#define ERTS_LOCK_OPTION_WRITE (1 << 2)
+#define ERTS_LOCK_OPTIONS_READ  (1 << 1)
+#define ERTS_LOCK_OPTIONS_WRITE (1 << 2)
 
-#define ERTS_LOCK_OPTION_RDWR (ERTS_LOCK_OPTION_READ | ERTS_LOCK_OPTION_WRITE)
+#define ERTS_LOCK_OPTIONS_RDWR (ERTS_LOCK_OPTIONS_READ | ERTS_LOCK_OPTIONS_WRITE)
 
 /* Property/category are bitfields to simplify their use in masks. */
 #define ERTS_LOCK_FLAGS_MASK_CATEGORY (0xFFC0)
@@ -67,8 +67,12 @@
 /* -- -- */
 
 typedef unsigned short erts_lock_flags_t;
+typedef unsigned short erts_lock_options_t;
 
 /* @brief Gets the type name of the lock, honoring the RW flag if supplied. */
 const char *erts_lock_flags_get_type_name(erts_lock_flags_t flags);
 
+/* @brief Gets a short-form description of the given lock options. (rw/r/w) */
+const char *erts_lock_options_get_short_desc(erts_lock_options_t options);
+
 #endif /* ERTS_LOCK_FLAGS_H__ */
diff --git a/erts/emulator/beam/erl_threads.h b/erts/emulator/beam/erl_threads.h
index 3fdf29d678..6e5a8210cb 100644
--- a/erts/emulator/beam/erl_threads.h
+++ b/erts/emulator/beam/erl_threads.h
@@ -2505,7 +2505,7 @@ erts_rwmtx_tryrlock(erts_rwmtx_t *rwmtx)
 #endif
 #endif
 #ifdef ERTS_ENABLE_LOCK_COUNT
-    erts_lcnt_trylock_opt(&rwmtx->lcnt, res, ERTS_LOCK_OPTION_READ);
+    erts_lcnt_trylock_opt(&rwmtx->lcnt, res, ERTS_LOCK_OPTIONS_READ);
 #endif
     
     return res;
@@ -2530,7 +2530,7 @@ erts_rwmtx_rlock(erts_rwmtx_t *rwmtx)
 #endif
 #endif
 #ifdef ERTS_ENABLE_LOCK_COUNT
-    erts_lcnt_lock_opt(&rwmtx->lcnt, ERTS_LOCK_OPTION_READ);
+    erts_lcnt_lock_opt(&rwmtx->lcnt, ERTS_LOCK_OPTIONS_READ);
 #endif
     ethr_rwmutex_rlock(&rwmtx->rwmtx);
 #ifdef ERTS_ENABLE_LOCK_COUNT
@@ -2547,7 +2547,7 @@ erts_rwmtx_runlock(erts_rwmtx_t *rwmtx)
     erts_lc_unlock_flg(&rwmtx->lc, ERTS_LC_FLG_LO_READ);
 #endif
 #ifdef ERTS_ENABLE_LOCK_COUNT
-    erts_lcnt_unlock_opt(&rwmtx->lcnt, ERTS_LOCK_OPTION_READ);
+    erts_lcnt_unlock_opt(&rwmtx->lcnt, ERTS_LOCK_OPTIONS_READ);
 #endif
     ethr_rwmutex_runlock(&rwmtx->rwmtx);
 #endif
@@ -2580,7 +2580,7 @@ erts_rwmtx_tryrwlock(erts_rwmtx_t *rwmtx)
 #endif
 #endif
 #ifdef ERTS_ENABLE_LOCK_COUNT
-    erts_lcnt_trylock_opt(&rwmtx->lcnt, res, ERTS_LOCK_OPTION_RDWR);
+    erts_lcnt_trylock_opt(&rwmtx->lcnt, res, ERTS_LOCK_OPTIONS_RDWR);
 #endif
     
     return res;
@@ -2605,7 +2605,7 @@ erts_rwmtx_rwlock(erts_rwmtx_t *rwmtx)
 #endif
 #endif
 #ifdef ERTS_ENABLE_LOCK_COUNT
-    erts_lcnt_lock_opt(&rwmtx->lcnt, ERTS_LOCK_OPTION_RDWR);
+    erts_lcnt_lock_opt(&rwmtx->lcnt, ERTS_LOCK_OPTIONS_RDWR);
 #endif
     ethr_rwmutex_rwlock(&rwmtx->rwmtx);
 #ifdef ERTS_ENABLE_LOCK_COUNT
@@ -2622,7 +2622,7 @@ erts_rwmtx_rwunlock(erts_rwmtx_t *rwmtx)
     erts_lc_unlock_flg(&rwmtx->lc, ERTS_LC_FLG_LO_READ_WRITE);
 #endif
 #ifdef ERTS_ENABLE_LOCK_COUNT
-    erts_lcnt_unlock_opt(&rwmtx->lcnt, ERTS_LOCK_OPTION_RDWR);
+    erts_lcnt_unlock_opt(&rwmtx->lcnt, ERTS_LOCK_OPTIONS_RDWR);
 #endif
     ethr_rwmutex_rwunlock(&rwmtx->rwmtx);
 #endif
@@ -3181,7 +3181,7 @@ erts_read_unlock(erts_rwlock_t *lock)
     erts_lc_unlock_flg(&lock->lc, ERTS_LC_FLG_LO_READ);
 #endif
 #ifdef ERTS_ENABLE_LOCK_COUNT
-    erts_lcnt_unlock_opt(&lock->lcnt, ERTS_LOCK_OPTION_READ);
+    erts_lcnt_unlock_opt(&lock->lcnt, ERTS_LOCK_OPTIONS_READ);
 #endif
     ethr_read_unlock(&lock->rwlck);
 #else
@@ -3205,7 +3205,7 @@ erts_read_lock(erts_rwlock_t *lock)
 #endif
 #endif
 #ifdef ERTS_ENABLE_LOCK_COUNT
-    erts_lcnt_lock_opt(&lock->lcnt, ERTS_LOCK_OPTION_READ);
+    erts_lcnt_lock_opt(&lock->lcnt, ERTS_LOCK_OPTIONS_READ);
 #endif
     ethr_read_lock(&lock->rwlck);
 #ifdef ERTS_ENABLE_LOCK_COUNT
@@ -3224,7 +3224,7 @@ erts_write_unlock(erts_rwlock_t *lock)
     erts_lc_unlock_flg(&lock->lc, ERTS_LC_FLG_LO_READ_WRITE);
 #endif
 #ifdef ERTS_ENABLE_LOCK_COUNT
-    erts_lcnt_unlock_opt(&lock->lcnt, ERTS_LOCK_OPTION_RDWR);
+    erts_lcnt_unlock_opt(&lock->lcnt, ERTS_LOCK_OPTIONS_RDWR);
 #endif
     ethr_write_unlock(&lock->rwlck);
 #else
@@ -3248,7 +3248,7 @@ erts_write_lock(erts_rwlock_t *lock)
 #endif
 #endif
 #ifdef ERTS_ENABLE_LOCK_COUNT
-    erts_lcnt_lock_opt(&lock->lcnt, ERTS_LOCK_OPTION_RDWR);
+    erts_lcnt_lock_opt(&lock->lcnt, ERTS_LOCK_OPTIONS_RDWR);
 #endif
     ethr_write_lock(&lock->rwlck);
 #ifdef ERTS_ENABLE_LOCK_COUNT
-- 
cgit v1.2.3


From 37074ef6833feb2991ff5c07eeb9f8ad015c7df7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?John=20H=C3=B6gberg?= <john@erlang.org>
Date: Fri, 7 Jul 2017 16:41:29 +0200
Subject: Use erl_lock_flags in lock checking

---
 erts/emulator/beam/erl_lock_check.c   | 280 +++++++++++++++++++---------------
 erts/emulator/beam/erl_lock_check.h   |  50 ++----
 erts/emulator/beam/erl_process_lock.c |  28 ++--
 erts/emulator/beam/erl_threads.h      |  64 ++++----
 4 files changed, 218 insertions(+), 204 deletions(-)

diff --git a/erts/emulator/beam/erl_lock_check.c b/erts/emulator/beam/erl_lock_check.c
index 85ee703c99..cf091ee43f 100644
--- a/erts/emulator/beam/erl_lock_check.c
+++ b/erts/emulator/beam/erl_lock_check.c
@@ -200,41 +200,20 @@ static erts_lc_lock_order_t erts_lock_order[] = {
 #define ERTS_LOCK_ORDER_SIZE \
   (sizeof(erts_lock_order)/sizeof(erts_lc_lock_order_t))
 
-#define LOCK_IS_TYPE_ORDER_VIOLATION(LCK_FLG, LCKD_FLG)			\
-  (((LCKD_FLG) & (ERTS_LC_FLG_LT_SPINLOCK|ERTS_LC_FLG_LT_RWSPINLOCK))	\
-   && ((LCK_FLG)							\
-       & ERTS_LC_FLG_LT_ALL						\
-       & ~(ERTS_LC_FLG_LT_SPINLOCK|ERTS_LC_FLG_LT_RWSPINLOCK)))
+#define LOCK_IS_TYPE_ORDER_VIOLATION(LCK_FLG, LCKD_FLG) \
+    (((LCKD_FLG) & ERTS_LOCK_FLAGS_MASK_TYPE) == ERTS_LOCK_FLAGS_TYPE_SPINLOCK \
+        && \
+     ((LCK_FLG) & ERTS_LOCK_FLAGS_MASK_TYPE) != ERTS_LOCK_FLAGS_TYPE_SPINLOCK)
 
 static __decl_noreturn void  __noreturn lc_abort(void);
 
-static char *
-lock_type(Uint16 flags)
+static const char *rw_op_str(erts_lock_options_t options)
 {
-    switch (flags & ERTS_LC_FLG_LT_ALL) {
-    case ERTS_LC_FLG_LT_SPINLOCK:	return "[spinlock]";
-    case ERTS_LC_FLG_LT_RWSPINLOCK:	return "[rw(spin)lock]";
-    case ERTS_LC_FLG_LT_MUTEX:		return "[mutex]";
-    case ERTS_LC_FLG_LT_RWMUTEX:	return "[rwmutex]";
-    case ERTS_LC_FLG_LT_PROCLOCK:	return "[proclock]";
-    default:				return "";
+    if(options == ERTS_LOCK_OPTIONS_WRITE) {
+        ERTS_INTERNAL_ERROR("Only write flag present");
     }
-}
 
-static char *
-rw_op_str(Uint16 flags)
-{
-    switch (flags & ERTS_LC_FLG_LO_READ_WRITE) {
-    case ERTS_LC_FLG_LO_READ_WRITE:
-	return " (rw)";
-    case ERTS_LC_FLG_LO_READ:
-	return " (r)";
-    case ERTS_LC_FLG_LO_WRITE:
-	ERTS_INTERNAL_ERROR("Only write flag present");
-    default:
-	break;
-    }
-    return "";
+    return erts_lock_options_get_short_desc(options);
 }
 
 typedef struct erts_lc_locked_lock_t_ erts_lc_locked_lock_t;
@@ -245,7 +224,8 @@ struct erts_lc_locked_lock_t_ {
     Sint16 id;
     char *file;
     unsigned int line;
-    Uint16 flags;
+    erts_lock_flags_t flags;
+    erts_lock_options_t taken_options;
 };
 
 typedef struct {
@@ -432,7 +412,7 @@ make_my_locked_locks(void)
 }
 
 static ERTS_INLINE erts_lc_locked_lock_t *
-new_locked_lock(erts_lc_lock_t *lck, Uint16 op_flags,
+new_locked_lock(erts_lc_lock_t *lck, erts_lock_options_t options,
 		char *file, unsigned int line)
 {
     erts_lc_locked_lock_t *l_lck = (erts_lc_locked_lock_t *) lc_alloc();
@@ -442,12 +422,13 @@ new_locked_lock(erts_lc_lock_t *lck, Uint16 op_flags,
     l_lck->extra = lck->extra;
     l_lck->file = file;
     l_lck->line = line;
-    l_lck->flags = lck->flags | op_flags;
+    l_lck->flags = lck->flags;
+    l_lck->taken_options = options;
     return l_lck;
 }
 
 static void
-raw_print_lock(char *prefix, Sint16 id, Wterm extra, Uint16 flags,
+raw_print_lock(char *prefix, Sint16 id, Wterm extra, erts_lock_flags_t flags,
 	       char* file, unsigned int line, char *suffix)
 {
     char *lname = (0 <= id && id < ERTS_LOCK_ORDER_SIZE
@@ -459,16 +440,16 @@ raw_print_lock(char *prefix, Sint16 id, Wterm extra, Uint16 flags,
       erts_fprintf(stderr,"%p",_unchecked_boxed_val(extra));
     else
       erts_fprintf(stderr,"%T",extra);
-    erts_fprintf(stderr,"%s",lock_type(flags));
+    erts_fprintf(stderr,"[%s]",erts_lock_flags_get_type_name(flags));
 
     if (file)
       erts_fprintf(stderr,"(%s:%d)",file,line);
 
-    erts_fprintf(stderr,"'%s%s",rw_op_str(flags),suffix);
+    erts_fprintf(stderr,"'(%s)%s",rw_op_str(flags),suffix);
 }
 
 static void
-print_lock2(char *prefix, Sint16 id, Wterm extra, Uint16 flags, char *suffix)
+print_lock2(char *prefix, Sint16 id, Wterm extra, erts_lock_flags_t flags, char *suffix)
 {
   raw_print_lock(prefix, id, extra, flags, NULL, 0, suffix);
 }
@@ -523,9 +504,9 @@ uninitialized_lock(void)
 
 static void
 lock_twice(char *prefix, erts_lc_locked_locks_t *l_lcks, erts_lc_lock_t *lck,
-	   Uint16 op_flags)
+	   erts_lock_options_t options)
 {
-    erts_fprintf(stderr, "%s%s", prefix, rw_op_str(op_flags));
+    erts_fprintf(stderr, "%s (%s)", prefix, rw_op_str(options));
     print_lock(" ", lck, " lock which is already locked by thread!\n");
     print_curr_locks(l_lcks);
     lc_abort();
@@ -533,9 +514,9 @@ lock_twice(char *prefix, erts_lc_locked_locks_t *l_lcks, erts_lc_lock_t *lck,
 
 static void
 unlock_op_mismatch(erts_lc_locked_locks_t *l_lcks, erts_lc_lock_t *lck,
-		   Uint16 op_flags)
+		   erts_lock_options_t options)
 {
-    erts_fprintf(stderr, "Unlocking%s ", rw_op_str(op_flags));
+    erts_fprintf(stderr, "Unlocking (%s) ", rw_op_str(options));
     print_lock("", lck, " lock which mismatch previous lock operation!\n");
     print_curr_locks(l_lcks);
     lc_abort();
@@ -746,84 +727,128 @@ erts_lc_get_lock_order_id(char *name)
     return (Sint16) -1;
 }
 
+static int compare_locked_by_id(erts_lc_locked_lock_t *locked_lock, erts_lc_lock_t *comparand)
+{
+    if(locked_lock->id < comparand->id) {
+        return -1;
+    } else if(locked_lock->id > comparand->id) {
+        return 1;
+    }
 
-static int
-find_lock(erts_lc_locked_lock_t **l_lcks, erts_lc_lock_t *lck)
+    return 0;
+}
+
+static int compare_locked_by_id_extra(erts_lc_locked_lock_t *locked_lock, erts_lc_lock_t *comparand)
 {
-    erts_lc_locked_lock_t *l_lck = *l_lcks;
+    int order = compare_locked_by_id(locked_lock, comparand);
+
+    if(order) {
+        return order;
+    } else if(locked_lock->extra < comparand->extra) {
+        return -1;
+    } else if(locked_lock->extra > comparand->extra) {
+        return 1;
+    }
 
-    if (l_lck) {
-	if (l_lck->id == lck->id && l_lck->extra == lck->extra) {
-	    if ((l_lck->flags & lck->flags) == lck->flags)
-		return 1;
-	    return 0;
-	}
-	else if (l_lck->id < lck->id
-		 || (l_lck->id == lck->id
-		     && l_lck->extra < lck->extra)) {
-	    for (l_lck = l_lck->next; l_lck; l_lck = l_lck->next) {
-		if (l_lck->id > lck->id
-		    || (l_lck->id == lck->id
-			&& l_lck->extra >= lck->extra)) {
-		    *l_lcks = l_lck;
-		    if (l_lck->id == lck->id
-			&& l_lck->extra == lck->extra
-			&& ((l_lck->flags & lck->flags) == lck->flags))
-			    return 1;
-		    return 0;
-		}
-	    }
-	}
-	else {
-	    for (l_lck = l_lck->prev; l_lck; l_lck = l_lck->prev) {
-		if (l_lck->id < lck->id
-		    || (l_lck->id == lck->id
-			&& l_lck->extra <= lck->extra)) {
-		    *l_lcks = l_lck;
-		    if (l_lck->id == lck->id
-			&& l_lck->extra == lck->extra
-			&& ((l_lck->flags & lck->flags) == lck->flags))
-			return 1;
-		    return 0;
-		}
-	    }
-	}
+    return 0;
+}
+
+typedef int (*locked_compare_func)(erts_lc_locked_lock_t *, erts_lc_lock_t *);
+
+/* Searches through a list of taken locks, bailing when it hits an entry whose
+ * order relative to the search template is the opposite of the one at the
+ * start of the search. (*closest_neighbor) is either set to the exact match,
+ * or the one closest to it in the sort order. */
+static int search_locked_list(locked_compare_func compare,
+                              erts_lc_locked_lock_t *locked_locks,
+                              erts_lc_lock_t *search_template,
+                              erts_lc_locked_lock_t **closest_neighbor)
+{
+    erts_lc_locked_lock_t *iterator = locked_locks;
+
+    (*closest_neighbor) = iterator;
+
+    if(iterator) {
+        int relative_order = compare(iterator, search_template);
+
+        if(relative_order < 0) {
+            while((iterator = iterator->next) != NULL) {
+                relative_order = compare(iterator, search_template);
+
+                if(relative_order >= 0) {
+                    (*closest_neighbor) = iterator;
+                    break;
+                }
+            }
+        } else if(relative_order > 0) {
+            while((iterator = iterator->prev) != NULL) {
+                relative_order = compare(iterator, search_template);
+
+                if(relative_order <= 0) {
+                    (*closest_neighbor) = iterator;
+                    break;
+                }
+            }
+        }
+
+        return relative_order == 0;
     }
+
     return 0;
 }
 
+/* Searches for a lock in the given list that matches search_template, and sets
+ * (*locked_locks) to the closest lock in the sort order. */
 static int
-find_id(erts_lc_locked_lock_t **l_lcks, Sint16 id)
-{
-    erts_lc_locked_lock_t *l_lck = *l_lcks;
-
-    if (l_lck) {
-	if (l_lck->id == id)
-	    return 1;
-	else if (l_lck->id < id) {
-	    for (l_lck = l_lck->next; l_lck; l_lck = l_lck->next) {
-		if (l_lck->id >= id) {
-		    *l_lcks = l_lck;
-		    if (l_lck->id == id)
-			return 1;
-		    return 0;
-		}
-	    }
-	}
-	else {
-	    for (l_lck = l_lck->prev; l_lck; l_lck = l_lck->prev) {
-		if (l_lck->id <= id) {
-		    *l_lcks = l_lck;
-		    if (l_lck->id == id)
-			return 1;
-		    return 0;
-		}
-	    }
-	}
+find_lock(erts_lc_locked_lock_t **locked_locks, erts_lc_lock_t *search_template)
+{
+    erts_lc_locked_lock_t *closest_neighbor;
+    int found_lock;
+
+    found_lock = search_locked_list(compare_locked_by_id_extra,
+                                    (*locked_locks),
+                                    search_template,
+                                    &closest_neighbor);
+
+    (*locked_locks) = closest_neighbor;
+
+    if(found_lock) {
+        erts_lock_options_t relevant_options;
+        erts_lock_flags_t relevant_flags;
+
+        /* We only care about the options and flags that are set in the
+         * template. */
+        relevant_options = (closest_neighbor->taken_options & search_template->taken_options);
+        relevant_flags = (closest_neighbor->flags & search_template->flags);
+
+        return search_template->taken_options == relevant_options &&
+               search_template->flags == relevant_flags;
     }
+
     return 0;
 }
 
+/* Searches for a lock in the given list by id, and sets (*locked_locks) to the
+ * closest lock in the sort order. */
+static int
+find_id(erts_lc_locked_lock_t **locked_locks, Sint16 id)
+{
+    erts_lc_locked_lock_t *closest_neighbor;
+    erts_lc_lock_t search_template;
+    int found_lock;
+
+    search_template.id = id;
+
+    found_lock = search_locked_list(compare_locked_by_id,
+                                    (*locked_locks),
+                                    &search_template,
+                                    &closest_neighbor);
+
+    (*locked_locks) = closest_neighbor;
+
+    return found_lock;
+}
+
 void
 erts_lc_have_locks(int *resv, erts_lc_lock_t *locks, int len)
 {
@@ -919,17 +944,17 @@ erts_lc_check_exact(erts_lc_lock_t *have, int have_len)
 }
 
 void
-erts_lc_check_no_locked_of_type(Uint16 flags)
+erts_lc_check_no_locked_of_type(erts_lock_flags_t type)
 {
     erts_lc_locked_locks_t *l_lcks = get_my_locked_locks();
     if (l_lcks) {
 	erts_lc_locked_lock_t *l_lck = l_lcks->locked.first;
 	for (l_lck = l_lcks->locked.first; l_lck; l_lck = l_lck->next) {
-	    if (l_lck->flags & flags) {
+	    if ((l_lck->flags & ERTS_LOCK_FLAGS_MASK_TYPE) == type) {
 		erts_fprintf(stderr,
 			     "Locked lock of type %s found which isn't "
 			     "allowed here!\n",
-			     lock_type(l_lck->flags));
+			     erts_lock_flags_get_type_name(l_lck->flags));
 		print_curr_locks(l_lcks);
 		lc_abort();
 	    }
@@ -938,7 +963,7 @@ erts_lc_check_no_locked_of_type(Uint16 flags)
 }
 
 int
-erts_lc_trylock_force_busy_flg(erts_lc_lock_t *lck, Uint16 op_flags)
+erts_lc_trylock_force_busy_flg(erts_lc_lock_t *lck, erts_lock_options_t options)
 {
 #ifdef ERTS_LC_DO_NOT_FORCE_BUSY_TRYLOCK_ON_LOCK_ORDER_VIOLATION
     return 0;
@@ -987,7 +1012,7 @@ erts_lc_trylock_force_busy_flg(erts_lc_lock_t *lck, Uint16 op_flags)
 	    if (tl_lck->id < lck->id
 		|| (tl_lck->id == lck->id && tl_lck->extra <= lck->extra)) {
 		if (tl_lck->id == lck->id && tl_lck->extra == lck->extra)
-		    lock_twice("Trylocking", l_lcks, lck, op_flags);
+		    lock_twice("Trylocking", l_lcks, lck, options);
 		break;
 	    }
 	}
@@ -1009,7 +1034,7 @@ erts_lc_trylock_force_busy_flg(erts_lc_lock_t *lck, Uint16 op_flags)
 #endif
 }
 
-void erts_lc_trylock_flg_x(int locked, erts_lc_lock_t *lck, Uint16 op_flags,
+void erts_lc_trylock_flg_x(int locked, erts_lc_lock_t *lck, erts_lock_options_t options,
 			   char *file, unsigned int line)
 {
     erts_lc_locked_locks_t *l_lcks;
@@ -1022,7 +1047,7 @@ void erts_lc_trylock_flg_x(int locked, erts_lc_lock_t *lck, Uint16 op_flags,
 	return;
 
     l_lcks = make_my_locked_locks();
-    l_lck = locked ? new_locked_lock(lck, op_flags, file, line) : NULL;
+    l_lck = locked ? new_locked_lock(lck, options, file, line) : NULL;
 
     if (!l_lcks->locked.last) {
 	ASSERT(!l_lcks->locked.first);
@@ -1040,7 +1065,7 @@ void erts_lc_trylock_flg_x(int locked, erts_lc_lock_t *lck, Uint16 op_flags,
 	    if (tl_lck->id < lck->id
 		|| (tl_lck->id == lck->id && tl_lck->extra <= lck->extra)) {
 		if (tl_lck->id == lck->id && tl_lck->extra == lck->extra)
-		    lock_twice("Trylocking", l_lcks, lck, op_flags);
+		    lock_twice("Trylocking", l_lcks, lck, options);
 		if (locked) {
 		    l_lck->next = tl_lck->next;
 		    l_lck->prev = tl_lck;
@@ -1063,14 +1088,14 @@ void erts_lc_trylock_flg_x(int locked, erts_lc_lock_t *lck, Uint16 op_flags,
 
 }
 
-void erts_lc_require_lock_flg(erts_lc_lock_t *lck, Uint16 op_flags,
+void erts_lc_require_lock_flg(erts_lc_lock_t *lck, erts_lock_options_t options,
 			      char *file, unsigned int line)
 {
     erts_lc_locked_locks_t *l_lcks = make_my_locked_locks();
     erts_lc_locked_lock_t *l_lck = l_lcks->locked.first;
     if (!find_lock(&l_lck, lck))
 	required_not_locked(l_lcks, lck);
-    l_lck = new_locked_lock(lck, op_flags, file, line);
+    l_lck = new_locked_lock(lck, options, file, line);
     if (!l_lcks->required.last) {
 	ASSERT(!l_lcks->required.first);
 	l_lck->next = l_lck->prev = NULL;
@@ -1110,7 +1135,7 @@ void erts_lc_require_lock_flg(erts_lc_lock_t *lck, Uint16 op_flags,
     }
 }
 
-void erts_lc_unrequire_lock_flg(erts_lc_lock_t *lck, Uint16 op_flags)
+void erts_lc_unrequire_lock_flg(erts_lc_lock_t *lck, erts_lock_options_t options)
 {
     erts_lc_locked_locks_t *l_lcks = make_my_locked_locks();
     erts_lc_locked_lock_t *l_lck = l_lcks->locked.first;
@@ -1138,7 +1163,7 @@ void erts_lc_unrequire_lock_flg(erts_lc_lock_t *lck, Uint16 op_flags)
     lc_free((void *) l_lck);
 }
 
-void erts_lc_lock_flg_x(erts_lc_lock_t *lck, Uint16 op_flags,
+void erts_lc_lock_flg_x(erts_lc_lock_t *lck, erts_lock_options_t options,
 			char *file, unsigned int line)
 {
     erts_lc_locked_locks_t *l_lcks;
@@ -1151,7 +1176,7 @@ void erts_lc_lock_flg_x(erts_lc_lock_t *lck, Uint16 op_flags,
 	return;
 
     l_lcks = make_my_locked_locks();
-    l_lck = new_locked_lock(lck, op_flags, file, line);
+    l_lck = new_locked_lock(lck, options, file, line);
 
     if (!l_lcks->locked.last) {
 	ASSERT(!l_lcks->locked.first);
@@ -1167,12 +1192,12 @@ void erts_lc_lock_flg_x(erts_lc_lock_t *lck, Uint16 op_flags,
 	l_lcks->locked.last = l_lck;
     }
     else if (l_lcks->locked.last->id == lck->id && l_lcks->locked.last->extra == lck->extra)
-	lock_twice("Locking", l_lcks, lck, op_flags);
+	lock_twice("Locking", l_lcks, lck, options);
     else
 	lock_order_violation(l_lcks, lck);
 }
 
-void erts_lc_unlock_flg(erts_lc_lock_t *lck, Uint16 op_flags)
+void erts_lc_unlock_flg(erts_lc_lock_t *lck, erts_lock_options_t options)
 {
     erts_lc_locked_locks_t *l_lcks;
     erts_lc_locked_lock_t *l_lck;
@@ -1193,8 +1218,8 @@ void erts_lc_unlock_flg(erts_lc_lock_t *lck, Uint16 op_flags)
 
     for (l_lck = l_lcks ? l_lcks->locked.last : NULL; l_lck; l_lck = l_lck->prev) {
 	if (l_lck->id == lck->id && l_lck->extra == lck->extra) {
-	    if ((l_lck->flags & ERTS_LC_FLG_LO_ALL) != op_flags)
-		unlock_op_mismatch(l_lcks, lck, op_flags);
+	    if ((l_lck->taken_options & ERTS_LOCK_OPTIONS_RDWR) != options)
+		unlock_op_mismatch(l_lcks, lck, options);
 	    if (l_lck->prev)
 		l_lck->prev->next = l_lck->next;
 	    else
@@ -1211,7 +1236,7 @@ void erts_lc_unlock_flg(erts_lc_lock_t *lck, Uint16 op_flags)
     unlock_of_not_locked(l_lcks, lck);
 }
 
-void erts_lc_might_unlock_flg(erts_lc_lock_t *lck, Uint16 op_flags)
+void erts_lc_might_unlock_flg(erts_lc_lock_t *lck, erts_lock_options_t options)
 {
     erts_lc_locked_locks_t *l_lcks;
     erts_lc_locked_lock_t *l_lck;
@@ -1275,23 +1300,25 @@ void erts_lc_unrequire_lock(erts_lc_lock_t *lck)
 }
 
 void
-erts_lc_init_lock(erts_lc_lock_t *lck, char *name, Uint16 flags)
+erts_lc_init_lock(erts_lc_lock_t *lck, char *name, erts_lock_flags_t flags)
 {
     lck->id = erts_lc_get_lock_order_id(name);
 
     lck->extra = (UWord) &lck->extra;
     ASSERT(is_not_immed(lck->extra));
     lck->flags = flags;
+    lck->taken_options = 0;
     lck->inited = ERTS_LC_INITITALIZED;
 }
 
 void
-erts_lc_init_lock_x(erts_lc_lock_t *lck, char *name, Uint16 flags, Eterm extra)
+erts_lc_init_lock_x(erts_lc_lock_t *lck, char *name, erts_lock_flags_t flags, Eterm extra)
 {
     lck->id = erts_lc_get_lock_order_id(name);
     lck->extra = extra;
     ASSERT(is_immed(lck->extra));
     lck->flags = flags;
+    lck->taken_options = 0;
     lck->inited = ERTS_LC_INITITALIZED;
 }
 
@@ -1305,6 +1332,7 @@ erts_lc_destroy_lock(erts_lc_lock_t *lck)
     lck->id = -1;
     lck->extra = THE_NON_VALUE;
     lck->flags = 0;
+    lck->taken_options = 0;
 }
 
 void
diff --git a/erts/emulator/beam/erl_lock_check.h b/erts/emulator/beam/erl_lock_check.h
index 18296d1fec..8c754a8dfa 100644
--- a/erts/emulator/beam/erl_lock_check.h
+++ b/erts/emulator/beam/erl_lock_check.h
@@ -36,6 +36,8 @@
 
 #ifdef ERTS_ENABLE_LOCK_CHECK
 
+#include "erl_lock_flags.h"
+
 #ifndef ERTS_ENABLE_LOCK_POSITION
 /* Enable in order for _x variants of mtx functions to be used. */
 #define ERTS_ENABLE_LOCK_POSITION 1
@@ -44,36 +46,14 @@
 typedef struct {
     int inited;
     Sint16 id;
-    Uint16 flags;
+    erts_lock_flags_t flags;
+    erts_lock_options_t taken_options;
     UWord extra;
 } erts_lc_lock_t;
 
 #define ERTS_LC_INITITALIZED 0x7f7f7f7f
 
-
-#define ERTS_LC_FLG_LT_SPINLOCK		(((Uint16) 1) << 0)
-#define ERTS_LC_FLG_LT_RWSPINLOCK	(((Uint16) 1) << 1)
-#define ERTS_LC_FLG_LT_MUTEX		(((Uint16) 1) << 2)
-#define ERTS_LC_FLG_LT_RWMUTEX		(((Uint16) 1) << 3)
-#define ERTS_LC_FLG_LT_PROCLOCK		(((Uint16) 1) << 4)
-
-#define ERTS_LC_FLG_LO_READ		(((Uint16) 1) << 5)
-#define ERTS_LC_FLG_LO_WRITE		(((Uint16) 1) << 6)
-
-#define ERTS_LC_FLG_LO_READ_WRITE	(ERTS_LC_FLG_LO_READ		\
-					 | ERTS_LC_FLG_LO_WRITE)
-
-#define ERTS_LC_FLG_LT_ALL		(ERTS_LC_FLG_LT_SPINLOCK	\
-					 | ERTS_LC_FLG_LT_RWSPINLOCK	\
-					 | ERTS_LC_FLG_LT_MUTEX		\
-					 | ERTS_LC_FLG_LT_RWMUTEX	\
-					 | ERTS_LC_FLG_LT_PROCLOCK)
-
-#define ERTS_LC_FLG_LO_ALL		(ERTS_LC_FLG_LO_READ		\
-					 | ERTS_LC_FLG_LO_WRITE)
-
-
-#define ERTS_LC_LOCK_INIT(ID, X, F) {ERTS_LC_INITITALIZED, (ID), (F), (X)}
+#define ERTS_LC_LOCK_INIT(ID, X, F) {ERTS_LC_INITITALIZED, (ID), (F), 0, (X)}
 
 void erts_lc_init(void);
 void erts_lc_late_init(void);
@@ -83,31 +63,31 @@ void erts_lc_check(erts_lc_lock_t *have, int have_len,
 void erts_lc_check_exact(erts_lc_lock_t *have, int have_len);
 void erts_lc_have_locks(int *resv, erts_lc_lock_t *lcks, int len);
 void erts_lc_have_lock_ids(int *resv, int *ids, int len);
-void erts_lc_check_no_locked_of_type(Uint16 flags);
-int erts_lc_trylock_force_busy_flg(erts_lc_lock_t *lck, Uint16 op_flags);
-void erts_lc_trylock_flg_x(int locked, erts_lc_lock_t *lck, Uint16 op_flags,
+void erts_lc_check_no_locked_of_type(erts_lock_flags_t flags);
+int erts_lc_trylock_force_busy_flg(erts_lc_lock_t *lck, erts_lock_options_t options);
+void erts_lc_trylock_flg_x(int locked, erts_lc_lock_t *lck, erts_lock_options_t options,
 			   char *file, unsigned int line);
-void erts_lc_lock_flg_x(erts_lc_lock_t *lck, Uint16 op_flags,
+void erts_lc_lock_flg_x(erts_lc_lock_t *lck, erts_lock_options_t options,
 			char *file, unsigned int line);
-void erts_lc_unlock_flg(erts_lc_lock_t *lck, Uint16 op_flags);
-void erts_lc_might_unlock_flg(erts_lc_lock_t *lck, Uint16 op_flags);
+void erts_lc_unlock_flg(erts_lc_lock_t *lck, erts_lock_options_t options);
+void erts_lc_might_unlock_flg(erts_lc_lock_t *lck, erts_lock_options_t options);
 int erts_lc_trylock_force_busy(erts_lc_lock_t *lck);
 void erts_lc_trylock_x(int locked, erts_lc_lock_t *lck,
 		     char* file, unsigned int line);
 void erts_lc_lock_x(erts_lc_lock_t *lck, char* file, unsigned int line);
 void erts_lc_unlock(erts_lc_lock_t *lck);
 void erts_lc_might_unlock(erts_lc_lock_t *lck);
-void erts_lc_init_lock(erts_lc_lock_t *lck, char *name, Uint16 flags);
-void erts_lc_init_lock_x(erts_lc_lock_t *lck, char *name, Uint16 flags, Eterm extra);
+void erts_lc_init_lock(erts_lc_lock_t *lck, char *name, erts_lock_flags_t flags);
+void erts_lc_init_lock_x(erts_lc_lock_t *lck, char *name, erts_lock_flags_t flags, Eterm extra);
 void erts_lc_destroy_lock(erts_lc_lock_t *lck);
 void erts_lc_fail(char *fmt, ...);
 int erts_lc_assert_failed(char *file, int line, char *assertion);
 void erts_lc_set_thread_name(char *thread_name);
 void erts_lc_pll(void);
 
-void erts_lc_require_lock_flg(erts_lc_lock_t *lck, Uint16 op_flags,
+void erts_lc_require_lock_flg(erts_lc_lock_t *lck, erts_lock_options_t options,
 			      char *file, unsigned int line);
-void erts_lc_unrequire_lock_flg(erts_lc_lock_t *lck, Uint16 op_flags);
+void erts_lc_unrequire_lock_flg(erts_lc_lock_t *lck, erts_lock_options_t options);
 
 void erts_lc_require_lock(erts_lc_lock_t *lck, char *file, unsigned int line);
 void erts_lc_unrequire_lock(erts_lc_lock_t *lck);
diff --git a/erts/emulator/beam/erl_process_lock.c b/erts/emulator/beam/erl_process_lock.c
index 23c7414901..ff124d5ba7 100644
--- a/erts/emulator/beam/erl_process_lock.c
+++ b/erts/emulator/beam/erl_process_lock.c
@@ -1200,7 +1200,7 @@ erts_proc_lc_lock(Process *p, ErtsProcLocks locks, char *file, unsigned int line
 {
     erts_lc_lock_t lck = ERTS_LC_LOCK_INIT(-1,
 					   p->common.id,
-					   ERTS_LC_FLG_LT_PROCLOCK);
+					   ERTS_LOCK_TYPE_PROCLOCK);
     if (locks & ERTS_PROC_LOCK_MAIN) {
 	lck.id = lc_id.proc_lock_main;
 	erts_lc_lock_x(&lck,file,line);
@@ -1233,7 +1233,7 @@ erts_proc_lc_trylock(Process *p, ErtsProcLocks locks, int locked,
 {
     erts_lc_lock_t lck = ERTS_LC_LOCK_INIT(-1,
 					   p->common.id,
-					   ERTS_LC_FLG_LT_PROCLOCK);
+					   ERTS_LOCK_TYPE_PROCLOCK);
     if (locks & ERTS_PROC_LOCK_MAIN) {
 	lck.id = lc_id.proc_lock_main;
 	erts_lc_trylock_x(locked, &lck, file, line);
@@ -1265,7 +1265,7 @@ erts_proc_lc_unlock(Process *p, ErtsProcLocks locks)
 {
     erts_lc_lock_t lck = ERTS_LC_LOCK_INIT(-1,
 					   p->common.id,
-					   ERTS_LC_FLG_LT_PROCLOCK);
+					   ERTS_LOCK_TYPE_PROCLOCK);
     if (locks & ERTS_PROC_LOCK_TRACE) {
 	lck.id = lc_id.proc_lock_trace;
 	erts_lc_unlock(&lck);
@@ -1300,7 +1300,7 @@ erts_proc_lc_might_unlock(Process *p, ErtsProcLocks locks)
 #if ERTS_PROC_LOCK_OWN_IMPL
     erts_lc_lock_t lck = ERTS_LC_LOCK_INIT(-1,
 					   p->common.id,
-					   ERTS_LC_FLG_LT_PROCLOCK);
+					   ERTS_LOCK_TYPE_PROCLOCK);
     if (locks & ERTS_PROC_LOCK_TRACE) {
 	lck.id = lc_id.proc_lock_trace;
 	erts_lc_might_unlock(&lck);
@@ -1348,7 +1348,7 @@ erts_proc_lc_require_lock(Process *p, ErtsProcLocks locks, char *file,
 #if ERTS_PROC_LOCK_OWN_IMPL
     erts_lc_lock_t lck = ERTS_LC_LOCK_INIT(-1,
 					   p->common.id,
-					   ERTS_LC_FLG_LT_PROCLOCK);
+					   ERTS_LOCK_TYPE_PROCLOCK);
     if (locks & ERTS_PROC_LOCK_MAIN) {
 	lck.id = lc_id.proc_lock_main;
 	erts_lc_require_lock(&lck, file, line);
@@ -1395,7 +1395,7 @@ erts_proc_lc_unrequire_lock(Process *p, ErtsProcLocks locks)
 #if ERTS_PROC_LOCK_OWN_IMPL
     erts_lc_lock_t lck = ERTS_LC_LOCK_INIT(-1,
 					   p->common.id,
-					   ERTS_LC_FLG_LT_PROCLOCK);
+					   ERTS_LOCK_TYPE_PROCLOCK);
     if (locks & ERTS_PROC_LOCK_TRACE) {
 	lck.id = lc_id.proc_lock_trace;
 	erts_lc_unrequire_lock(&lck);
@@ -1444,7 +1444,7 @@ erts_proc_lc_trylock_force_busy(Process *p, ErtsProcLocks locks)
     if (locks & ERTS_PROC_LOCKS_ALL) {
 	erts_lc_lock_t lck = ERTS_LC_LOCK_INIT(-1,
 					       p->common.id,
-					       ERTS_LC_FLG_LT_PROCLOCK);
+					       ERTS_LOCK_TYPE_PROCLOCK);
 
 	if (locks & ERTS_PROC_LOCK_MAIN)
 	    lck.id = lc_id.proc_lock_main;
@@ -1475,7 +1475,7 @@ void erts_proc_lc_chk_only_proc_main(Process *p)
 
 #if ERTS_PROC_LOCK_OWN_IMPL
 #define ERTS_PROC_LC_EMPTY_LOCK_INIT \
-  ERTS_LC_LOCK_INIT(-1, THE_NON_VALUE, ERTS_LC_FLG_LT_PROCLOCK)
+  ERTS_LC_LOCK_INIT(-1, THE_NON_VALUE, ERTS_LOCK_TYPE_PROCLOCK)
 #endif /* ERTS_PROC_LOCK_OWN_IMPL */
 
 void erts_proc_lc_chk_only_proc(Process *p, ErtsProcLocks locks)
@@ -1690,22 +1690,22 @@ erts_proc_lc_my_proc_locks(Process *p)
 #if ERTS_PROC_LOCK_OWN_IMPL
     erts_lc_lock_t locks[6] = {ERTS_LC_LOCK_INIT(lc_id.proc_lock_main,
 						 p->common.id,
-						 ERTS_LC_FLG_LT_PROCLOCK),
+						 ERTS_LOCK_TYPE_PROCLOCK),
 			       ERTS_LC_LOCK_INIT(lc_id.proc_lock_link,
 						 p->common.id,
-						 ERTS_LC_FLG_LT_PROCLOCK),
+						 ERTS_LOCK_TYPE_PROCLOCK),
 			       ERTS_LC_LOCK_INIT(lc_id.proc_lock_msgq,
 						 p->common.id,
-						 ERTS_LC_FLG_LT_PROCLOCK),
+						 ERTS_LOCK_TYPE_PROCLOCK),
 			       ERTS_LC_LOCK_INIT(lc_id.proc_lock_btm,
 						 p->common.id,
-						 ERTS_LC_FLG_LT_PROCLOCK),
+						 ERTS_LOCK_TYPE_PROCLOCK),
 			       ERTS_LC_LOCK_INIT(lc_id.proc_lock_status,
 						 p->common.id,
-						 ERTS_LC_FLG_LT_PROCLOCK),
+						 ERTS_LOCK_TYPE_PROCLOCK),
 			       ERTS_LC_LOCK_INIT(lc_id.proc_lock_trace,
 						 p->common.id,
-						 ERTS_LC_FLG_LT_PROCLOCK)};
+						 ERTS_LOCK_TYPE_PROCLOCK)};
 #elif ERTS_PROC_LOCK_RAW_MUTEX_IMPL
     erts_lc_lock_t locks[6] = {p->lock.main.lc,
 			       p->lock.link.lc,
diff --git a/erts/emulator/beam/erl_threads.h b/erts/emulator/beam/erl_threads.h
index 6e5a8210cb..8b5c17d739 100644
--- a/erts/emulator/beam/erl_threads.h
+++ b/erts/emulator/beam/erl_threads.h
@@ -2180,7 +2180,7 @@ erts_mtx_init(erts_mtx_t *mtx, char *name, Eterm extra, erts_lock_flags_t flags)
 #endif
 
 #ifdef ERTS_ENABLE_LOCK_CHECK
-    erts_lc_init_lock_x(&mtx->lc, name, ERTS_LC_FLG_LT_MUTEX, extra);
+    erts_lc_init_lock_x(&mtx->lc, name, flags, extra);
 #endif
 #ifdef ERTS_ENABLE_LOCK_COUNT
     erts_lcnt_init_ref_x(&mtx->lcnt, name, extra, flags);
@@ -2313,7 +2313,8 @@ erts_lc_mtx_is_locked(erts_mtx_t *mtx)
 #if defined(USE_THREADS) && defined(ERTS_ENABLE_LOCK_CHECK)
     int res;
     erts_lc_lock_t lc = mtx->lc;
-    lc.flags = 0;
+    lc.flags = ERTS_LOCK_FLAGS_TYPE_MUTEX;
+    lc.taken_options = 0;
     erts_lc_have_locks(&res, &lc, 1);
     return res;
 #else
@@ -2413,7 +2414,7 @@ erts_rwmtx_set_reader_group(int no)
 #ifdef USE_THREADS
     int res;
 #ifdef ERTS_ENABLE_LOCK_CHECK
-    erts_lc_check_no_locked_of_type(ERTS_LC_FLG_LT_RWMUTEX);
+    erts_lc_check_no_locked_of_type(ERTS_LOCK_TYPE_RWMUTEX);
 #endif
     res = ethr_rwmutex_set_reader_group(no);
     if (res != 0)
@@ -2436,7 +2437,7 @@ erts_rwmtx_init_opt(erts_rwmtx_t *rwmtx, erts_rwmtx_opt_t *opt,
 #endif
 
 #ifdef ERTS_ENABLE_LOCK_CHECK
-    erts_lc_init_lock_x(&rwmtx->lc, name, ERTS_LC_FLG_LT_RWMUTEX, extra);
+    erts_lc_init_lock_x(&rwmtx->lc, name, flags, extra);
 #endif
 #ifdef ERTS_ENABLE_LOCK_COUNT
     erts_lcnt_init_ref_x(&rwmtx->lcnt, name, extra, flags);
@@ -2490,7 +2491,7 @@ erts_rwmtx_tryrlock(erts_rwmtx_t *rwmtx)
     int res;
 
 #ifdef ERTS_ENABLE_LOCK_CHECK
-    if (erts_lc_trylock_force_busy_flg(&rwmtx->lc, ERTS_LC_FLG_LO_READ))
+    if (erts_lc_trylock_force_busy_flg(&rwmtx->lc, ERTS_LOCK_OPTIONS_READ))
 	return EBUSY; /* Make sure caller can handle the situation without
 			 causing a lock order violation */
 #endif
@@ -2499,9 +2500,9 @@ erts_rwmtx_tryrlock(erts_rwmtx_t *rwmtx)
 
 #ifdef ERTS_ENABLE_LOCK_CHECK
 #ifdef ERTS_ENABLE_LOCK_POSITION
-    erts_lc_trylock_flg_x(res == 0, &rwmtx->lc, ERTS_LC_FLG_LO_READ,file,line);
+    erts_lc_trylock_flg_x(res == 0, &rwmtx->lc, ERTS_LOCK_OPTIONS_READ,file,line);
 #else
-    erts_lc_trylock_flg(res == 0, &rwmtx->lc, ERTS_LC_FLG_LO_READ);
+    erts_lc_trylock_flg(res == 0, &rwmtx->lc, ERTS_LOCK_OPTIONS_READ);
 #endif
 #endif
 #ifdef ERTS_ENABLE_LOCK_COUNT
@@ -2524,9 +2525,9 @@ erts_rwmtx_rlock(erts_rwmtx_t *rwmtx)
 #ifdef USE_THREADS
 #ifdef ERTS_ENABLE_LOCK_CHECK
 #ifdef ERTS_ENABLE_LOCK_POSITION
-    erts_lc_lock_flg_x(&rwmtx->lc, ERTS_LC_FLG_LO_READ,file,line);
+    erts_lc_lock_flg_x(&rwmtx->lc, ERTS_LOCK_OPTIONS_READ,file,line);
 #else
-    erts_lc_lock_flg(&rwmtx->lc, ERTS_LC_FLG_LO_READ);
+    erts_lc_lock_flg(&rwmtx->lc, ERTS_LOCK_OPTIONS_READ);
 #endif
 #endif
 #ifdef ERTS_ENABLE_LOCK_COUNT
@@ -2544,7 +2545,7 @@ erts_rwmtx_runlock(erts_rwmtx_t *rwmtx)
 {
 #ifdef USE_THREADS
 #ifdef ERTS_ENABLE_LOCK_CHECK
-    erts_lc_unlock_flg(&rwmtx->lc, ERTS_LC_FLG_LO_READ);
+    erts_lc_unlock_flg(&rwmtx->lc, ERTS_LOCK_OPTIONS_READ);
 #endif
 #ifdef ERTS_ENABLE_LOCK_COUNT
     erts_lcnt_unlock_opt(&rwmtx->lcnt, ERTS_LOCK_OPTIONS_READ);
@@ -2565,7 +2566,7 @@ erts_rwmtx_tryrwlock(erts_rwmtx_t *rwmtx)
     int res;
 
 #ifdef ERTS_ENABLE_LOCK_CHECK
-    if (erts_lc_trylock_force_busy_flg(&rwmtx->lc, ERTS_LC_FLG_LO_READ_WRITE))
+    if (erts_lc_trylock_force_busy_flg(&rwmtx->lc, ERTS_LOCK_OPTIONS_RDWR))
 	return EBUSY; /* Make sure caller can handle the situation without
 			 causing a lock order violation */
 #endif
@@ -2574,9 +2575,9 @@ erts_rwmtx_tryrwlock(erts_rwmtx_t *rwmtx)
 
 #ifdef ERTS_ENABLE_LOCK_CHECK
 #ifdef ERTS_ENABLE_LOCK_POSITION
-    erts_lc_trylock_flg_x(res == 0, &rwmtx->lc, ERTS_LC_FLG_LO_READ_WRITE,file,line);
+    erts_lc_trylock_flg_x(res == 0, &rwmtx->lc, ERTS_LOCK_OPTIONS_RDWR,file,line);
 #else
-    erts_lc_trylock_flg(res == 0, &rwmtx->lc, ERTS_LC_FLG_LO_READ_WRITE);
+    erts_lc_trylock_flg(res == 0, &rwmtx->lc, ERTS_LOCK_OPTIONS_RDWR);
 #endif
 #endif
 #ifdef ERTS_ENABLE_LOCK_COUNT
@@ -2599,9 +2600,9 @@ erts_rwmtx_rwlock(erts_rwmtx_t *rwmtx)
 #ifdef USE_THREADS
 #ifdef ERTS_ENABLE_LOCK_CHECK
 #ifdef ERTS_ENABLE_LOCK_POSITION
-    erts_lc_lock_flg_x(&rwmtx->lc, ERTS_LC_FLG_LO_READ_WRITE,file,line);
+    erts_lc_lock_flg_x(&rwmtx->lc, ERTS_LOCK_OPTIONS_RDWR,file,line);
 #else
-    erts_lc_lock_flg(&rwmtx->lc, ERTS_LC_FLG_LO_READ_WRITE);
+    erts_lc_lock_flg(&rwmtx->lc, ERTS_LOCK_OPTIONS_RDWR);
 #endif
 #endif
 #ifdef ERTS_ENABLE_LOCK_COUNT
@@ -2619,7 +2620,7 @@ erts_rwmtx_rwunlock(erts_rwmtx_t *rwmtx)
 {
 #ifdef USE_THREADS
 #ifdef ERTS_ENABLE_LOCK_CHECK
-    erts_lc_unlock_flg(&rwmtx->lc, ERTS_LC_FLG_LO_READ_WRITE);
+    erts_lc_unlock_flg(&rwmtx->lc, ERTS_LOCK_OPTIONS_RDWR);
 #endif
 #ifdef ERTS_ENABLE_LOCK_COUNT
     erts_lcnt_unlock_opt(&rwmtx->lcnt, ERTS_LOCK_OPTIONS_RDWR);
@@ -2660,7 +2661,8 @@ erts_lc_rwmtx_is_rlocked(erts_rwmtx_t *mtx)
 #if defined(USE_THREADS) && defined(ERTS_ENABLE_LOCK_CHECK)
     int res;
     erts_lc_lock_t lc = mtx->lc;
-    lc.flags = ERTS_LC_FLG_LO_READ;
+    lc.flags = ERTS_LOCK_TYPE_RWMUTEX;
+    lc.taken_options = ERTS_LOCK_OPTIONS_READ;
     erts_lc_have_locks(&res, &lc, 1);
     return res;
 #else
@@ -2674,7 +2676,8 @@ erts_lc_rwmtx_is_rwlocked(erts_rwmtx_t *mtx)
 #if defined(USE_THREADS) && defined(ERTS_ENABLE_LOCK_CHECK)
     int res;
     erts_lc_lock_t lc = mtx->lc;
-    lc.flags = ERTS_LC_FLG_LO_READ|ERTS_LC_FLG_LO_WRITE;
+    lc.flags = ERTS_LOCK_TYPE_RWMUTEX;
+    lc.taken_options = ERTS_LOCK_OPTIONS_RDWR;
     erts_lc_have_locks(&res, &lc, 1);
     return res;
 #else
@@ -3021,7 +3024,7 @@ erts_spinlock_init(erts_spinlock_t *lock, char *name, Eterm extra, erts_lock_fla
 #endif
 
 #ifdef ERTS_ENABLE_LOCK_CHECK
-    erts_lc_init_lock_x(&lock->lc, name, ERTS_LC_FLG_LT_SPINLOCK, extra);
+    erts_lc_init_lock_x(&lock->lc, name, flags, extra);
 #endif
 #ifdef ERTS_ENABLE_LOCK_COUNT
     erts_lcnt_init_ref_x(&lock->lcnt, name, extra, flags);
@@ -3109,7 +3112,8 @@ erts_lc_spinlock_is_locked(erts_spinlock_t *lock)
 #if defined(USE_THREADS) && defined(ERTS_ENABLE_LOCK_CHECK)
     int res;
     erts_lc_lock_t lc = lock->lc;
-    lc.flags = 0;
+    lc.flags = ERTS_LOCK_TYPE_SPINLOCK;
+    lc.taken_options = 0;
     erts_lc_have_locks(&res, &lc, 1);
     return res;
 #else
@@ -3134,7 +3138,7 @@ erts_rwlock_init(erts_rwlock_t *lock, char *name, Eterm extra, erts_lock_flags_t
 #endif
 
 #ifdef ERTS_ENABLE_LOCK_CHECK
-    erts_lc_init_lock_x(&lock->lc, name, ERTS_LC_FLG_LT_RWSPINLOCK, extra);
+    erts_lc_init_lock_x(&lock->lc, name, flags, extra);
 #endif
 #ifdef ERTS_ENABLE_LOCK_COUNT
     erts_lcnt_init_ref_x(&lock->lcnt, name, extra, flags);
@@ -3178,7 +3182,7 @@ erts_read_unlock(erts_rwlock_t *lock)
 {
 #ifdef USE_THREADS
 #ifdef ERTS_ENABLE_LOCK_CHECK
-    erts_lc_unlock_flg(&lock->lc, ERTS_LC_FLG_LO_READ);
+    erts_lc_unlock_flg(&lock->lc, ERTS_LOCK_OPTIONS_READ);
 #endif
 #ifdef ERTS_ENABLE_LOCK_COUNT
     erts_lcnt_unlock_opt(&lock->lcnt, ERTS_LOCK_OPTIONS_READ);
@@ -3199,9 +3203,9 @@ erts_read_lock(erts_rwlock_t *lock)
 #ifdef USE_THREADS
 #ifdef ERTS_ENABLE_LOCK_CHECK
 #ifdef ERTS_ENABLE_LOCK_POSITION
-    erts_lc_lock_flg_x(&lock->lc, ERTS_LC_FLG_LO_READ,file,line);
+    erts_lc_lock_flg_x(&lock->lc, ERTS_LOCK_OPTIONS_READ,file,line);
 #else
-    erts_lc_lock_flg(&lock->lc, ERTS_LC_FLG_LO_READ);
+    erts_lc_lock_flg(&lock->lc, ERTS_LOCK_OPTIONS_READ);
 #endif
 #endif
 #ifdef ERTS_ENABLE_LOCK_COUNT
@@ -3221,7 +3225,7 @@ erts_write_unlock(erts_rwlock_t *lock)
 {
 #ifdef USE_THREADS
 #ifdef ERTS_ENABLE_LOCK_CHECK
-    erts_lc_unlock_flg(&lock->lc, ERTS_LC_FLG_LO_READ_WRITE);
+    erts_lc_unlock_flg(&lock->lc, ERTS_LOCK_OPTIONS_RDWR);
 #endif
 #ifdef ERTS_ENABLE_LOCK_COUNT
     erts_lcnt_unlock_opt(&lock->lcnt, ERTS_LOCK_OPTIONS_RDWR);
@@ -3242,9 +3246,9 @@ erts_write_lock(erts_rwlock_t *lock)
 #ifdef USE_THREADS
 #ifdef ERTS_ENABLE_LOCK_CHECK
 #ifdef ERTS_ENABLE_LOCK_POSITION
-    erts_lc_lock_flg_x(&lock->lc, ERTS_LC_FLG_LO_READ_WRITE,file,line);
+    erts_lc_lock_flg_x(&lock->lc, ERTS_LOCK_OPTIONS_RDWR,file,line);
 #else
-    erts_lc_lock_flg(&lock->lc, ERTS_LC_FLG_LO_READ_WRITE);
+    erts_lc_lock_flg(&lock->lc, ERTS_LOCK_OPTIONS_RDWR);
 #endif
 #endif
 #ifdef ERTS_ENABLE_LOCK_COUNT
@@ -3265,7 +3269,8 @@ erts_lc_rwlock_is_rlocked(erts_rwlock_t *lock)
 #if defined(USE_THREADS) && defined(ERTS_ENABLE_LOCK_CHECK)
     int res;
     erts_lc_lock_t lc = lock->lc;
-    lc.flags = ERTS_LC_FLG_LO_READ;
+    lc.flags = ERTS_LOCK_TYPE_RWSPINLOCK;
+    lc.taken_options = ERTS_LOCK_OPTIONS_READ;
     erts_lc_have_locks(&res, &lc, 1);
     return res;
 #else
@@ -3279,7 +3284,8 @@ erts_lc_rwlock_is_rwlocked(erts_rwlock_t *lock)
 #if defined(USE_THREADS) && defined(ERTS_ENABLE_LOCK_CHECK)
     int res;
     erts_lc_lock_t lc = lock->lc;
-    lc.flags = ERTS_LC_FLG_LO_READ|ERTS_LC_FLG_LO_WRITE;
+    lc.flags = ERTS_LOCK_TYPE_RWSPINLOCK;
+    lc.taken_options = ERTS_LOCK_OPTIONS_RDWR;
     erts_lc_have_locks(&res, &lc, 1);
     return res;
 #else
-- 
cgit v1.2.3