DPDK
18.05.1
Main Page
Related Pages
Data Structures
Files
Examples
File List
Globals
lib
librte_eal
common
include
generic
rte_rwlock.h
Go to the documentation of this file.
1
/* SPDX-License-Identifier: BSD-3-Clause
2
* Copyright(c) 2010-2014 Intel Corporation
3
*/
4
5
#ifndef _RTE_RWLOCK_H_
6
#define _RTE_RWLOCK_H_
7
20
#ifdef __cplusplus
21
extern
"C"
{
22
#endif
23
24
#include <
rte_common.h
>
25
#include <
rte_atomic.h
>
26
#include <
rte_pause.h
>
27
33
typedef
struct
{
34
volatile
int32_t
cnt
;
35
}
rte_rwlock_t
;
36
40
#define RTE_RWLOCK_INITIALIZER { 0 }
41
48
static
inline
void
49
rte_rwlock_init
(
rte_rwlock_t
*rwl)
50
{
51
rwl->
cnt
= 0;
52
}
53
60
static
inline
void
61
rte_rwlock_read_lock
(
rte_rwlock_t
*rwl)
62
{
63
int32_t x;
64
int
success = 0;
65
66
while
(success == 0) {
67
x = rwl->
cnt
;
68
/* write lock is held */
69
if
(x < 0) {
70
rte_pause
();
71
continue
;
72
}
73
success =
rte_atomic32_cmpset
((
volatile
uint32_t *)&rwl->
cnt
,
74
(uint32_t)x, (uint32_t)(x + 1));
75
}
76
}
77
84
static
inline
void
85
rte_rwlock_read_unlock
(
rte_rwlock_t
*rwl)
86
{
87
rte_atomic32_dec
((
rte_atomic32_t
*)(intptr_t)&rwl->
cnt
);
88
}
89
96
static
inline
void
97
rte_rwlock_write_lock
(
rte_rwlock_t
*rwl)
98
{
99
int32_t x;
100
int
success = 0;
101
102
while
(success == 0) {
103
x = rwl->
cnt
;
104
/* a lock is held */
105
if
(x != 0) {
106
rte_pause
();
107
continue
;
108
}
109
success =
rte_atomic32_cmpset
((
volatile
uint32_t *)&rwl->
cnt
,
110
0, (uint32_t)-1);
111
}
112
}
113
120
static
inline
void
121
rte_rwlock_write_unlock
(
rte_rwlock_t
*rwl)
122
{
123
rte_atomic32_inc
((
rte_atomic32_t
*)(intptr_t)&rwl->
cnt
);
124
}
125
139
static
inline
void
140
rte_rwlock_read_lock_tm
(
rte_rwlock_t
*rwl);
141
148
static
inline
void
149
rte_rwlock_read_unlock_tm
(
rte_rwlock_t
*rwl);
150
164
static
inline
void
165
rte_rwlock_write_lock_tm
(
rte_rwlock_t
*rwl);
166
173
static
inline
void
174
rte_rwlock_write_unlock_tm
(
rte_rwlock_t
*rwl);
175
176
#ifdef __cplusplus
177
}
178
#endif
179
180
#endif
/* _RTE_RWLOCK_H_ */
Generated by
1.8.1.2