Date: Tue, 26 Oct 2021 18:52:21 -0700 From: Gleb Smirnoff <glebius@freebsd.org> To: kib@freebsd.org, mjg@freebsd.org, jhb@freebsd.org, jeff@freebsd.org Cc: arch@freebsd.org Subject: rwlock(9) and mutex(9) definitions Message-ID: <YXiw1afVlQyEhQyc@FreeBSD.org>
next in thread | raw e-mail | index | archive | help
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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?YXiw1afVlQyEhQyc>