From 8b5fb980d1a31b4a61ba33a960c098c98f14d1a3 Mon Sep 17 00:00:00 2001 From: Jake Burkholder Date: Mon, 18 Dec 2000 05:50:31 +0000 Subject: [PATCH] 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. --- sys/sys/lock.h | 22 ++++++++++++++++++++++ sys/sys/lockmgr.h | 22 ++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/sys/sys/lock.h b/sys/sys/lock.h index a797a721589..53e9f4c45d8 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 a797a721589..53e9f4c45d8 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;