Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
kref.h
Go to the documentation of this file.
1 /*
2  * kref.h - library routines for handling generic reference counted objects
3  *
4  * Copyright (C) 2004 Greg Kroah-Hartman <[email protected]>
5  * Copyright (C) 2004 IBM Corp.
6  *
7  * based on kobject.h which was:
8  * Copyright (C) 2002-2003 Patrick Mochel <[email protected]>
9  * Copyright (C) 2002-2003 Open Source Development Labs
10  *
11  * This file is released under the GPLv2.
12  *
13  */
14 
15 #ifndef _KREF_H_
16 #define _KREF_H_
17 
18 #include <linux/bug.h>
19 #include <linux/atomic.h>
20 #include <linux/kernel.h>
21 #include <linux/mutex.h>
22 
23 struct kref {
25 };
26 
31 static inline void kref_init(struct kref *kref)
32 {
33  atomic_set(&kref->refcount, 1);
34 }
35 
40 static inline void kref_get(struct kref *kref)
41 {
42  WARN_ON(!atomic_read(&kref->refcount));
43  atomic_inc(&kref->refcount);
44 }
45 
64 static inline int kref_sub(struct kref *kref, unsigned int count,
65  void (*release)(struct kref *kref))
66 {
67  WARN_ON(release == NULL);
68 
69  if (atomic_sub_and_test((int) count, &kref->refcount)) {
70  release(kref);
71  return 1;
72  }
73  return 0;
74 }
75 
93 static inline int kref_put(struct kref *kref, void (*release)(struct kref *kref))
94 {
95  return kref_sub(kref, 1, release);
96 }
97 
98 static inline int kref_put_mutex(struct kref *kref,
99  void (*release)(struct kref *kref),
100  struct mutex *lock)
101 {
102  WARN_ON(release == NULL);
103  if (unlikely(!atomic_add_unless(&kref->refcount, -1, 1))) {
104  mutex_lock(lock);
105  if (unlikely(!atomic_dec_and_test(&kref->refcount))) {
106  mutex_unlock(lock);
107  return 0;
108  }
109  release(kref);
110  return 1;
111  }
112  return 0;
113 }
114 #endif /* _KREF_H_ */