os/ossrv/ossrv_pub/boost_apis/boost/pool/detail/mutex.hpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Copyright (C) 2000 Stephen Cleary
sl@0
     2
//
sl@0
     3
// Distributed under the Boost Software License, Version 1.0. (See
sl@0
     4
// accompanying file LICENSE_1_0.txt or copy at
sl@0
     5
// http://www.boost.org/LICENSE_1_0.txt)
sl@0
     6
//
sl@0
     7
// See http://www.boost.org for updates, documentation, and revision history.
sl@0
     8
sl@0
     9
#ifndef BOOST_POOL_MUTEX_HPP
sl@0
    10
#define BOOST_POOL_MUTEX_HPP
sl@0
    11
sl@0
    12
#include <boost/config.hpp>  // for workarounds
sl@0
    13
sl@0
    14
// Extremely Light-Weight wrapper classes for OS thread synchronization
sl@0
    15
sl@0
    16
// Configuration: for now, we just choose between pthread or Win32 mutexes or none
sl@0
    17
sl@0
    18
#define BOOST_MUTEX_HELPER_NONE         0
sl@0
    19
#define BOOST_MUTEX_HELPER_WIN32        1
sl@0
    20
#define BOOST_MUTEX_HELPER_PTHREAD      2
sl@0
    21
sl@0
    22
#if !defined(BOOST_HAS_THREADS) && !defined(BOOST_NO_MT)
sl@0
    23
# define BOOST_NO_MT
sl@0
    24
#endif
sl@0
    25
sl@0
    26
#ifdef BOOST_NO_MT
sl@0
    27
  // No multithreading -> make locks into no-ops
sl@0
    28
  #define BOOST_MUTEX_HELPER BOOST_MUTEX_HELPER_NONE
sl@0
    29
#else
sl@0
    30
  #ifdef BOOST_WINDOWS
sl@0
    31
    #define BOOST_MUTEX_HELPER BOOST_MUTEX_HELPER_WIN32
sl@0
    32
  #else
sl@0
    33
    #include <unistd.h>
sl@0
    34
    #ifdef _POSIX_THREADS
sl@0
    35
      #define BOOST_MUTEX_HELPER BOOST_MUTEX_HELPER_PTHREAD
sl@0
    36
    #endif
sl@0
    37
  #endif
sl@0
    38
#endif
sl@0
    39
sl@0
    40
#ifndef BOOST_MUTEX_HELPER
sl@0
    41
  #error Unable to determine platform mutex type; define BOOST_NO_MT to assume single-threaded
sl@0
    42
#endif
sl@0
    43
sl@0
    44
#ifndef BOOST_NO_MT
sl@0
    45
# ifdef BOOST_WINDOWS
sl@0
    46
#  include <windows.h>
sl@0
    47
# endif
sl@0
    48
# ifdef _POSIX_THREADS
sl@0
    49
#  include <pthread.h>
sl@0
    50
# endif
sl@0
    51
#endif
sl@0
    52
sl@0
    53
namespace boost {
sl@0
    54
sl@0
    55
namespace details {
sl@0
    56
namespace pool {
sl@0
    57
sl@0
    58
#ifndef BOOST_NO_MT
sl@0
    59
sl@0
    60
#ifdef BOOST_WINDOWS
sl@0
    61
sl@0
    62
class win32_mutex
sl@0
    63
{
sl@0
    64
  private:
sl@0
    65
    CRITICAL_SECTION mtx;
sl@0
    66
sl@0
    67
    win32_mutex(const win32_mutex &);
sl@0
    68
    void operator=(const win32_mutex &);
sl@0
    69
sl@0
    70
  public:
sl@0
    71
    win32_mutex()
sl@0
    72
    { InitializeCriticalSection(&mtx); }
sl@0
    73
sl@0
    74
    ~win32_mutex()
sl@0
    75
    { DeleteCriticalSection(&mtx); }
sl@0
    76
sl@0
    77
    void lock()
sl@0
    78
    { EnterCriticalSection(&mtx); }
sl@0
    79
sl@0
    80
    void unlock()
sl@0
    81
    { LeaveCriticalSection(&mtx); }
sl@0
    82
};
sl@0
    83
sl@0
    84
#endif // defined(BOOST_WINDOWS)
sl@0
    85
sl@0
    86
#ifdef _POSIX_THREADS
sl@0
    87
sl@0
    88
class pthread_mutex
sl@0
    89
{
sl@0
    90
  private:
sl@0
    91
    pthread_mutex_t mtx;
sl@0
    92
sl@0
    93
    pthread_mutex(const pthread_mutex &);
sl@0
    94
    void operator=(const pthread_mutex &);
sl@0
    95
sl@0
    96
  public:
sl@0
    97
    pthread_mutex()
sl@0
    98
    { pthread_mutex_init(&mtx, 0); }
sl@0
    99
sl@0
   100
    ~pthread_mutex()
sl@0
   101
    { pthread_mutex_destroy(&mtx); }
sl@0
   102
sl@0
   103
    void lock()
sl@0
   104
    { pthread_mutex_lock(&mtx); }
sl@0
   105
sl@0
   106
    void unlock()
sl@0
   107
    { pthread_mutex_unlock(&mtx); }
sl@0
   108
};
sl@0
   109
sl@0
   110
#endif // defined(_POSIX_THREADS)
sl@0
   111
sl@0
   112
#endif // !defined(BOOST_NO_MT)
sl@0
   113
sl@0
   114
class null_mutex
sl@0
   115
{
sl@0
   116
  private:
sl@0
   117
    null_mutex(const null_mutex &);
sl@0
   118
    void operator=(const null_mutex &);
sl@0
   119
sl@0
   120
  public:
sl@0
   121
    null_mutex() { }
sl@0
   122
sl@0
   123
    static void lock() { }
sl@0
   124
    static void unlock() { }
sl@0
   125
};
sl@0
   126
sl@0
   127
#if BOOST_MUTEX_HELPER == BOOST_MUTEX_HELPER_NONE
sl@0
   128
  typedef null_mutex default_mutex;
sl@0
   129
#elif BOOST_MUTEX_HELPER == BOOST_MUTEX_HELPER_WIN32
sl@0
   130
  typedef win32_mutex default_mutex;
sl@0
   131
#elif BOOST_MUTEX_HELPER == BOOST_MUTEX_HELPER_PTHREAD
sl@0
   132
  typedef pthread_mutex default_mutex;
sl@0
   133
#endif
sl@0
   134
sl@0
   135
} // namespace pool
sl@0
   136
} // namespace details
sl@0
   137
sl@0
   138
} // namespace boost
sl@0
   139
sl@0
   140
#undef BOOST_MUTEX_HELPER_WIN32
sl@0
   141
#undef BOOST_MUTEX_HELPER_PTHREAD
sl@0
   142
#undef BOOST_MUTEX_HELPER_NONE
sl@0
   143
#undef BOOST_MUTEX_HELPER
sl@0
   144
sl@0
   145
#endif