9d98fa73331196287760bd6bc52c6401d0654c96
[openafs.git] / src / rx / rx_pthread.h
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  *
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 /* rx_pthread.h defines the lock and cv primitives required for a thread
11  * safe user mode rx. The current implemenation is only tested on Solaris.
12  */
13
14 #ifndef RX_PTHREAD_H
15 #define RX_PTHREAD_H
16
17 #ifndef RX_ENABLE_LOCKS
18 #define RX_ENABLE_LOCKS 1
19 #endif
20
21 /* Block signals to child threads. */
22 #include <afs/pthread_nosigs.h>
23 #include <afs/opr.h>
24
25 #ifdef AFS_NT40_ENV
26 #include <wtypes.h>
27 #include <winbase.h>
28 #include <winsock2.h>
29 #include <pthread.h>
30
31 typedef pthread_mutex_t afs_kmutex_t;
32 typedef pthread_cond_t afs_kcondvar_t;
33 #ifdef  RX_ENABLE_LOCKS
34 #define MUTEX_ISMINE(l) (pthread_mutex_trylock(l) == EDEADLK)
35 #else
36 #define MUTEX_ISMINE(l) (1)
37 #endif
38
39 #define pthread_yield() Sleep(0)
40
41 #else /* AFS_NT40_ENV */
42
43 #include <pthread.h>
44 typedef pthread_mutex_t afs_kmutex_t;
45 typedef pthread_cond_t afs_kcondvar_t;
46
47 #if !defined(pthread_yield) && defined(AFS_SUN5_ENV)
48 #define pthread_yield() thr_yield()
49 #endif
50 #if !defined(pthread_yield) && !defined(AFS_AIX_ENV)
51 #define pthread_yield() sleep(0)
52 #endif
53 #if !defined(pthread_yield) && (_XOPEN_SOURCE + 0) >= 500
54 #define pthread_yield() sched_yield()
55 #endif
56
57
58 #ifndef MUTEX_ISMINE
59 /* Only used for debugging. */
60 #ifdef AFS_SUN5_ENV
61 /* synch.h says mutex_t and pthread_mutex_t are always the same */
62 #include <synch.h>
63 #define MUTEX_ISMINE(l) MUTEX_HELD((mutex_t *) l)
64 #else /* AFS_SUN5_ENV */
65 #define MUTEX_ISMINE(l) (1)
66 #endif /* AFS_SUN5_ENV */
67 #endif /* !MUTEX_ISMINE */
68 #endif /* AFS_NT40_ENV */
69
70 extern void osirx_AssertMine(afs_kmutex_t * lockaddr, char *msg);
71
72 #ifdef AFS_PTHREAD_ENV
73 #ifdef MUTEX_INIT
74 #undef MUTEX_INIT
75 #endif
76 #define MUTEX_INIT(a, b, c, d) opr_Verify(pthread_mutex_init(a, NULL) == 0)
77
78 #ifdef MUTEX_DESTROY
79 #undef MUTEX_DESTROY
80 #endif
81 #define MUTEX_DESTROY(l) opr_Verify(pthread_mutex_destroy(l) == 0)
82
83 #ifdef MUTEX_ENTER
84 #undef MUTEX_ENTER
85 #endif
86 #define MUTEX_ENTER(l) opr_Verify(pthread_mutex_lock(l) == 0)
87
88 #ifdef MUTEX_TRYENTER
89 #undef MUTEX_TRYENTER
90 #endif
91 #define MUTEX_TRYENTER(l) pthread_mutex_trylock(l) ? 0 : 1
92
93 #ifdef MUTEX_EXIT
94 #undef MUTEX_EXIT
95 #endif
96 #define MUTEX_EXIT(l) opr_Verify(pthread_mutex_unlock(l) == 0)
97
98 #ifdef CV_INIT
99 #undef CV_INIT
100 #endif
101 #define CV_INIT(cv, a, b, c) opr_Verify(pthread_cond_init(cv, NULL) == 0)
102
103 #ifdef CV_DESTROY
104 #undef CV_DESTROY
105 #endif
106 #define CV_DESTROY(cv) opr_Verify(pthread_cond_destroy(cv) == 0)
107
108 #ifdef CV_WAIT
109 #undef CV_WAIT
110 #endif
111 #define CV_WAIT(cv, l) opr_Verify(pthread_cond_wait(cv, l) == 0)
112
113 #ifdef CV_TIMEDWAIT
114 #undef CV_TIMEDWAIT
115 #endif
116 #define CV_TIMEDWAIT(cv, l, t) pthread_cond_timedwait(cv, l, t)
117
118 #ifdef CV_SIGNAL
119 #undef CV_SIGNAL
120 #endif
121 #define CV_SIGNAL(cv) opr_Verify(pthread_cond_signal(cv) == 0)
122
123 #ifdef CV_BROADCAST
124 #undef CV_BROADCAST
125 #endif
126 #define CV_BROADCAST(cv) opr_Verify(pthread_cond_broadcast(cv) == 0)
127
128 #endif /* AFS_PTHREAD_ENV */
129
130
131 #endif /* RX_PTHREAD_H */