rwlock(9) and mutex(9) definitions
Date: Wed, 27 Oct 2021 01:52:21 UTC
Hi, [To: list constructed with help of git blame] despite manual pages describe locking functions as voids in reality some of them (not all) are preprocessor defines wrapped in "do {} while (0)". Such wraps don't really behave as a true void. For example you can not tail call them: void smartass_lock(lock, clue) { if (clue) return (rw_rlock(lock)); else return (rw_wlock(lock)); } This will fail on rw_wlock, but not on rw_rlock. However, if you have WITNESS it will compile correctly :) So, we need either make these function "static inline void" in mtx.h and rwlock.h, or wrap them in __extension__ ({ }). Btw, the latter is already done for mtx_trylock_spin() by kib in 90b581f2cc327. Of course for try-lock functions inability of tail call is a bigger issue then for voids. However, voids should be fixed as well, I believe. Your call? "static inline" or "__extension__ ({ })"? -- Gleb Smirnoff