diff options
author | jake <jake@FreeBSD.org> | 2000-12-18 05:50:31 +0000 |
---|---|---|
committer | jake <jake@FreeBSD.org> | 2000-12-18 05:50:31 +0000 |
commit | e1570afa9a5b21872cf12819e7361b9f54f62c6e (patch) | |
tree | 18303462a011700ea29bb367e53ea581e050aa9e /sys | |
parent | e71af642aac014ca1f7ef950ca84ba9d19c66708 (diff) | |
download | FreeBSD-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.h | 22 | ||||
-rw-r--r-- | sys/sys/lockmgr.h | 22 |
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; |