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
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]