Import Upstream version 1.8.5
[hcoop/debian/openafs.git] / src / opr / opr_lock.h
1 /*
2 * Copyright (c) 2012 Your File System Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR `AS IS'' AND ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
15 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
17 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
20 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23 */
24 #ifndef OPENAFS_OPR_LOCK_H
25 #define OPENAFS_OPR_LOCK_H 1
26
27 #include <pthread.h>
28
29 /* Mutexes */
30
31 typedef pthread_mutex_t opr_mutex_t;
32
33 # ifdef OPR_DEBUG_LOCKS
34 static_inline void
35 opr_mutex_init(opr_mutex_t *mutex)
36 {
37 pthread_mutexattr_t attr;
38
39 pthread_mutexattr_init(&attr);
40 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
41
42 opr_Verify(pthread_mutex_init(mutex, &attr) == 0);
43 pthread_mutexattr_destroy(&attr);
44 }
45
46 # define opr_mutex_assert(mutex) \
47 opr_Verify(pthread_mutex_lock(mutex) == EDEADLK)
48
49 # else
50
51 # define opr_mutex_init(mutex) \
52 opr_Verify(pthread_mutex_init(mutex, NULL) == 0)
53
54 # define opr_mutex_assert(mutex)
55
56 # endif
57
58 # define opr_mutex_destroy(mutex) \
59 opr_Verify(pthread_mutex_destroy(mutex) == 0)
60
61 # define opr_mutex_enter(mutex) \
62 opr_Verify(pthread_mutex_lock(mutex) == 0)
63
64 # define opr_mutex_exit(mutex) \
65 opr_Verify(pthread_mutex_unlock(mutex) == 0)
66
67 # define opr_mutex_tryenter(mutex) \
68 (pthread_mutex_trylock(mutex) ? 0: 1)
69
70 typedef pthread_cond_t opr_cv_t;
71
72 # define opr_cv_init(condvar) \
73 opr_Verify(pthread_cond_init(condvar, NULL) == 0)
74
75 # define opr_cv_destroy(condvar) \
76 opr_Verify(pthread_cond_destroy(condvar) == 0)
77
78 # define opr_cv_wait(condvar, mutex) \
79 opr_Verify(pthread_cond_wait(condvar, mutex) == 0)
80
81 # define opr_cv_timedwait(condvar, mutex, timeout) \
82 pthread_cond_timedwait(condvar, mutex, timeout)
83
84 # define opr_cv_signal(condvar) \
85 opr_Verify(pthread_cond_signal(condvar) == 0)
86
87 # define opr_cv_broadcast(condvar) \
88 opr_Verify(pthread_cond_broadcast(condvar) == 0)
89
90 #endif /* OPENAFS_OPR_LOCK_H */