mirror of
https://github.com/MariaDB/server.git
synced 2025-01-20 22:12:30 +01:00
142 lines
4.3 KiB
C
142 lines
4.3 KiB
C
/*-
|
|
* See the file LICENSE for redistribution information.
|
|
*
|
|
* Copyright (c) 1996-2005
|
|
* Sleepycat Software. All rights reserved.
|
|
*
|
|
* $Id: mutex.h,v 12.14 2005/10/13 00:56:52 bostic Exp $
|
|
*/
|
|
|
|
#ifndef _DB_MUTEX_H_
|
|
#define _DB_MUTEX_H_
|
|
|
|
/*
|
|
* Mutexes are represented by unsigned, 32-bit integral values. As the
|
|
* OOB value is 0, mutexes can be initialized by zero-ing out the memory
|
|
* in which they reside.
|
|
*/
|
|
#define MUTEX_INVALID 0
|
|
|
|
/*
|
|
* We track mutex allocations by ID.
|
|
*/
|
|
#define MTX_APPLICATION 1
|
|
#define MTX_DB_HANDLE 2
|
|
#define MTX_ENV_DBLIST 3
|
|
#define MTX_ENV_REGION 4
|
|
#define MTX_LOCK_REGION 5
|
|
#define MTX_LOGICAL_LOCK 6
|
|
#define MTX_LOG_FILENAME 7
|
|
#define MTX_LOG_FLUSH 8
|
|
#define MTX_LOG_HANDLE 9
|
|
#define MTX_LOG_REGION 10
|
|
#define MTX_MPOOLFILE_HANDLE 11
|
|
#define MTX_MPOOL_BUFFER 12
|
|
#define MTX_MPOOL_FH 13
|
|
#define MTX_MPOOL_HANDLE 14
|
|
#define MTX_MPOOL_HASH_BUCKET 15
|
|
#define MTX_MPOOL_REGION 16
|
|
#define MTX_MUTEX_REGION 17
|
|
#define MTX_MUTEX_TEST 18
|
|
#define MTX_REP_DATABASE 19
|
|
#define MTX_REP_REGION 20
|
|
#define MTX_SEQUENCE 21
|
|
#define MTX_TWISTER 22
|
|
#define MTX_TXN_ACTIVE 23
|
|
#define MTX_TXN_CHKPT 24
|
|
#define MTX_TXN_COMMIT 25
|
|
#define MTX_TXN_REGION 26
|
|
#define MTX_MAX_ENTRY 26
|
|
|
|
/* Redirect mutex calls to the correct functions. */
|
|
#if 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)
|
|
#endif
|
|
|
|
#if 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)
|
|
#endif
|
|
|
|
#if 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)
|
|
#endif
|
|
|
|
#ifndef __mutex_init /* Test-and-set is the default */
|
|
#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
|
|
|
|
/*
|
|
* Lock/unlock a mutex. If the mutex was never required, the thread of
|
|
* control can proceed without it.
|
|
*
|
|
* We never fail to acquire or release a mutex without panicing. Simplify
|
|
* the macros to always return a panic value rather than saving the actual
|
|
* return value of the mutex routine.
|
|
*/
|
|
#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)
|
|
|
|
/*
|
|
* Berkeley DB ports may require single-threading at places in the code.
|
|
*/
|
|
#ifdef HAVE_MUTEX_VXWORKS
|
|
#include "taskLib.h"
|
|
/*
|
|
* Use the taskLock() mutex to eliminate a race where two tasks are
|
|
* trying to initialize the global lock at the same time.
|
|
*/
|
|
#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
|
|
|
|
/*
|
|
* Single-threading defaults to a no-op.
|
|
*/
|
|
#ifndef DB_BEGIN_SINGLE_THREAD
|
|
#define DB_BEGIN_SINGLE_THREAD
|
|
#endif
|
|
#ifndef DB_END_SINGLE_THREAD
|
|
#define DB_END_SINGLE_THREAD
|
|
#endif
|
|
|
|
#include "dbinc_auto/mutex_ext.h"
|
|
#endif /* !_DB_MUTEX_H_ */
|