Whamcloud - gitweb
b=16098
[fs/lustre-release.git] / libcfs / libcfs / user-lock.c
1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=8:tabstop=8:
3  *
4  * GPL HEADER START
5  *
6  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 only,
10  * as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License version 2 for more details (a copy is included
16  * in the LICENSE file that accompanied this code).
17  *
18  * You should have received a copy of the GNU General Public License
19  * version 2 along with this program; If not, see
20  * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
21  *
22  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
23  * CA 95054 USA or visit www.sun.com if you need additional information or
24  * have any questions.
25  *
26  * GPL HEADER END
27  */
28 /*
29  * Copyright  2008 Sun Microsystems, Inc. All rights reserved
30  * Use is subject to license terms.
31  */
32 /*
33  * This file is part of Lustre, http://www.lustre.org/
34  * Lustre is a trademark of Sun Microsystems, Inc.
35  *
36  * libcfs/libcfs/user-lock.c
37  *
38  * Author: Nikita Danilov <nikita@clusterfs.com>
39  */
40
41 /* Implementations of portable synchronization APIs for liblustre */
42
43 /*
44  * liblustre is single-threaded, so most "synchronization" APIs are trivial.
45  *
46  * XXX Liang: There are several branches share lnet with b_hd_newconfig,
47  * if we define lock APIs at here, there will be conflict with liblustre
48  * in other branches.
49  */
50
51 #ifndef __KERNEL__
52
53 #include <libcfs/libcfs.h>
54
55 /*
56  * Optional debugging (magic stamping and checking ownership) can be added.
57  */
58
59 /*
60  * spin_lock
61  *
62  * - spin_lock_init(x)
63  * - spin_lock(x)
64  * - spin_unlock(x)
65  * - spin_trylock(x)
66  *
67  * - spin_lock_irqsave(x, f)
68  * - spin_unlock_irqrestore(x, f)
69  *
70  * No-op implementation.
71  */
72
73 void spin_lock_init(spinlock_t *lock)
74 {
75         LASSERT(lock != NULL);
76         (void)lock;
77 }
78
79 void spin_lock(spinlock_t *lock)
80 {
81         (void)lock;
82 }
83
84 void spin_unlock(spinlock_t *lock)
85 {
86         (void)lock;
87 }
88
89 int spin_trylock(spinlock_t *lock)
90 {
91         (void)lock;
92         return 1;
93 }
94
95 void spin_lock_bh_init(spinlock_t *lock)
96 {
97         LASSERT(lock != NULL);
98         (void)lock;
99 }
100
101 void spin_lock_bh(spinlock_t *lock)
102 {
103         LASSERT(lock != NULL);
104         (void)lock;
105 }
106
107 void spin_unlock_bh(spinlock_t *lock)
108 {
109         LASSERT(lock != NULL);
110         (void)lock;
111 }
112
113 /*
114  * Semaphore
115  *
116  * - sema_init(x, v)
117  * - __down(x)
118  * - __up(x)
119  */
120
121 void sema_init(struct semaphore *s, int val)
122 {
123         LASSERT(s != NULL);
124         (void)s;
125         (void)val;
126 }
127
128 void __down(struct semaphore *s)
129 {
130         LASSERT(s != NULL);
131         (void)s;
132 }
133
134 void __up(struct semaphore *s)
135 {
136         LASSERT(s != NULL);
137         (void)s;
138 }
139
140
141 /*
142  * Completion:
143  *
144  * - init_completion(c)
145  * - complete(c)
146  * - wait_for_completion(c)
147  */
148
149 void init_completion(struct completion *c)
150 {
151         LASSERT(c != NULL);
152         c->done = 0;
153         cfs_waitq_init(&c->wait);
154 }
155
156 void complete(struct completion *c)
157 {
158         LASSERT(c != NULL);
159         c->done  = 1;
160         cfs_waitq_signal(&c->wait);
161 }
162
163 void wait_for_completion(struct completion *c)
164 {
165         LASSERT(c != NULL);
166 }
167
168 /*
169  * rw_semaphore:
170  *
171  * - DECLARE_RWSEM(x)
172  * - init_rwsem(x)
173  * - down_read(x)
174  * - up_read(x)
175  * - down_write(x)
176  * - up_write(x)
177  */
178
179 void init_rwsem(struct rw_semaphore *s)
180 {
181         LASSERT(s != NULL);
182         (void)s;
183 }
184
185 void down_read(struct rw_semaphore *s)
186 {
187         LASSERT(s != NULL);
188         (void)s;
189 }
190
191 int down_read_trylock(struct rw_semaphore *s)
192 {
193         LASSERT(s != NULL);
194         (void)s;
195         return 1;
196 }
197
198 void down_write(struct rw_semaphore *s)
199 {
200         LASSERT(s != NULL);
201         (void)s;
202 }
203
204 int down_write_trylock(struct rw_semaphore *s)
205 {
206         LASSERT(s != NULL);
207         (void)s;
208         return 1;
209 }
210
211 void up_read(struct rw_semaphore *s)
212 {
213         LASSERT(s != NULL);
214         (void)s;
215 }
216
217 void up_write(struct rw_semaphore *s)
218 {
219         LASSERT(s != NULL);
220         (void)s;
221 }
222
223 #ifdef HAVE_LIBPTHREAD
224
225 /*
226  * Completion
227  */
228
229 void cfs_init_completion(struct cfs_completion *c)
230 {
231         LASSERT(c != NULL);
232         c->c_done = 0;
233         pthread_mutex_init(&c->c_mut, NULL);
234         pthread_cond_init(&c->c_cond, NULL);
235 }
236
237 void cfs_fini_completion(struct cfs_completion *c)
238 {
239         LASSERT(c != NULL);
240         pthread_mutex_destroy(&c->c_mut);
241         pthread_cond_destroy(&c->c_cond);
242 }
243
244 void cfs_complete(struct cfs_completion *c)
245 {
246         LASSERT(c != NULL);
247         pthread_mutex_lock(&c->c_mut);
248         c->c_done++;
249         pthread_cond_signal(&c->c_cond);
250         pthread_mutex_unlock(&c->c_mut);
251 }
252
253 void cfs_wait_for_completion(struct cfs_completion *c)
254 {
255         LASSERT(c != NULL);
256         pthread_mutex_lock(&c->c_mut);
257         while (c->c_done == 0)
258                 pthread_cond_wait(&c->c_cond, &c->c_mut);
259         c->c_done--;
260         pthread_mutex_unlock(&c->c_mut);
261 }
262
263 /*
264  * atomic primitives
265  */
266
267 static pthread_mutex_t atomic_guard_lock = PTHREAD_MUTEX_INITIALIZER;
268
269 int cfs_atomic_read(cfs_atomic_t *a)
270 {
271         int r;
272
273         pthread_mutex_lock(&atomic_guard_lock);
274         r = a->counter;
275         pthread_mutex_unlock(&atomic_guard_lock);
276         return r;
277 }
278
279 void cfs_atomic_set(cfs_atomic_t *a, int b)
280 {
281         pthread_mutex_lock(&atomic_guard_lock);
282         a->counter = b;
283         pthread_mutex_unlock(&atomic_guard_lock);
284 }
285
286 int cfs_atomic_dec_and_test(cfs_atomic_t *a)
287 {
288         int r;
289
290         pthread_mutex_lock(&atomic_guard_lock);
291         r = --a->counter;
292         pthread_mutex_unlock(&atomic_guard_lock);
293         return (r == 0);
294 }
295
296 void cfs_atomic_inc(cfs_atomic_t *a)
297 {
298         pthread_mutex_lock(&atomic_guard_lock);
299         ++a->counter;
300         pthread_mutex_unlock(&atomic_guard_lock);
301 }
302
303 void cfs_atomic_dec(cfs_atomic_t *a)
304 {
305         pthread_mutex_lock(&atomic_guard_lock);
306         --a->counter;
307         pthread_mutex_unlock(&atomic_guard_lock);
308 }
309 void cfs_atomic_add(int b, cfs_atomic_t *a)
310
311 {
312         pthread_mutex_lock(&atomic_guard_lock);
313         a->counter += b;
314         pthread_mutex_unlock(&atomic_guard_lock);
315 }
316
317 void cfs_atomic_sub(int b, cfs_atomic_t *a)
318 {
319         pthread_mutex_lock(&atomic_guard_lock);
320         a->counter -= b;
321         pthread_mutex_unlock(&atomic_guard_lock);
322 }
323
324 #endif /* HAVE_LIBPTHREAD */
325
326
327 /* !__KERNEL__ */
328 #endif
329
330 /*
331  * Local variables:
332  * c-indentation-style: "K&R"
333  * c-basic-offset: 8
334  * tab-width: 8
335  * fill-column: 80
336  * scroll-step: 1
337  * End:
338  */