From d3062e61c20ef5f66cb9ee88b69b0bddb7fb68c2 Mon Sep 17 00:00:00 2001
From: Tim Wickberg <tim@schedmd.com>
Date: Wed, 5 Apr 2017 20:18:16 -0400
Subject: [PATCH] Add verify_lock() function.

Allows for annotations such as
xassert(verify_lock(CONFIG_LOCK, READ_LOCK));
to ensure that the calling thread has the correct locks in
place to head off potential race conditions / corruption.
---
 src/slurmctld/locks.c | 5 +++++
 src/slurmctld/locks.h | 6 ++++++
 2 files changed, 11 insertions(+)

diff --git a/src/slurmctld/locks.c b/src/slurmctld/locks.c
index 70a4012097e..80a5d1251fb 100644
--- a/src/slurmctld/locks.c
+++ b/src/slurmctld/locks.c
@@ -102,6 +102,11 @@ static bool _clear_locks(slurmctld_lock_t lock_levels)
 
 	return true;
 }
+
+extern bool verify_lock(lock_datatype_t datatype, lock_level_t level)
+{
+	return (((lock_level_t *) &thread_locks)[datatype] >= level);
+}
 #endif
 
 /* init_locks - create locks used for slurmctld data structure access
diff --git a/src/slurmctld/locks.h b/src/slurmctld/locks.h
index 443cda3a6e8..1cf4d0479bc 100644
--- a/src/slurmctld/locks.h
+++ b/src/slurmctld/locks.h
@@ -91,6 +91,8 @@
 #ifndef _SLURMCTLD_LOCKS_H
 #define _SLURMCTLD_LOCKS_H
 
+#include <stdbool.h>
+
 /* levels of locking required for each data structure */
 typedef enum {
 	NO_LOCK,
@@ -125,6 +127,10 @@ typedef enum {
 	ENTITY_COUNT
 }	lock_datatype_t;
 
+#ifndef NDEBUG
+extern bool verify_lock(lock_datatype_t datatype, lock_level_t level);
+#endif
+
 #define read_lock(data_type)		(data_type * 4 + 0)
 #define write_lock(data_type)		(data_type * 4 + 1)
 #define write_wait_lock(data_type)	(data_type * 4 + 2)
-- 
GitLab