rx: remove trailing semicolons from FBSD mutex operations
[openafs.git] / src / rx / FBSD / rx_kmutex.h
index 924d8c2..660494c 100644 (file)
-/* Copyright Transarc Corporation 1998 - All Rights Reserved
+/*
+ * 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
+ */
+
+/*
  * rx_kmutex.h - mutex and condition variable macros for kernel environment.
  *
- * DUX implementation.
+ * FBSD implementation.
  */
 
 #ifndef _RX_KMUTEX_H_
 #define _RX_KMUTEX_H_
 
-#ifdef AFS_FBSD40_ENV
-
+#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>
-/* #include <kern/sched_prim.h> */
-/* #include <sys/unix_defs.h> */
+#endif
 
-#define RX_ENABLE_LOCKS                1
-#define AFS_GLOBAL_RXLOCK_KERNEL
+#define RX_ENABLE_LOCKS         1
 
-/*
- * 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();  \
-                               assert_wait((vm_offset_t)(cv), 0);      \
-                               MUTEX_EXIT(lck);        \
-                               thread_block();         \
-                               if (isGlockOwner) AFS_GLOCK();  \
-                               MUTEX_ENTER(lck); \
-                           }
-
-#define CV_TIMEDWAIT(cv,lck,t) { \
-                               int isGlockOwner = ISAFS_GLOCK(); \
-                               if (isGlockOwner) AFS_GUNLOCK();  \
-                               assert_wait((vm_offset_t)(cv), 0);      \
-                               thread_set_timeout(t);  \
-                               MUTEX_EXIT(lck);        \
-                               thread_block();         \
-                               if (isGlockOwner) AFS_GLOCK();  \
-                               MUTEX_ENTER(lck);       \
-
-#define CV_SIGNAL(cv)          thread_wakeup_one((vm_offset_t)(cv))
-#define CV_BROADCAST(cv)       thread_wakeup((vm_offset_t)(cv))
+typedef int afs_kcondvar_t;
 
+#define HEAVY_LOCKS
+#if defined(NULL_LOCKS)
 typedef struct {
-    struct simplelock lock;
+    struct proc *owner;
 } afs_kmutex_t;
-typedef int afs_kcondvar_t;
-
-#define osi_rxWakeup(cv)       thread_wakeup((vm_offset_t)(cv))
 
-#define LOCK_INIT(a,b) \
+#define MUTEX_INIT(a,b,c,d) \
+    do { \
+       (a)->owner = 0; \
+    } while(0)
+#define MUTEX_DESTROY(a) \
     do { \
-       usimple_lock_init(&(a)->lock); \
-    } while(0);
+       (a)->owner = (struct proc *)-1; \
+    } while(0)
+#define MUTEX_ENTER(a) \
+    do { \
+       osi_Assert((a)->owner == 0); \
+       (a)->owner = curproc; \
+    } 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)
+
+#define MUTEX_ASSERT(a) osi_Assert(((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
+#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_ENTER(a) \
+    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)))
+
+#else
+
+typedef struct {
+    struct lock lock;
+    struct thread *owner;
+} afs_kmutex_t;
+
+
 #define MUTEX_INIT(a,b,c,d) \
     do { \
-       usimple_lock_init(&(a)->lock); \
-    } while(0);
+       lockinit(&(a)->lock,PSOCK, "afs rx mutex", 0, 0); \
+       (a)->owner = 0; \
+    } while(0)
 #define MUTEX_DESTROY(a) \
     do { \
-       usimple_lock_terminate(&(a)->lock); \
-    } while(0);
+       (a)->owner = (struct proc *)-1; \
+    } while(0)
 #define MUTEX_ENTER(a) \
     do { \
-       usimple_lock(&(a)->lock); \
-    } while(0);
+       lockmgr(&(a)->lock, LK_EXCLUSIVE, 0, curthread); \
+       osi_Assert((a)->owner == 0); \
+       (a)->owner = curthread; \
+    } while(0)
 #define MUTEX_TRYENTER(a) \
-   usimple_lock(&(a)->lock)
+    ( 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 { \
-       usimple_unlock(&(a)->lock); \
-    } while(0);
+       osi_Assert((a)->owner == curthread); \
+       (a)->owner = 0; \
+       lockmgr(&(a)->lock, LK_RELEASE, 0, curthread); \
+    } while(0)
+
+#define MUTEX_ASSERT(a) osi_Assert(((afs_kmutex_t *)(a))->owner == curthread)
+#endif
 
-#undef MUTEX_ISMINE
-#define MUTEX_ISMINE(a) 1
-/* 
-  #define MUTEX_ISMINE(a) 
-  (((afs_kmutex_t *)(a))->owner == current_thread())
-*/ 
+/*
+ * 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 /* FBSD40 */
+#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_ */
-