Date: Wed, 29 Jul 2009 08:02:27 +0100 (BST) From: Robert Watson <rwatson@FreeBSD.org> To: Randall Stewart <rrs@lakerest.net> Cc: svn-src-head@FreeBSD.org, svn-src-all@FreeBSD.org, src-committers@FreeBSD.org, Pawel Jakub Dawidek <pjd@FreeBSD.org> Subject: Re: svn commit: r195918 - head/sys/netinet Message-ID: <alpine.BSF.2.00.0907290735170.17344@fledge.watson.org> In-Reply-To: <354E0657-DC37-4493-8E17-D09B257B5A28@lakerest.net> References: <200907281409.n6SE971u034585@svn.freebsd.org> <20090729051016.GB3550@garage.freebsd.pl> <354E0657-DC37-4493-8E17-D09B257B5A28@lakerest.net>
index | next in thread | previous in thread | raw e-mail
On Wed, 29 Jul 2009, Randall Stewart wrote:
>> Instead of using additional argument to the sctp_add_to_readq() function,
>> wouldn't it be sufficient to just check with mtx_owned(9) if the lock is
>> already held?
>
> Hmm... I suppose one could go that way... but traditionally upper code as
> told the lower code that it holds/does not hold the lock. This is true in
> quite a few other functions...
Structures of the form:
if (mtx_owned(&mtx))
mtx_unlock(&mtx);
Strike me as less robust than code with either fixed assertions about lock
state from the caller, or code that accepts a flag that in effect leads to two
variants each with fixed state that can be asserted. I.e.,
void
foo(void *obj)
{
OBJ_LOCK_ASSERT(obj);
...
}
or:
void
foo(void *obj, int arg_locked)
{
if (arg_locked)
OBJ_LOCK_ASSERT(obj);
else
OBJ_LOCK(obj);
...
if (!arg_locked)
OBJ_UNLOCK(obj);
}
I guess I'm sort of OK with structure but it smacks of poor code design:
void
foo(void *obj)
{
int locked;
if (OBJ_LOCK_OWNED(obj)) {
locked = 1;
OBJ_LOCK(obj);
} else
locked = 0;
...
if (locked)
OBJ_UNLOCK(obj);
}
However, this structure doesn't lend itself to moving to lock types that can't
cheaply support mtx_owned()-like operations, such as read acquisitions of
reader-writer locks.
Robert N M Watson
Computer Laboratory
University of Cambridge
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?alpine.BSF.2.00.0907290735170.17344>
