Skip site navigation (1)Skip section navigation (2)
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>