6051c5de720fe0e5afc9e8ff7f51ea520a7085ec
[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 */