Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 25 Oct 2014 12:04:07 -0700
From:      John-Mark Gurney <jmg@funkthat.com>
To:        Mateusz Guzik <mjguzik@gmail.com>
Cc:        freebsd-arch@freebsd.org
Subject:   Re: refcount_release_take_##lock
Message-ID:  <20141025190407.GU82214@funkthat.com>
In-Reply-To: <20141025184448.GA19066@dft-labs.eu>
References:  <20141025184448.GA19066@dft-labs.eu>

next in thread | previous in thread | raw e-mail | index | archive | help
Mateusz Guzik wrote this message on Sat, Oct 25, 2014 at 20:44 +0200:
> The following idiom is used here and there:
> 
> int old;
> old = obj->ref;
> if (old > 1 && atomic_cmpset_int(&obj->ref, old, old -1))
> 	return;
> lock(&something);
> if (refcount_release(&obj->ref) == 0) {
> 	unlock(&something);
> 	return;
> }
> free up
> unlock(&something);
> 
> ==========

Couldn't this be better written as:
if (__predict_false(refcount_release(&obj->ref) == 0)) {
	lock(&something);
	if (__predict_true(!obj->ref)) {
		free up
	}
	unlock(&something);
}

The reason I'm asking is that I changed how IPsec SA ref counting was
handled, and used something similar...

My code gets rid of a branch, and is better in that it uses refcount
API properly, instead of using atomic_cmpset_int...

> I decided to implement it as a common function.
> 
> We have only refcount.h and I didn't want to bloat all including code
> with additional definitions and as such I came up with a macro that has
> to be used in .c file and that will define appropriate inline func.
> 
> I'm definitely looking for better names for REFCOUNT_RELEASE_TAKE_USE_
> macro, assuming it has to stay.

You could shorten it to REFCNT_REL_TAKE_

> Comments?

Will you update the refcount(9) man page w/ documentation before
committing?

-- 
  John-Mark Gurney				Voice: +1 415 225 5579

     "All that I will do, has been done, All that I have, has not."



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20141025190407.GU82214>