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