Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
linux
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
{
24
atomic_t
refcount
;
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_ */
Generated on Thu Jan 10 2013 14:51:45 for Linux Kernel by
1.8.2