/*
* Copyright 2000, International Business Machines Corporation and others.
* All Rights Reserved.
- *
+ *
* This software has been released under the terms of the IBM Public
* License. For details, see the LICENSE file in the top-level source
* directory or online at http://www.openafs.org/dl/license10.html
#include <sys/systm.h>
#include <sys/proc.h>
+#ifdef AFS_FBSD70_ENV
+#include <sys/lock.h>
+#include <sys/lockmgr.h>
+#else
#include <sys/lock.h>
+#endif
#define RX_ENABLE_LOCKS 1
-#define AFS_GLOBAL_RXLOCK_KERNEL
-
-/*
- * Condition variables
- *
- * In Digital Unix (OSF/1), we use something akin to the ancient sleep/wakeup
- * mechanism. The condition variable itself plays no role; we just use its
- * address as a convenient unique number.
- */
-#define CV_INIT(cv,a,b,c)
-#define CV_DESTROY(cv)
-#define CV_WAIT(cv, lck) { \
- int isGlockOwner = ISAFS_GLOCK(); \
- if (isGlockOwner) AFS_GUNLOCK(); \
- MUTEX_EXIT(lck); \
- tsleep(cv, PSOCK, "afs_rx_cv_wait", 0); \
- if (isGlockOwner) AFS_GLOCK(); \
- MUTEX_ENTER(lck); \
- }
-#define CV_TIMEDWAIT(cv,lck,t) { \
- int isGlockOwner = ISAFS_GLOCK(); \
- if (isGlockOwner) AFS_GUNLOCK(); \
- MUTEX_EXIT(lck); \
- tsleep(cv, PSOCK, "afs_rx_cv_timedwait", t); \
- if (isGlockOwner) AFS_GLOCK(); \
- MUTEX_ENTER(lck); \
-
-#define CV_SIGNAL(cv) wakeup_one(cv)
-#define CV_BROADCAST(cv) wakeup(cv)
-
-/* #define osi_rxWakeup(cv) wakeup(cv) */
typedef int afs_kcondvar_t;
#define HEAVY_LOCKS
-#ifdef NULL_LOCKS
+#if defined(NULL_LOCKS)
typedef struct {
struct proc *owner;
} afs_kmutex_t;
#define MUTEX_INIT(a,b,c,d) \
do { \
(a)->owner = 0; \
- } while(0);
+ } while(0)
#define MUTEX_DESTROY(a) \
do { \
(a)->owner = (struct proc *)-1; \
- } while(0);
+ } while(0)
#define MUTEX_ENTER(a) \
do { \
osi_Assert((a)->owner == 0); \
(a)->owner = curproc; \
- } while(0);
+ } while(0)
#define MUTEX_TRYENTER(a) \
( osi_Assert((a)->owner == 0), (a)->owner = curproc, 1)
#define MUTEX_EXIT(a) \
do { \
osi_Assert((a)->owner == curproc); \
(a)->owner = 0; \
- } while(0);
+ } while(0)
+
+#define MUTEX_ASSERT(a) osi_Assert(((afs_kmutex_t *)(a))->owner == curproc)
-#undef MUTEX_ISMINE
-#define MUTEX_ISMINE(a) (((afs_kmutex_t *)(a))->owner == curproc)
+#elif defined(AFS_FBSD70_ENV) /* dunno about 6.x */
+typedef struct mtx afs_kmutex_t;
+
+#if defined(AFS_FBSD80_ENV) && defined(WITNESS)
+#define WITCLEAR_MTX(a) \
+ do { memset((a), 0, sizeof(struct mtx)); } while(0)
#else
-#ifdef HEAVY_LOCKS
-typedef struct {
- struct lock lock;
- struct proc *owner;
-} afs_kmutex_t;
+#define WITCLEAR_MTX(a) {}
+#endif
+#define MUTEX_INIT(a,b,c,d) \
+ do { \
+ WITCLEAR_MTX(a); \
+ mtx_init((a), (b), 0 /* type defaults to name */, MTX_DEF | MTX_DUPOK); \
+ } while(0)
+
+#define MUTEX_DESTROY(a) \
+ do { \
+ mtx_destroy((a)); \
+ } while(0)
-#define MUTEX_INIT(a,b,c,d) \
- do { \
- lockinit(&(a)->lock,PSOCK, "afs rx mutex", 0, 0); \
- (a)->owner = 0; \
- } while(0);
-#define MUTEX_DESTROY(a) \
- do { \
- (a)->owner = (struct proc *)-1; \
- } while(0);
#define MUTEX_ENTER(a) \
- do { \
- lockmgr(&(a)->lock, LK_EXCLUSIVE, 0, curproc); \
- osi_Assert((a)->owner == 0); \
- (a)->owner = curproc; \
- } while(0);
-#define MUTEX_TRYENTER(a) \
- ( lockmgr(&(a)->lock, LK_EXCLUSIVE|LK_NOWAIT, 0, curproc) ? 0 : ((a)->owner = curproc, 1) )
-#define xMUTEX_TRYENTER(a) \
- ( osi_Assert((a)->owner == 0), (a)->owner = curproc, 1)
-#define MUTEX_EXIT(a) \
- do { \
- osi_Assert((a)->owner == curproc); \
- (a)->owner = 0; \
- lockmgr(&(a)->lock, LK_RELEASE, 0, curproc); \
- } while(0);
+ do { \
+ mtx_lock((a)); \
+ } while(0)
+
+#define MUTEX_TRYENTER(a) \
+ ( mtx_trylock((a)) )
+
+#define MUTEX_EXIT(a) \
+ do { \
+ mtx_unlock((a)); \
+ } while(0)
+
+#define MUTEX_ASSERT(a) \
+ osi_Assert(mtx_owned((a)))
-#undef MUTEX_ISMINE
-#define MUTEX_ISMINE(a) (((afs_kmutex_t *)(a))->owner == curproc)
#else
+
typedef struct {
- struct simplelock lock;
- struct proc *owner;
+ struct lock lock;
+ struct thread *owner;
} afs_kmutex_t;
#define MUTEX_INIT(a,b,c,d) \
do { \
- simple_lock_init(&(a)->lock); \
+ lockinit(&(a)->lock,PSOCK, "afs rx mutex", 0, 0); \
(a)->owner = 0; \
- } while(0);
+ } while(0)
#define MUTEX_DESTROY(a) \
do { \
(a)->owner = (struct proc *)-1; \
- } while(0);
+ } while(0)
#define MUTEX_ENTER(a) \
do { \
- simple_lock(&(a)->lock); \
+ lockmgr(&(a)->lock, LK_EXCLUSIVE, 0, curthread); \
osi_Assert((a)->owner == 0); \
- (a)->owner = curproc; \
- } while(0);
+ (a)->owner = curthread; \
+ } while(0)
#define MUTEX_TRYENTER(a) \
- ( simple_lock_try(&(a)->lock) ? 0 : ((a)->owner = curproc, 1) )
+ ( lockmgr(&(a)->lock, LK_EXCLUSIVE|LK_NOWAIT, 0, curthread) ? 0 : ((a)->owner = curthread, 1) )
+#define xMUTEX_TRYENTER(a) \
+ ( osi_Assert((a)->owner == 0), (a)->owner = curthread, 1)
#define MUTEX_EXIT(a) \
do { \
- osi_Assert((a)->owner == curproc); \
+ osi_Assert((a)->owner == curthread); \
(a)->owner = 0; \
- simple_unlock(&(a)->lock); \
- } while(0);
+ lockmgr(&(a)->lock, LK_RELEASE, 0, curthread); \
+ } while(0)
-#undef MUTEX_ISMINE
-#define MUTEX_ISMINE(a) (((afs_kmutex_t *)(a))->owner == curproc)
-#endif
+#define MUTEX_ASSERT(a) osi_Assert(((afs_kmutex_t *)(a))->owner == curthread)
#endif
+/*
+ * Condition variables
+ *
+ * In Digital Unix (OSF/1), we use something akin to the ancient sleep/wakeup
+ * mechanism. The condition variable itself plays no role; we just use its
+ * address as a convenient unique number.
+ */
+#define CV_INIT(cv,a,b,c)
+#define CV_DESTROY(cv)
-#undef osirx_AssertMine
-extern void osirx_AssertMine(afs_kmutex_t *lockaddr, char *msg);
+#if defined(AFS_FBSD70_ENV)
-#endif /* _RX_KMUTEX_H_ */
+#define CV_WAIT(cv, lck) { \
+ int isGlockOwner = ISAFS_GLOCK(); \
+ if (isGlockOwner) AFS_GUNLOCK(); \
+ msleep(cv, lck, PSOCK, "afs_rx_cv_wait", 0); \
+ if (isGlockOwner) AFS_GLOCK(); \
+ }
+
+#define CV_TIMEDWAIT(cv,lck,t) { \
+ int isGlockOwner = ISAFS_GLOCK(); \
+ if (isGlockOwner) AFS_GUNLOCK(); \
+ msleep(cv, lck, PSOCK, "afs_rx_cv_timedwait", t); \
+ if (isGlockOwner) AFS_GLOCK(); \
+ }
+#else /* !AFS_FBSD70_ENV */
+#define CV_WAIT(cv, lck) { \
+ int isGlockOwner = ISAFS_GLOCK(); \
+ if (isGlockOwner) AFS_GUNLOCK(); \
+ MUTEX_EXIT(lck); \
+ tsleep(cv, PSOCK, "afs_rx_cv_wait", 0); \
+ if (isGlockOwner) AFS_GLOCK(); \
+ MUTEX_ENTER(lck); \
+ }
+#define CV_TIMEDWAIT(cv,lck,t) { \
+ int isGlockOwner = ISAFS_GLOCK(); \
+ if (isGlockOwner) AFS_GUNLOCK(); \
+ MUTEX_EXIT(lck); \
+ tsleep(cv, PSOCK, "afs_rx_cv_timedwait", t); \
+ if (isGlockOwner) AFS_GLOCK(); \
+ MUTEX_ENTER(lck); \
+ }
+#endif /* AFS_FBSD80_ENV */
+
+#define CV_SIGNAL(cv) wakeup_one(cv)
+#define CV_BROADCAST(cv) wakeup(cv)
+
+/* #define osi_rxWakeup(cv) wakeup(cv) */
+
+
+#endif /* _RX_KMUTEX_H_ */