// Copyright (C) 2000 Stephen Cleary | |
// | |
// Distributed under the Boost Software License, Version 1.0. (See | |
// accompanying file LICENSE_1_0.txt or copy at | |
// http://www.boost.org/LICENSE_1_0.txt) | |
// | |
// See http://www.boost.org for updates, documentation, and revision history. | |
#ifndef BOOST_POOL_MUTEX_HPP | |
#define BOOST_POOL_MUTEX_HPP | |
#include <boost/config.hpp> // for workarounds | |
// Extremely Light-Weight wrapper classes for OS thread synchronization | |
// Configuration: for now, we just choose between pthread or Win32 mutexes or none | |
#define BOOST_MUTEX_HELPER_NONE 0 | |
#define BOOST_MUTEX_HELPER_WIN32 1 | |
#define BOOST_MUTEX_HELPER_PTHREAD 2 | |
#if !defined(BOOST_HAS_THREADS) && !defined(BOOST_NO_MT) | |
# define BOOST_NO_MT | |
#endif | |
#ifdef BOOST_NO_MT | |
// No multithreading -> make locks into no-ops | |
#define BOOST_MUTEX_HELPER BOOST_MUTEX_HELPER_NONE | |
#else | |
#ifdef BOOST_WINDOWS | |
#define BOOST_MUTEX_HELPER BOOST_MUTEX_HELPER_WIN32 | |
#else | |
#if defined(BOOST_HAS_UNISTD_H) | |
#include <unistd.h> | |
#endif | |
#if defined(_POSIX_THREADS) || defined(BOOST_HAS_PTHREADS) | |
#define BOOST_MUTEX_HELPER BOOST_MUTEX_HELPER_PTHREAD | |
#endif | |
#endif | |
#endif | |
#ifndef BOOST_MUTEX_HELPER | |
#error Unable to determine platform mutex type; define BOOST_NO_MT to assume single-threaded | |
#endif | |
#ifndef BOOST_NO_MT | |
# ifdef BOOST_WINDOWS | |
# include <windows.h> | |
# endif | |
# if defined(_POSIX_THREADS) || defined(BOOST_HAS_PTHREADS) | |
# include <pthread.h> | |
# endif | |
#endif | |
namespace boost { | |
namespace details { | |
namespace pool { | |
#ifndef BOOST_NO_MT | |
#ifdef BOOST_WINDOWS | |
class win32_mutex | |
{ | |
private: | |
::CRITICAL_SECTION mtx; | |
win32_mutex(const win32_mutex &); | |
void operator=(const win32_mutex &); | |
public: | |
win32_mutex() | |
{ ::InitializeCriticalSection(&mtx); } | |
~win32_mutex() | |
{ ::DeleteCriticalSection(&mtx); } | |
void lock() | |
{ ::EnterCriticalSection(&mtx); } | |
void unlock() | |
{ ::LeaveCriticalSection(&mtx); } | |
}; | |
#endif // defined(BOOST_WINDOWS) | |
#if defined(_POSIX_THREADS) || defined(BOOST_HAS_PTHREADS) | |
class pthread_mutex | |
{ | |
private: | |
::pthread_mutex_t mtx; | |
pthread_mutex(const pthread_mutex &); | |
void operator=(const pthread_mutex &); | |
public: | |
pthread_mutex() | |
{ ::pthread_mutex_init(&mtx, 0); } | |
~pthread_mutex() | |
{ ::pthread_mutex_destroy(&mtx); } | |
void lock() | |
{ ::pthread_mutex_lock(&mtx); } | |
void unlock() | |
{ ::pthread_mutex_unlock(&mtx); } | |
}; | |
#endif // defined(_POSIX_THREADS) || defined(BOOST_HAS_PTHREADS) | |
#endif // !defined(BOOST_NO_MT) | |
class null_mutex | |
{ | |
private: | |
null_mutex(const null_mutex &); | |
void operator=(const null_mutex &); | |
public: | |
null_mutex() { } | |
static void lock() { } | |
static void unlock() { } | |
}; | |
#if BOOST_MUTEX_HELPER == BOOST_MUTEX_HELPER_NONE | |
typedef null_mutex default_mutex; | |
#elif BOOST_MUTEX_HELPER == BOOST_MUTEX_HELPER_WIN32 | |
typedef win32_mutex default_mutex; | |
#elif BOOST_MUTEX_HELPER == BOOST_MUTEX_HELPER_PTHREAD | |
typedef pthread_mutex default_mutex; | |
#endif | |
} // namespace pool | |
} // namespace details | |
} // namespace boost | |
#undef BOOST_MUTEX_HELPER_WIN32 | |
#undef BOOST_MUTEX_HELPER_PTHREAD | |
#undef BOOST_MUTEX_HELPER_NONE | |
#undef BOOST_MUTEX_HELPER | |
#endif |