2 * Copyright 2000, International Business Machines Corporation and others.
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
11 * rx_kmutex.h - mutex and condition variable macros for kernel environment.
13 * AIX 4.x implementation.
23 #include <sys/lockl.h>
24 #include <sys/lock_def.h>
25 #include <sys/lock_alloc.h>
26 #include <sys/sleep.h>
27 #define RX_ENABLE_LOCKS 1
29 * `condition variables' -- well, not really. these just map to the
30 * AIX event-list routines. Thus, if one signals a condition prior to
31 * a process waiting for it, the signal gets lost.
33 * `t' in `cv_timedwait' has different interpretation
39 #define MUTEX_DEFAULT 0
41 #define CV_INIT(cv, a,b,c) (*(cv) = EVENT_NULL)
42 #define CV_DESTROY(cv)
43 #define CV_SIGNAL(_cv) e_wakeup_one(_cv)
44 #define CV_BROADCAST(_cv) e_wakeup(_cv)
45 typedef simple_lock_data afs_kmutex_t;
46 typedef tid_t afs_kcondvar_t;
49 #define LOCK_INIT(a, b) lock_alloc((void*)(a), LOCK_ALLOC_PIN, 1, 1), \
50 simple_lock_init((void *)(a))
51 #define MUTEX_INIT(a,b,c,d) lock_alloc((void*)(a), LOCK_ALLOC_PIN, 1, 1), \
52 simple_lock_init((void *)(a))
53 #define MUTEX_DESTROY(a) lock_free((void*)(a))
57 #define MUTEX_ENTER(a) simple_lock((void *)(a)), \
58 rxdb_grablock((void *)(a), thread_self(),rxdb_fileID,\
61 #define MUTEX_TRYENTER(a) (simple_lock_try((void *)(a)) ?\
62 rxdb_grablock((void *)(a), thread_self(), rxdb_fileID,\
65 #define MUTEX_EXIT(a) rxdb_droplock((void *)(a), thread_self(), rxdb_fileID,\
67 simple_unlock((void *)(a))
69 #define CV_WAIT(_cv, _lck) \
71 int haveGlock = ISAFS_GLOCK(); \
74 rxdb_droplock((void *)(_lck), thread_self(), rxdb_fileID, __LINE__); \
75 e_sleep_thread((_cv), (_lck), LOCK_SIMPLE); \
76 rxdb_grablock((void *)(_lck), thread_self(), rxdb_fileID, __LINE__); \
84 #define CV_TIMEDWAIT(_cv, _lck, _t) \
86 int haveGlock = ISAFS_GLOCK(); \
89 rxdb_droplock((void *)(_lck), thread_self(), rxdb_fileID, __LINE__); \
90 e_mpsleep((_cv), (_t), (_lck), LOCK_SIMPLE); \
91 rxdb_grablock((void *)(_lck), thread_self(), rxdb_fileID, __LINE__); \
99 #else /* RX_LOCK_DB */
101 #define MUTEX_ENTER(a) simple_lock((void *)(a))
102 #define MUTEX_TRYENTER(a) simple_lock_try((void *)(a))
103 #define MUTEX_EXIT(a) simple_unlock((void *)(a))
105 #define CV_WAIT(_cv, _lck) \
107 int haveGlock = ISAFS_GLOCK(); \
110 e_sleep_thread((_cv), (_lck), LOCK_SIMPLE); \
118 #define CV_TIMEDWAIT(_cv, _lck, _t) \
120 int haveGlock = ISAFS_GLOCK(); \
123 e_mpsleep((_cv), (_t), (_lck), LOCK_SIMPLE); \
131 #endif /* RX_LOCK_DB */
133 #define MUTEX_DEFAULT 0
136 #define MUTEX_ISMINE(a) (lock_mine((void *)(a)))
138 #undef osirx_AssertMine
139 extern void osirx_AssertMine(afs_kmutex_t * lockaddr, char *msg);
141 #endif /* AFS_AIX41_ENV */
143 #endif /* _RX_KMUTEX_H_ */