cvs commit: src/sys/kern kern_proc.c

Julian Elischer julian at elischer.org
Wed Jun 9 19:00:43 GMT 2004



On Wed, 9 Jun 2004, Pawel Jakub Dawidek wrote:

> On Wed, Jun 09, 2004 at 11:23:48AM -0700, Julian Elischer wrote:
> +> I do actually agree that a general purpose reference counting 
> +> API is very difficult to use in every situation and that there 
> +> are situations where you just HAVE to roll your own..
> 
> Maybe we can use macros to do this, something like:
> 
> #define	REFCNT_MTX(foo, prefix, type, mtx_field, refcnt_field, destroy_func) \
> foo void								\
> prefix ## _hold(type *obj)						\
> {									\
> 									\
> 	mtx_lock(&obj->mtx_field);					\
> 	obj->refcnt_field++;						\
> 	mtx_unlock(&obj->mtx_field);					\
> }									\
> 									\
> foo void								\
> prefix ## _free(type *obj)						\
> {									\
> 	int refcnt;							\
> 									\
> 	mtx_lock(&obj->mtx_field);					\
> 	refcnt = --obj->refcnt_field;					\
> 	mtx_unlock(&obj->mtx_field);					\
> 	if (refcnt == 0)						\
> 		destroy_func(obj);					\
> }
> 
> And the same for REFCNT_ATOMIC() and REFCNT_SPIN()?
> 'foo' could be for example 'static' or 'static __inline'.


I certainly agree that there is the possibility that there may need to
be several kinds of refcounts..

there are also examples where several operations need to be done
"atomically" but only one of those operations is the reference count.
Such cases need a lock to be held anyhow. (or a critical section or 
something)
For these sorts of things plain increments and decrements would
suffice.

As I mentionned before, it is also tricky how one handles 
the freeing of a reference to an object 
when you are in some spinlock'd region or an interrupt handler..

These various cases may require reference counts of different types.




More information about the freebsd-arch mailing list