0,0 → 1,38 |
#include <linux/kref.h> |
#include <asm/atomic.h> |
|
|
void kref_set(struct kref *kref, int num) |
{ |
atomic_set(&kref->refcount, num); |
} |
|
/** |
* kref_init - initialize object. |
* @kref: object in question. |
*/ |
void kref_init(struct kref *kref) |
{ |
kref_set(kref, 1); |
} |
|
void kref_get(struct kref *kref) |
{ |
// WARN_ON(!atomic_read(&kref->refcount)); |
atomic_inc(&kref->refcount); |
} |
|
|
int kref_put(struct kref *kref, void (*release)(struct kref *kref)) |
{ |
// WARN_ON(release == NULL); |
// WARN_ON(release == (void (*)(struct kref *))kfree); |
|
if (atomic_dec_and_test(&kref->refcount)) { |
release(kref); |
return 1; |
} |
return 0; |
} |
|
|