DragonFly BSD
DragonFly kernel List (threaded) for 2010-12
[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]

Re: Super Light Weight Reference counting


From: Venkatesh Srinivas <me@xxxxxxxxxxxxxxxxxxx>
Date: Tue, 21 Dec 2010 13:02:20 -0500

Hi,

Just an updated proposal, it seems that it'd be better to remove the
priv pointer from the reference structure entirely:
ref.h :============
struct kref {
	int		refcount;
};

void kref_init(struct kref *ref, int count);
void kref_inc(struct kref *ref);
void kref_dec(struct kref *ref, void (*deconstruct)(void*, void*),
	      void *priv1, void *priv2);


kern_ref.c :==============
#include <sys/atomic.h>

void
kref_init(struct kref *ref, int count)
{
        ref->refcount = count;
}

void
kref_inc(struct kref *ref)
{
        atomic_add_int(&ref->refcount, 1);
}

void
kref_dec(struct kref *ref, void (*deconstruct)(void *, void *),
         void *priv1, void *priv2)
{
        int val;

        val = atomic_fetchadd_int(&ref->refcount, -1);
        if (val == 1)
                deconstruct(priv1, priv2);
}

=======================

You can now kref_dec(&buf->ref, kfree, buf, M_AWESOME); to use this to
kfree buffers, for example.

Thanks to Aggelos again for convincing me to remove the priv pointer entirely.
-- vs



[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]