summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorjake <jake@FreeBSD.org>2000-12-18 05:50:31 +0000
committerjake <jake@FreeBSD.org>2000-12-18 05:50:31 +0000
commite1570afa9a5b21872cf12819e7361b9f54f62c6e (patch)
tree18303462a011700ea29bb367e53ea581e050aa9e /sys
parente71af642aac014ca1f7ef950ca84ba9d19c66708 (diff)
downloadFreeBSD-src-e1570afa9a5b21872cf12819e7361b9f54f62c6e.zip
FreeBSD-src-e1570afa9a5b21872cf12819e7361b9f54f62c6e.tar.gz
Add an assertion macro for lockmgr locks, LOCKMGR_ASSERT(lkp, what, p).
The what argument is the hold type that assertion acts on. LK_SHARED to assert that the process holds a shared, LK_EXCLUSIVE to assert that the process holds _either_ a shared lock or an exclusive lock.
Diffstat (limited to 'sys')
-rw-r--r--sys/sys/lock.h22
-rw-r--r--sys/sys/lockmgr.h22
2 files changed, 44 insertions, 0 deletions
diff --git a/sys/sys/lock.h b/sys/sys/lock.h
index a797a72..53e9f4c 100644
--- a/sys/sys/lock.h
+++ b/sys/sys/lock.h
@@ -175,6 +175,28 @@ struct lock {
#define LK_KERNPROC ((pid_t) -2)
#define LK_NOPROC ((pid_t) -1)
+#ifdef INVARIANTS
+#define LOCKMGR_ASSERT(lkp, what, p) do { \
+ switch ((what)) { \
+ case LK_SHARED: \
+ if (lockstatus((lkp), (p)) == LK_SHARED) \
+ break; \
+ /* fall into exclusive */ \
+ case LK_EXCLUSIVE: \
+ if (lockstatus((lkp), (p)) != LK_EXCLUSIVE) \
+ panic("lock %s %s not held at %s:%d", \
+ (lkp)->lk_wmesg, #what, __FILE__, \
+ __LINE__); \
+ break; \
+ default: \
+ panic("unknown LOCKMGR_ASSERT at %s:%d", __FILE__, \
+ __LINE__); \
+ } \
+} while (0)
+#else /* INVARIANTS */
+#define LOCKMGR_ASSERT(lkp, p, what)
+#endif /* INVARIANTS */
+
void dumplockinfo(struct lock *lkp);
struct proc;
diff --git a/sys/sys/lockmgr.h b/sys/sys/lockmgr.h
index a797a72..53e9f4c 100644
--- a/sys/sys/lockmgr.h
+++ b/sys/sys/lockmgr.h
@@ -175,6 +175,28 @@ struct lock {
#define LK_KERNPROC ((pid_t) -2)
#define LK_NOPROC ((pid_t) -1)
+#ifdef INVARIANTS
+#define LOCKMGR_ASSERT(lkp, what, p) do { \
+ switch ((what)) { \
+ case LK_SHARED: \
+ if (lockstatus((lkp), (p)) == LK_SHARED) \
+ break; \
+ /* fall into exclusive */ \
+ case LK_EXCLUSIVE: \
+ if (lockstatus((lkp), (p)) != LK_EXCLUSIVE) \
+ panic("lock %s %s not held at %s:%d", \
+ (lkp)->lk_wmesg, #what, __FILE__, \
+ __LINE__); \
+ break; \
+ default: \
+ panic("unknown LOCKMGR_ASSERT at %s:%d", __FILE__, \
+ __LINE__); \
+ } \
+} while (0)
+#else /* INVARIANTS */
+#define LOCKMGR_ASSERT(lkp, p, what)
+#endif /* INVARIANTS */
+
void dumplockinfo(struct lock *lkp);
struct proc;
OpenPOWER on IntegriCloud