to disabled)])],
[enable_checking="$enableval"],
[enable_checking="no"])
+AC_ARG_ENABLE([debug-locks],
+ [AS_HELP_STRING([--enable-debug-locks],
+ [turn on lock debugging assertions (defaults to disabled)])],
+ [enable_debug_locks="$enableval"],
+ [enable_debug_locks="no"])
AC_ARG_ENABLE([debug-kernel],
[AS_HELP_STRING([--enable-debug-kernel],
[enable compilation of the kernel module with debugging information
OPENAFS_TEST_PACKAGE(libintl,[#include <libintl.h>],[-lintl],,,INTL)
+if test "$enable_debug_locks" = yes; then
+ AC_DEFINE(OPR_DEBUG_LOCKS, 1, [turn on lock debugging in opr])
+fi
+
dnl Don't build PAM on IRIX; the interface doesn't work for us.
if test "$ac_cv_header_security_pam_modules_h" = yes -a "$enable_pam" = yes; then
case $AFS_SYSNAME in
typedef int opr_cv_t;
# define opr_mutex_init(mutex)
+# define opr_mutex_assert(mutex)
# define opr_mutex_destroy(mutex)
# define opr_mutex_enter(mutex)
# define opr_mutex_exit(mutex)
#include <pthread.h>
+/* Mutexes */
+
typedef pthread_mutex_t opr_mutex_t;
-# define opr_mutex_init(mutex) \
+# ifdef OPR_DEBUG_LOCKS
+static_inline void
+opr_mutex_init(opr_mutex_t *mutex)
+{
+ pthread_mutexattr_t attr;
+
+ pthread_mutexattr_init(&attr);
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
+
+ opr_Verify(pthread_mutex_init(mutex, &attr) == 0);
+ pthread_mutexattr_destroy(&attr);
+}
+
+# define opr_mutex_assert(mutex) \
+ opr_Verify(pthread_mutex_lock(mutex) == EDEADLK)
+
+# else
+
+# define opr_mutex_init(mutex) \
opr_Verify(pthread_mutex_init(mutex, NULL) == 0)
+# define opr_mutex_assert(mutex)
+
+# endif
+
# define opr_mutex_destroy(mutex) \
opr_Verify(pthread_mutex_destroy(mutex) == 0)
#define MUTEX_DEFAULT 0
-#undef MUTEX_ISMINE
-#define MUTEX_ISMINE(a) (lock_mine((void *)(a)))
-
-#undef osirx_AssertMine
-extern void osirx_AssertMine(afs_kmutex_t * lockaddr, char *msg);
+#define MUTEX_ASSERT(a) osi_Assert(lock_mine((void *)(a)))
#endif /* AFS_AIX41_ENV */
lck_mtx_unlock((a)->meta); \
} while(0)
-#undef MUTEX_ISMINE
-#define MUTEX_ISMINE(a) (((afs_kmutex_t *)(a))->owner == current_thread())
+#define MUTEX_ASSERT(a) osi_Assert(((afs_kmutex_t *)(a))->owner == current_thread())
#else
typedef struct {
struct lock__bsd__ lock;
lockmgr(&(a)->lock, LK_RELEASE, 0, current_proc()); \
} while(0);
-#undef MUTEX_ISMINE
-#define MUTEX_ISMINE(a) (((afs_kmutex_t *)(a))->owner == current_thread())
+#define MUTEX_ASSERT(a) osi_Assert(((afs_kmutex_t *)(a))->owner == current_thread())
#endif
-#undef osirx_AssertMine
-extern void osirx_AssertMine(afs_kmutex_t * lockaddr, char *msg);
-
#endif /* _RX_KMUTEX_H_ */
(a)->owner = 0; \
} while(0);
-#undef MUTEX_ISMINE
-#define MUTEX_ISMINE(a) (((afs_kmutex_t *)(a))->owner == curproc)
+#define MUTEX_ASSERT(a) osi_Assert(((afs_kmutex_t *)(a))->owner == curproc)
#elif defined(AFS_FBSD70_ENV) /* dunno about 6.x */
mtx_unlock((a)); \
} while(0);
-#undef MUTEX_ISMINE
-#define MUTEX_ISMINE(a) \
- ( mtx_owned((a)) )
+#define MUTEX_ASSERT(a) \
+ osi_Assert(mtx_owned((a)))
#else
lockmgr(&(a)->lock, LK_RELEASE, 0, curthread); \
} while(0);
-#undef MUTEX_ISMINE
-#define MUTEX_ISMINE(a) (((afs_kmutex_t *)(a))->owner == curthread)
+#define MUTEX_ASSERT(a) osi_Assert(((afs_kmutex_t *)(a))->owner == curthread)
#endif
-
-#undef osirx_AssertMine
-extern void osirx_AssertMine(afs_kmutex_t * lockaddr, char *msg);
-
-
/*
* Condition variables
*
#ifdef AFS_HPUX102_ENV
#if defined(AFS_HPUX110_ENV)
-#undef osirx_AssertMine
-extern void osirx_AssertMine(afs_kmutex_t * lockaddr, char *msg);
#define AFS_RX_ORDER 30
((b_owns_sema(a)) ? b_vsema(a) : (osi_Panic("mutex not held"), 0))
#endif
-#undef MUTEX_ISMINE
-#define MUTEX_ISMINE(a) b_owns_sema(a)
+#define MUTEX_ASSERT(a) osi_Assert(b_owns_sema(a))
#else /* AFS_HPUX110_ENV */
-#define osirx_AssertMine(addr, msg)
-
#define MUTEX_DESTROY(a)
#define MUTEX_ENTER(a)
#define MUTEX_TRYENTER(a) 1
#define MUTEX_EXIT(a)
#define MUTEX_INIT(a,b,c,d)
+#define MUTEX_ASSERT(a)
#endif /* else AFS_HPUX110_ENV */
#endif /* AFS_HPUX102_ENV */
#define MUTEX_INIT(a,b,c,d) mutex_init(a,b,c,d)
#endif
#define MUTEX_DESTROY(a) mutex_destroy(a)
-#undef MUTEX_ISMINE
-#define MUTEX_ISMINE(a) 1
+#define MUTEX_ASSERT(a)
#define CV_INIT(cv, a,b,c) cv_init(cv, a, b, c)
#define CV_SIGNAL(_cv) cv_signal(_cv)
#define CV_BROADCAST(_cv) cv_broadcast(_cv)
#define CV_DESTROY(_cv) cv_destroy(_cv)
-#undef osirx_AssertMine
-extern void osirx_AssertMine(afs_kmutex_t * lockaddr, char *msg);
#ifdef AFS_SGI64_ENV
/* Add PLTWAIT for afsd's to wait so we don't rack up the load average. */
#ifdef AFS_SGI65_ENV
#else /* MP */
#define MUTEX_INIT(m, nm, type , a)
#define MUTEX_DESTROY(a)
-#define MUTEX_ISMINE(a) 1
+#define MUTEX_ASSERT(a)
#define MUTEX_ENTER(a)
#define MUTEX_TRYENTER(a) 1
#define MUTEX_EXIT(a)
-#define osirx_AssertMine(addr, msg)
-
#define CV_INIT(cv, a,b,c)
#define CV_SIGNAL(_cv)
#define CV_BROADCAST(_cv)
wait_queue_head_t waitq;
} afs_kcondvar_t;
-static inline int
-MUTEX_ISMINE(afs_kmutex_t * l)
+static inline void
+MUTEX_ASSERT(afs_kmutex_t * l)
{
- return l->owner == current->pid;
+ osi_Assert(l->owner == current->pid);
}
#define MUTEX_INIT(a,b,c,d) afs_mutex_init(a)
#endif
} afs_kcondvar_t;
-static inline int
-MUTEX_ISMINE(afs_kmutex_t * l)
+static inline void
+MUTEX_ASSERT(afs_kmutex_t * l)
{
- return l->owner == current->pid;
+ osi_Assert(l->owner == current->pid);
}
#define MUTEX_INIT(a,b,c,d) afs_mutex_init(a)
#define MUTEX_ENTER(a) mutex_enter((a));
#define MUTEX_TRYENTER(a) mutex_tryenter((a))
#define MUTEX_EXIT(a) mutex_exit((a))
-#define MUTEX_ISMINE(a) mutex_owned((a))
+#define MUTEX_ASSERT(a) osi_Assert(mutex_owned((a)))
typedef kcondvar_t afs_kcondvar_t;
int afs_cv_wait(afs_kcondvar_t *, afs_kmutex_t *, int);
} while(0);
#endif /* LOCKDEBUG */
-#define MUTEX_ISMINE(a) \
- (lockstatus(a) == LK_EXCLUSIVE)
+#define MUTEX_ASSERT(a) \
+ osi_Assert((lockstatus(a) == LK_EXCLUSIVE))
#define MUTEX_LOCKED(a) \
(lockstatus(a) == LK_EXCLUSIVE)
osi_Assert((a)->owner == curproc); \
(a)->owner = 0; \
} while(0);
-#define MUTEX_ISMINE(a) (((afs_kmutex_t *)(a))->owner == curproc)
+#define MUTEX_ASSERT(a) osi_Assert(((afs_kmutex_t *)(a))->owner == curproc)
#endif /* _RX_KMUTEX_H_ */
typedef kmutex_t afs_kmutex_t;
typedef kcondvar_t afs_kcondvar_t;
-#undef osirx_AssertMine
-extern void osirx_AssertMine(afs_kmutex_t * lockaddr, char *msg);
-
#define MUTEX_DESTROY(a) mutex_destroy(a)
#define MUTEX_INIT(a,b,c,d) mutex_init(a, b, c, d)
-#define MUTEX_ISMINE(a) mutex_owned((afs_kmutex_t *)(a))
+#define MUTEX_ASSERT(a) osi_Assert(mutex_owned((afs_kmutex_t *)(a)))
#define CV_INIT(a,b,c,d) cv_init(a, b, c, d)
#define CV_DESTROY(a) cv_destroy(a)
#define CV_SIGNAL(a) cv_signal(a)
#define MUTEX_INIT(A,B,C,D) usr_mutex_init(A)
#define MUTEX_ENTER(A) usr_mutex_lock(A)
#define MUTEX_TRYENTER(A) usr_mutex_trylock(A)
-#define MUTEX_ISMINE(A) (1)
#define MUTEX_EXIT(A) usr_mutex_unlock(A)
#define MUTEX_DESTROY(A) usr_mutex_destroy(A)
+#define MUTEX_ASSERT(A)
#define CV_INIT(A,B,C,D) usr_cond_init(A)
#define CV_TIMEDWAIT(A,B,C) usr_cond_timedwait(A,B,C)
#define CV_SIGNAL(A) usr_cond_signal(A)
} \
}
-#ifndef UKERNEL
-extern void osirx_AssertMine(afs_kmutex_t * lockaddr, char *msg);
-#endif
-
#define SPLVAR
#define NETPRI
#define USERPRI
while (!call->error && (call->flags & RX_CALL_TQ_BUSY)) {
call->flags |= RX_CALL_TQ_WAIT;
call->tqWaiters++;
- osirx_AssertMine(&call->lock, "rxi_WaitforTQ lock");
+ MUTEX_ASSERT(&call->lock);
CV_WAIT(&call->cv_tq, &call->lock);
call->tqWaiters--;
if (call->tqWaiters == 0) {
dpf(("call %"AFS_PTR_FMT" has %d waiters and flags %d\n",
call, call->tqWaiters, call->flags));
#ifdef RX_ENABLE_LOCKS
- osirx_AssertMine(&call->lock, "rxi_Start start");
+ MUTEX_ASSERT(&call->lock);
CV_BROADCAST(&call->cv_tq);
#else /* RX_ENABLE_LOCKS */
osi_rxWakeup(&call->tq);
return np;
}
- osirx_AssertMine(&call->lock, "rxi_ReceivePacket middle");
+ MUTEX_ASSERT(&call->lock);
/* Set remote user defined status from packet */
call->remoteStatus = np->header.userStatus;
void
rxi_CallError(struct rx_call *call, afs_int32 error)
{
-#ifdef DEBUG
- osirx_AssertMine(&call->lock, "rxi_CallError");
-#endif
+ MUTEX_ASSERT(&call->lock);
dpf(("rxi_CallError call %"AFS_PTR_FMT" error %d call->error %d\n", call, error, call->error));
if (call->error)
error = call->error;
int flags;
struct rx_peer *peer;
struct rx_packet *packet;
-#ifdef DEBUG
- osirx_AssertMine(&call->lock, "rxi_ResetCall");
-#endif
+
+ MUTEX_ASSERT(&call->lock);
dpf(("rxi_ResetCall(call %"AFS_PTR_FMT", newcall %d)\n", call, newcall));
/* Notify anyone who is waiting for asynchronous packet arrival */
UNLOCK_RX_INIT;
}
-#ifdef RX_ENABLE_LOCKS
-void
-osirx_AssertMine(afs_kmutex_t * lockaddr, char *msg)
-{
- if (!MUTEX_ISMINE(lockaddr))
- osi_Panic("Lock not held: %s", msg);
-}
-#endif /* RX_ENABLE_LOCKS */
-
#ifndef KERNEL
/*
#define MUTEX_TRYENTER(a) 1
#define MUTEX_EXIT(a)
#define MUTEX_INIT(a,b,c,d)
-#define MUTEX_ISMINE(a)
+#define MUTEX_ASSERT(a)
#define CV_INIT(a,b,c,d)
#define CV_DESTROY(a)
#define CV_WAIT(cv, l)
#define CV_SIGNAL(cv)
#define CV_BROADCAST(cv)
#define CV_TIMEDWAIT(cv, l, t)
-#define osirx_AssertMine(a, b)
#endif /* KERNEL */
extern afs_int32 rx_GetLocalPeers(afs_uint32 peerHost, afs_uint16 peerPort,
struct rx_debugPeer * peerStats);
extern void shutdown_rx(void);
-#ifndef osirx_AssertMine
-extern void osirx_AssertMine(afs_kmutex_t * lockaddr, char *msg);
-#endif
#ifndef KERNEL
extern int rx_KeyCreate(rx_destructor_t rtn);
#endif
*/
/* rx_pthread.h defines the lock and cv primitives required for a thread
- * safe user mode rx. The current implemenation is only tested on Solaris.
+ * safe user mode rx.
*/
#ifndef RX_PTHREAD_H
typedef pthread_mutex_t afs_kmutex_t;
typedef pthread_cond_t afs_kcondvar_t;
-#ifdef RX_ENABLE_LOCKS
-#define MUTEX_ISMINE(l) (pthread_mutex_trylock(l) == EDEADLK)
-#else
-#define MUTEX_ISMINE(l) (1)
-#endif
#define pthread_yield() Sleep(0)
#if !defined(pthread_yield) && (_XOPEN_SOURCE + 0) >= 500
#define pthread_yield() sched_yield()
#endif
-
-
-#ifndef MUTEX_ISMINE
-/* Only used for debugging. */
-#ifdef AFS_SUN5_ENV
-/* synch.h says mutex_t and pthread_mutex_t are always the same */
-#include <synch.h>
-#define MUTEX_ISMINE(l) MUTEX_HELD((mutex_t *) l)
-#else /* AFS_SUN5_ENV */
-#define MUTEX_ISMINE(l) (1)
-#endif /* AFS_SUN5_ENV */
-#endif /* !MUTEX_ISMINE */
#endif /* AFS_NT40_ENV */
-extern void osirx_AssertMine(afs_kmutex_t * lockaddr, char *msg);
-
#define MUTEX_INIT(a, b, c, d) opr_mutex_init(a)
#define MUTEX_DESTROY(l) opr_mutex_destroy(l)
#define MUTEX_ENTER(l) opr_mutex_enter(l)
#define MUTEX_TRYENTER(l) opr_mutex_tryenter(l)
#define MUTEX_EXIT(l) opr_mutex_exit(l)
+#define MUTEX_ASSERT(l) opr_mutex_assert(l)
#define CV_INIT(cv, a, b, c) opr_cv_init(cv)
#define CV_DESTROY(cv) opr_cv_destroy(cv)
#define CV_WAIT(cv, l) opr_cv_wait(cv, l)
#include <afs/param.h>
#include <roken.h>
+#include <afs/opr.h>
#ifdef HAVE_SYS_FILE_H
#include <sys/file.h>
# include <opr/lockstub.h>
#endif
-#include <afs/opr.h>
#include <rx/rx_queue.h>
#include <rx/xdr.h>
#include <afs/afsint.h>