Mutex and rwlock assertions turn into no-ops when compiling without
the DIAGNOSTIC option, which is the desired outcome. However, in some
peculiar cases, such as klist_mutex_assertlk() and klist_rwlock_assertlk(),
the lock variable insidiously becomes unused in the function. This could
be avoided if the non-DIAGNOSTIC assertions had builtin void casts of
the macro parameter. The compiler should optimize away any resulting
side-effect-free code.

OK?

Index: arch/hppa/include/mutex.h
===================================================================
RCS file: src/sys/arch/hppa/include/mutex.h,v
retrieving revision 1.9
diff -u -p -r1.9 mutex.h
--- arch/hppa/include/mutex.h   13 Jan 2018 15:18:11 -0000      1.9
+++ arch/hppa/include/mutex.h   22 Oct 2021 12:17:55 -0000
@@ -83,8 +83,8 @@ void __mtx_init(struct mutex *, int);
                panic("mutex %p held in %s", (mtx), __func__);          \
 } while (0)
 #else
-#define MUTEX_ASSERT_LOCKED(mtx) do { } while (0)
-#define MUTEX_ASSERT_UNLOCKED(mtx) do { } while (0)
+#define MUTEX_ASSERT_LOCKED(mtx) ((void)(mtx))
+#define MUTEX_ASSERT_UNLOCKED(mtx) ((void)(mtx))
 #endif
 
 #define MUTEX_LOCK_OBJECT(mtx) (&(mtx)->mtx_lock_obj)
Index: arch/m88k/include/mutex.h
===================================================================
RCS file: src/sys/arch/m88k/include/mutex.h,v
retrieving revision 1.8
diff -u -p -r1.8 mutex.h
--- arch/m88k/include/mutex.h   26 May 2020 11:55:10 -0000      1.8
+++ arch/m88k/include/mutex.h   22 Oct 2021 12:17:56 -0000
@@ -79,8 +79,8 @@ void __mtx_init(struct mutex *, int);
 
 #else
 
-#define        MUTEX_ASSERT_LOCKED(mtx)        do { /* nothing */ } while (0)
-#define        MUTEX_ASSERT_UNLOCKED(mtx)      do { /* nothing */ } while (0)
+#define        MUTEX_ASSERT_LOCKED(mtx)        ((void)(mtx))
+#define        MUTEX_ASSERT_UNLOCKED(mtx)      ((void)(mtx))
 
 #endif
 
Index: sys/mutex.h
===================================================================
RCS file: src/sys/sys/mutex.h,v
retrieving revision 1.18
diff -u -p -r1.18 mutex.h
--- sys/mutex.h 23 Apr 2019 13:35:12 -0000      1.18
+++ sys/mutex.h 22 Oct 2021 12:17:57 -0000
@@ -84,8 +84,8 @@ void __mtx_init(struct mutex *, int);
                panic("mutex %p held in %s", (mtx), __func__);          \
 } while (0)
 #else
-#define MUTEX_ASSERT_LOCKED(mtx) do { } while (0)
-#define MUTEX_ASSERT_UNLOCKED(mtx) do { } while (0)
+#define MUTEX_ASSERT_LOCKED(mtx) ((void)(mtx))
+#define MUTEX_ASSERT_UNLOCKED(mtx) ((void)(mtx))
 #endif
 
 #define MUTEX_LOCK_OBJECT(mtx) (&(mtx)->mtx_lock_obj)
Index: sys/rwlock.h
===================================================================
RCS file: src/sys/sys/rwlock.h,v
retrieving revision 1.28
diff -u -p -r1.28 rwlock.h
--- sys/rwlock.h        11 Jan 2021 18:49:38 -0000      1.28
+++ sys/rwlock.h        22 Oct 2021 12:17:57 -0000
@@ -158,10 +158,10 @@ void      rw_assert_rdlock(struct rwlock *);
 void   rw_assert_anylock(struct rwlock *);
 void   rw_assert_unlocked(struct rwlock *);
 #else
-#define rw_assert_wrlock(rwl)  ((void)0)
-#define rw_assert_rdlock(rwl)  ((void)0)
-#define rw_assert_anylock(rwl) ((void)0)
-#define rw_assert_unlocked(rwl)        ((void)0)
+#define rw_assert_wrlock(rwl)  ((void)(rwl))
+#define rw_assert_rdlock(rwl)  ((void)(rwl))
+#define rw_assert_anylock(rwl) ((void)(rwl))
+#define rw_assert_unlocked(rwl)        ((void)(rwl))
 #endif
 
 int    rw_enter(struct rwlock *, int);

Reply via email to