Super Light Weight Reference counting
Venkatesh Srinivas
me at endeavour.zapto.org
Tue Dec 21 10:04:50 PST 2010
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
More information about the Kernel
mailing list