23
23
****************************************************************************/
24
24
25
25
#include <nuttx/rwsem.h>
26
+ #include <nuttx/irq.h>
27
+ #include <assert.h>
28
+
29
+ /****************************************************************************
30
+ * Pre-processor Definitions
31
+ ****************************************************************************/
32
+
33
+ #undef spin_lock_irqsave
34
+ #undef spin_unlock_irqrestore
35
+
36
+ #if !defined(CONFIG_SPINLOCK ) || !defined(CONFIG_SMP )
37
+ #define spin_lock_irqsave (lock ) up_irq_save()
38
+ #define spin_unlock_irqrestore (lock , flags ) up_irq_restore(flags)
39
+ #endif
26
40
27
41
/****************************************************************************
28
42
* Private Functions
@@ -61,11 +75,11 @@ static inline void up_wait(FAR rw_semaphore_t *rwsem)
61
75
62
76
int down_read_trylock (FAR rw_semaphore_t * rwsem )
63
77
{
64
- nxmutex_lock (& rwsem -> protected );
78
+ irqstate_t flags = spin_lock_irqsave (& rwsem -> protected );
65
79
66
80
if (rwsem -> writer > 0 )
67
81
{
68
- nxmutex_unlock (& rwsem -> protected );
82
+ spin_unlock_irqrestore (& rwsem -> protected , flags );
69
83
return 0 ;
70
84
}
71
85
@@ -75,7 +89,7 @@ int down_read_trylock(FAR rw_semaphore_t *rwsem)
75
89
76
90
rwsem -> reader ++ ;
77
91
78
- nxmutex_unlock (& rwsem -> protected );
92
+ spin_unlock_irqrestore (& rwsem -> protected , flags );
79
93
80
94
return 1 ;
81
95
}
@@ -97,14 +111,14 @@ void down_read(FAR rw_semaphore_t *rwsem)
97
111
* block and wait for the write-lock to be unlocked.
98
112
*/
99
113
100
- nxmutex_lock (& rwsem -> protected );
114
+ irqstate_t flags = spin_lock_irqsave (& rwsem -> protected );
101
115
102
116
while (rwsem -> writer > 0 )
103
117
{
104
118
rwsem -> waiter ++ ;
105
- nxmutex_unlock (& rwsem -> protected );
119
+ spin_unlock_irqrestore (& rwsem -> protected , flags );
106
120
nxsem_wait (& rwsem -> waiting );
107
- nxmutex_lock (& rwsem -> protected );
121
+ flags = spin_lock_irqsave (& rwsem -> protected );
108
122
rwsem -> waiter -- ;
109
123
}
110
124
@@ -114,7 +128,7 @@ void down_read(FAR rw_semaphore_t *rwsem)
114
128
115
129
rwsem -> reader ++ ;
116
130
117
- nxmutex_unlock (& rwsem -> protected );
131
+ spin_unlock_irqrestore (& rwsem -> protected , flags );
118
132
}
119
133
120
134
/****************************************************************************
@@ -130,7 +144,7 @@ void down_read(FAR rw_semaphore_t *rwsem)
130
144
131
145
void up_read (FAR rw_semaphore_t * rwsem )
132
146
{
133
- nxmutex_lock (& rwsem -> protected );
147
+ irqstate_t flags = spin_lock_irqsave (& rwsem -> protected );
134
148
135
149
DEBUGASSERT (rwsem -> reader > 0 );
136
150
@@ -141,7 +155,7 @@ void up_read(FAR rw_semaphore_t *rwsem)
141
155
up_wait (rwsem );
142
156
}
143
157
144
- nxmutex_unlock (& rwsem -> protected );
158
+ spin_unlock_irqrestore (& rwsem -> protected , flags );
145
159
}
146
160
147
161
/****************************************************************************
@@ -160,19 +174,19 @@ void up_read(FAR rw_semaphore_t *rwsem)
160
174
161
175
int down_write_trylock (FAR rw_semaphore_t * rwsem )
162
176
{
163
- nxmutex_lock (& rwsem -> protected );
177
+ irqstate_t flags = spin_lock_irqsave (& rwsem -> protected );
164
178
165
179
if (rwsem -> writer > 0 || rwsem -> reader > 0 )
166
180
{
167
- nxmutex_unlock (& rwsem -> protected );
181
+ spin_unlock_irqrestore (& rwsem -> protected , flags );
168
182
return 0 ;
169
183
}
170
184
171
185
/* The check passes, then we just need the writer reference + 1 */
172
186
173
187
rwsem -> writer ++ ;
174
188
175
- nxmutex_unlock (& rwsem -> protected );
189
+ spin_unlock_irqrestore (& rwsem -> protected , flags );
176
190
177
191
return 1 ;
178
192
}
@@ -190,22 +204,22 @@ int down_write_trylock(FAR rw_semaphore_t *rwsem)
190
204
191
205
void down_write (FAR rw_semaphore_t * rwsem )
192
206
{
193
- nxmutex_lock (& rwsem -> protected );
207
+ irqstate_t flags = spin_lock_irqsave (& rwsem -> protected );
194
208
195
209
while (rwsem -> reader > 0 || rwsem -> writer > 0 )
196
210
{
197
211
rwsem -> waiter ++ ;
198
- nxmutex_unlock (& rwsem -> protected );
212
+ spin_unlock_irqrestore (& rwsem -> protected , flags );
199
213
nxsem_wait (& rwsem -> waiting );
200
- nxmutex_lock (& rwsem -> protected );
214
+ flags = spin_lock_irqsave (& rwsem -> protected );
201
215
rwsem -> waiter -- ;
202
216
}
203
217
204
218
/* The check passes, then we just need the writer reference + 1 */
205
219
206
220
rwsem -> writer ++ ;
207
221
208
- nxmutex_unlock (& rwsem -> protected );
222
+ spin_unlock_irqrestore (& rwsem -> protected , flags );
209
223
}
210
224
211
225
/****************************************************************************
@@ -221,15 +235,15 @@ void down_write(FAR rw_semaphore_t *rwsem)
221
235
222
236
void up_write (FAR rw_semaphore_t * rwsem )
223
237
{
224
- nxmutex_lock (& rwsem -> protected );
238
+ irqstate_t flags = spin_lock_irqsave (& rwsem -> protected );
225
239
226
240
DEBUGASSERT (rwsem -> writer > 0 );
227
241
228
242
rwsem -> writer -- ;
229
243
230
244
up_wait (rwsem );
231
245
232
- nxmutex_unlock (& rwsem -> protected );
246
+ spin_unlock_irqrestore (& rwsem -> protected , flags );
233
247
}
234
248
235
249
/****************************************************************************
@@ -253,16 +267,13 @@ int init_rwsem(FAR rw_semaphore_t *rwsem)
253
267
254
268
/* Initialize structure information */
255
269
256
- ret = nxmutex_init (& rwsem -> protected );
257
- if (ret < 0 )
258
- {
259
- return ret ;
260
- }
270
+ #ifdef CONFIG_SPINLOCK
271
+ spin_lock_init (& rwsem -> protected );
272
+ #endif
261
273
262
274
ret = nxsem_init (& rwsem -> waiting , 0 , 0 );
263
275
if (ret < 0 )
264
276
{
265
- nxmutex_destroy (& rwsem -> protected );
266
277
return ret ;
267
278
}
268
279
@@ -292,6 +303,5 @@ void destroy_rwsem(FAR rw_semaphore_t *rwsem)
292
303
DEBUGASSERT (rwsem -> waiter == 0 && rwsem -> reader == 0 &&
293
304
rwsem -> writer == 0 );
294
305
295
- nxmutex_destroy (& rwsem -> protected );
296
306
nxsem_destroy (& rwsem -> waiting );
297
307
}
0 commit comments