#ifndef _DB_MUTEX_H_
#define _DB_MUTEX_H_
#if defined(__cplusplus)
extern "C" {
#endif
#define MUTEX_SPINS_PER_PROCESSOR 50
#define MUTEX_INVALID 0
#define MTX_APPLICATION 1
#define MTX_DB_HANDLE 2
#define MTX_ENV_DBLIST 3
#define MTX_ENV_HANDLE 4
#define MTX_ENV_REGION 5
#define MTX_LOCK_REGION 6
#define MTX_LOGICAL_LOCK 7
#define MTX_LOG_FILENAME 8
#define MTX_LOG_FLUSH 9
#define MTX_LOG_HANDLE 10
#define MTX_LOG_REGION 11
#define MTX_MPOOLFILE_HANDLE 12
#define MTX_MPOOL_FH 13
#define MTX_MPOOL_FILE_BUCKET 14
#define MTX_MPOOL_HANDLE 15
#define MTX_MPOOL_HASH_BUCKET 16
#define MTX_MPOOL_IO 17
#define MTX_MPOOL_REGION 18
#define MTX_MUTEX_REGION 19
#define MTX_MUTEX_TEST 20
#define MTX_REP_CHKPT 21
#define MTX_REP_DATABASE 22
#define MTX_REP_EVENT 23
#define MTX_REP_REGION 24
#define MTX_SEQUENCE 25
#define MTX_TWISTER 26
#define MTX_TXN_ACTIVE 27
#define MTX_TXN_CHKPT 28
#define MTX_TXN_COMMIT 29
#define MTX_TXN_MVCC 30
#define MTX_TXN_REGION 31
#define MTX_MAX_ENTRY 31
#if !defined(HAVE_MUTEX_HYBRID) && ( \
defined(HAVE_MUTEX_PTHREADS) || \
defined(HAVE_MUTEX_SOLARIS_LWP) || \
defined(HAVE_MUTEX_UI_THREADS))
#define __mutex_init(a, b, c) __db_pthread_mutex_init(a, b, c)
#define __mutex_lock(a, b) __db_pthread_mutex_lock(a, b)
#define __mutex_unlock(a, b) __db_pthread_mutex_unlock(a, b)
#define __mutex_destroy(a, b) __db_pthread_mutex_destroy(a, b)
#elif defined(HAVE_MUTEX_WIN32) || defined(HAVE_MUTEX_WIN32_GCC)
#define __mutex_init(a, b, c) __db_win32_mutex_init(a, b, c)
#define __mutex_lock(a, b) __db_win32_mutex_lock(a, b)
#define __mutex_unlock(a, b) __db_win32_mutex_unlock(a, b)
#define __mutex_destroy(a, b) __db_win32_mutex_destroy(a, b)
#elif defined(HAVE_MUTEX_FCNTL)
#define __mutex_init(a, b, c) __db_fcntl_mutex_init(a, b, c)
#define __mutex_lock(a, b) __db_fcntl_mutex_lock(a, b)
#define __mutex_unlock(a, b) __db_fcntl_mutex_unlock(a, b)
#define __mutex_destroy(a, b) __db_fcntl_mutex_destroy(a, b)
#else
#define __mutex_init(a, b, c) __db_tas_mutex_init(a, b, c)
#define __mutex_lock(a, b) __db_tas_mutex_lock(a, b)
#define __mutex_unlock(a, b) __db_tas_mutex_unlock(a, b)
#define __mutex_destroy(a, b) __db_tas_mutex_destroy(a, b)
#endif
#ifdef HAVE_MUTEX_SUPPORT
#define MUTEX_LOCK(dbenv, mutex) do { \
if ((mutex) != MUTEX_INVALID && \
__mutex_lock(dbenv, mutex) != 0) \
return (DB_RUNRECOVERY); \
} while (0)
#define MUTEX_UNLOCK(dbenv, mutex) do { \
if ((mutex) != MUTEX_INVALID && \
__mutex_unlock(dbenv, mutex) != 0) \
return (DB_RUNRECOVERY); \
} while (0)
#else
#define MUTEX_LOCK(dbenv, mutex) \
(mutex) = (mutex);
#define MUTEX_UNLOCK(dbenv, mutex) \
(mutex) = (mutex);
#endif
#ifdef HAVE_MUTEX_VXWORKS
#include "taskLib.h"
#define DB_BEGIN_SINGLE_THREAD do { \
if (DB_GLOBAL(db_global_init)) \
(void)semTake(DB_GLOBAL(db_global_lock), WAIT_FOREVER); \
else { \
taskLock(); \
if (DB_GLOBAL(db_global_init)) { \
taskUnlock(); \
(void)semTake(DB_GLOBAL(db_global_lock), \
WAIT_FOREVER); \
continue; \
} \
DB_GLOBAL(db_global_lock) = \
semBCreate(SEM_Q_FIFO, SEM_EMPTY); \
if (DB_GLOBAL(db_global_lock) != NULL) \
DB_GLOBAL(db_global_init) = 1; \
taskUnlock(); \
} \
} while (DB_GLOBAL(db_global_init) == 0)
#define DB_END_SINGLE_THREAD (void)semGive(DB_GLOBAL(db_global_lock))
#endif
#ifndef DB_BEGIN_SINGLE_THREAD
#define DB_BEGIN_SINGLE_THREAD
#endif
#ifndef DB_END_SINGLE_THREAD
#define DB_END_SINGLE_THREAD
#endif
#if defined(__cplusplus)
}
#endif
#include "dbinc_auto/mutex_ext.h"
#endif