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