aboutsummaryrefslogtreecommitdiff
path: root/odb/details
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2010-08-26 14:52:12 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2010-08-26 14:52:12 +0200
commit6fb470a39ef8900b71634333b0a2227dc8b62799 (patch)
tree6d782be7a2b25c3f21e9d25f7c7251bde2699994 /odb/details
parentc883d0ba2f4450f35de6767355555fa83e6262ea (diff)
Add support for creating other build systems (meta-building)
Add support for automake, VC++ 9, and VC++ 10. Also add the Win32 and 'NULL' threading model implementations.
Diffstat (limited to 'odb/details')
-rw-r--r--odb/details/buffer.hxx8
-rw-r--r--odb/details/condition.hxx38
-rw-r--r--odb/details/config-vc.h17
-rw-r--r--odb/details/config.h.in16
-rw-r--r--odb/details/config.hxx23
-rw-r--r--odb/details/exception.hxx8
-rw-r--r--odb/details/export.hxx29
-rw-r--r--odb/details/lock.hxx7
-rw-r--r--odb/details/meta/answer.hxx4
-rw-r--r--odb/details/meta/class-p.hxx4
-rw-r--r--odb/details/meta/polymorphic-p.hxx4
-rw-r--r--odb/details/meta/remove-c.hxx4
-rw-r--r--odb/details/meta/remove-cv.hxx4
-rw-r--r--odb/details/meta/remove-p.hxx4
-rw-r--r--odb/details/meta/remove-v.hxx4
-rw-r--r--odb/details/mutex.hxx37
-rw-r--r--odb/details/posix/condition.hxx7
-rw-r--r--odb/details/posix/exceptions.hxx7
-rw-r--r--odb/details/posix/mutex.hxx8
-rw-r--r--odb/details/posix/thread.hxx8
-rw-r--r--odb/details/posix/tls.hxx16
-rw-r--r--odb/details/shared-ptr.hxx4
-rw-r--r--odb/details/shared-ptr/base.hxx16
-rw-r--r--odb/details/thread.hxx14
-rw-r--r--odb/details/tls.hxx98
-rw-r--r--odb/details/win32/condition.cxx57
-rw-r--r--odb/details/win32/condition.hxx52
-rw-r--r--odb/details/win32/condition.ixx32
-rw-r--r--odb/details/win32/exceptions.cxx18
-rw-r--r--odb/details/win32/exceptions.hxx39
-rw-r--r--odb/details/win32/mutex.hxx46
-rw-r--r--odb/details/win32/mutex.ixx34
-rw-r--r--odb/details/win32/thread.cxx91
-rw-r--r--odb/details/win32/thread.hxx62
34 files changed, 799 insertions, 21 deletions
diff --git a/odb/details/buffer.hxx b/odb/details/buffer.hxx
index 4393114..87ee97f 100644
--- a/odb/details/buffer.hxx
+++ b/odb/details/buffer.hxx
@@ -6,14 +6,18 @@
#ifndef ODB_BUFFER_DETAILS_HXX
#define ODB_BUFFER_DETAILS_HXX
+#include <odb/pre.hxx>
+
#include <new>
#include <cstddef> // std::size_t
+#include <odb/details/export.hxx>
+
namespace odb
{
namespace details
{
- class buffer
+ class LIBODB_EXPORT buffer
{
public:
~buffer ()
@@ -56,4 +60,6 @@ namespace odb
}
}
+#include <odb/post.hxx>
+
#endif // ODB_BUFFER_DETAILS_HXX
diff --git a/odb/details/condition.hxx b/odb/details/condition.hxx
index 9e416d6..127d038 100644
--- a/odb/details/condition.hxx
+++ b/odb/details/condition.hxx
@@ -6,6 +6,44 @@
#ifndef ODB_DETAILS_CONDITION_HXX
#define ODB_DETAILS_CONDITION_HXX
+#include <odb/pre.hxx>
+
+#include <odb/details/config.hxx>
+#include <odb/details/export.hxx>
+
+#ifdef ODB_THREADS_NONE
+
+namespace odb
+{
+ namespace details
+ {
+ class mutex;
+ class LIBODB_EXPORT condition
+ {
+ public:
+ condition (mutex&) {}
+
+ void
+ signal () {}
+
+ void
+ wait () {}
+
+ private:
+ condition (const condition&);
+ condition& operator= (const condition&);
+ };
+ }
+}
+
+#elif defined(ODB_THREADS_POSIX)
#include <odb/details/posix/condition.hxx>
+#elif defined(ODB_THREADS_WIN32)
+#include <odb/details/win32/condition.hxx>
+#else
+# error unknown threading model
+#endif
+
+#include <odb/post.hxx>
#endif // ODB_DETAILS_CONDITION_HXX
diff --git a/odb/details/config-vc.h b/odb/details/config-vc.h
new file mode 100644
index 0000000..f90ac4d
--- /dev/null
+++ b/odb/details/config-vc.h
@@ -0,0 +1,17 @@
+/* file : odb/details/config-vc.h
+ * author : Boris Kolpackov <boris@codesynthesis.com>
+ * copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC
+ * license : GNU GPL v2; see accompanying LICENSE file
+ */
+
+/* Configuration file for Windows/VC++. */
+
+#ifndef ODB_DETAILS_CONFIG_VC_H
+#define ODB_DETAILS_CONFIG_VC_H
+
+#define ODB_THREADS_WIN32
+#define ODB_THREADS_TLS_DECLSPEC_POINTER
+#define ODB_THREADS_TLS_DECLSPEC_OBJECT
+
+
+#endif /* ODB_DETAILS_CONFIG_VC_H */
diff --git a/odb/details/config.h.in b/odb/details/config.h.in
new file mode 100644
index 0000000..aa2417d
--- /dev/null
+++ b/odb/details/config.h.in
@@ -0,0 +1,16 @@
+/* file : odb/details/config.h.in
+ * author : Boris Kolpackov <boris@codesynthesis.com>
+ * copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC
+ * license : GNU GPL v2; see accompanying LICENSE file
+ */
+
+/* This file is automatically processed by configure. */
+
+#ifndef ODB_DETAILS_CONFIG_H
+#define ODB_DETAILS_CONFIG_H
+
+#undef ODB_THREADS_NONE
+#undef ODB_THREADS_POSIX
+#undef ODB_THREADS_WIN32
+
+#endif /* ODB_DETAILS_CONFIG_H */
diff --git a/odb/details/config.hxx b/odb/details/config.hxx
new file mode 100644
index 0000000..c5b97df
--- /dev/null
+++ b/odb/details/config.hxx
@@ -0,0 +1,23 @@
+// file : odb/details/config.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#ifndef ODB_DETAILS_CONFIG_HXX
+#define ODB_DETAILS_CONFIG_HXX
+
+// no pre
+
+#ifdef _MSC_VER
+# include <odb/details/config-vc.h>
+#else
+# ifdef HAVE_CONFIG_H
+# include <odb/details/config.h>
+# else
+# define ODB_THREADS_POSIX
+# endif
+#endif
+
+// no post
+
+#endif // ODB_DETAILS_CONFIG_HXX
diff --git a/odb/details/exception.hxx b/odb/details/exception.hxx
index 2da18ac..cebb8ca 100644
--- a/odb/details/exception.hxx
+++ b/odb/details/exception.hxx
@@ -6,16 +6,22 @@
#ifndef ODB_DETAILS_EXCEPTION_HXX
#define ODB_DETAILS_EXCEPTION_HXX
+#include <odb/pre.hxx>
+
#include <odb/exception.hxx>
+#include <odb/details/export.hxx>
+
namespace odb
{
namespace details
{
- struct exception: odb::exception
+ struct LIBODB_EXPORT exception: odb::exception
{
};
}
}
+#include <odb/post.hxx>
+
#endif // ODB_DETAILS_EXCEPTION_HXX
diff --git a/odb/details/export.hxx b/odb/details/export.hxx
new file mode 100644
index 0000000..ef43c6c
--- /dev/null
+++ b/odb/details/export.hxx
@@ -0,0 +1,29 @@
+// file : odb/details/export.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#ifndef ODB_DETAILS_EXPORT_HXX
+#define ODB_DETAILS_EXPORT_HXX
+
+#include <odb/pre.hxx>
+
+#include <odb/details/config.hxx>
+
+#ifdef LIBODB_STATIC_LIB
+# define LIBODB_EXPORT
+#else
+# ifdef _WIN32
+# ifdef LIBODB_DYNAMIC_LIB
+# define LIBODB_EXPORT __declspec(dllexport)
+# else
+# define LIBODB_EXPORT __declspec(dllimport)
+# endif
+# else
+# define LIBODB_EXPORT
+# endif
+#endif
+
+#include <odb/post.hxx>
+
+#endif // ODB_DETAILS_EXPORT_HXX
diff --git a/odb/details/lock.hxx b/odb/details/lock.hxx
index 0ee5a6d..044dfdb 100644
--- a/odb/details/lock.hxx
+++ b/odb/details/lock.hxx
@@ -6,13 +6,16 @@
#ifndef ODB_DETAILS_LOCK_HXX
#define ODB_DETAILS_LOCK_HXX
+#include <odb/pre.hxx>
+
+#include <odb/details/export.hxx>
#include <odb/details/posix/mutex.hxx>
namespace odb
{
namespace details
{
- struct lock
+ struct LIBODB_EXPORT lock
{
lock (mutex& m)
: mutex_ (m), locked_ (true)
@@ -43,4 +46,6 @@ namespace odb
}
}
+#include <odb/post.hxx>
+
#endif // ODB_DETAILS_LOCK_HXX
diff --git a/odb/details/meta/answer.hxx b/odb/details/meta/answer.hxx
index 31387a9..f607c71 100644
--- a/odb/details/meta/answer.hxx
+++ b/odb/details/meta/answer.hxx
@@ -6,6 +6,8 @@
#ifndef ODB_DETAILS_META_ANSWER_HXX
#define ODB_DETAILS_META_ANSWER_HXX
+#include <odb/pre.hxx>
+
namespace odb
{
namespace details
@@ -25,4 +27,6 @@ namespace odb
}
}
+#include <odb/post.hxx>
+
#endif // ODB_DETAILS_META_ANSWER_HXX
diff --git a/odb/details/meta/class-p.hxx b/odb/details/meta/class-p.hxx
index c680d8e..dcbdda2 100644
--- a/odb/details/meta/class-p.hxx
+++ b/odb/details/meta/class-p.hxx
@@ -6,6 +6,8 @@
#ifndef ODB_DETAILS_META_CLASS_HXX
#define ODB_DETAILS_META_CLASS_HXX
+#include <odb/pre.hxx>
+
#include <odb/details/meta/answer.hxx>
namespace odb
@@ -28,4 +30,6 @@ namespace odb
}
}
+#include <odb/post.hxx>
+
#endif // ODB_DETAILS_META_CLASS_HXX
diff --git a/odb/details/meta/polymorphic-p.hxx b/odb/details/meta/polymorphic-p.hxx
index 6e95144..f6f122f 100644
--- a/odb/details/meta/polymorphic-p.hxx
+++ b/odb/details/meta/polymorphic-p.hxx
@@ -6,6 +6,8 @@
#ifndef ODB_DETAILS_META_POLYMORPHIC_HXX
#define ODB_DETAILS_META_POLYMORPHIC_HXX
+#include <odb/pre.hxx>
+
#include <odb/details/meta/class-p.hxx>
#include <odb/details/meta/remove-cv.hxx>
@@ -51,4 +53,6 @@ namespace odb
}
}
+#include <odb/post.hxx>
+
#endif // ODB_DETAILS_META_POLYMORPHIC_HXX
diff --git a/odb/details/meta/remove-c.hxx b/odb/details/meta/remove-c.hxx
index 9d8e0b5..6326e2a 100644
--- a/odb/details/meta/remove-c.hxx
+++ b/odb/details/meta/remove-c.hxx
@@ -6,6 +6,8 @@
#ifndef ODB_DETAILS_META_REMOVE_C_HXX
#define ODB_DETAILS_META_REMOVE_C_HXX
+#include <odb/pre.hxx>
+
namespace odb
{
namespace details
@@ -27,4 +29,6 @@ namespace odb
}
}
+#include <odb/post.hxx>
+
#endif // ODB_DETAILS_META_REMOVE_C_HXX
diff --git a/odb/details/meta/remove-cv.hxx b/odb/details/meta/remove-cv.hxx
index 958fc08..f5982e1 100644
--- a/odb/details/meta/remove-cv.hxx
+++ b/odb/details/meta/remove-cv.hxx
@@ -6,6 +6,8 @@
#ifndef ODB_DETAILS_META_REMOVE_CV_HXX
#define ODB_DETAILS_META_REMOVE_CV_HXX
+#include <odb/pre.hxx>
+
#include <odb/details/meta/remove-c.hxx>
#include <odb/details/meta/remove-v.hxx>
@@ -24,4 +26,6 @@ namespace odb
}
}
+#include <odb/post.hxx>
+
#endif // ODB_DETAILS_META_REMOVE_CV_HXX
diff --git a/odb/details/meta/remove-p.hxx b/odb/details/meta/remove-p.hxx
index c8f6d92..b017399 100644
--- a/odb/details/meta/remove-p.hxx
+++ b/odb/details/meta/remove-p.hxx
@@ -6,6 +6,8 @@
#ifndef ODB_DETAILS_META_REMOVE_P_HXX
#define ODB_DETAILS_META_REMOVE_P_HXX
+#include <odb/pre.hxx>
+
namespace odb
{
namespace details
@@ -27,4 +29,6 @@ namespace odb
}
}
+#include <odb/post.hxx>
+
#endif // ODB_DETAILS_META_REMOVE_P_HXX
diff --git a/odb/details/meta/remove-v.hxx b/odb/details/meta/remove-v.hxx
index c91b7e4..d77e9d2 100644
--- a/odb/details/meta/remove-v.hxx
+++ b/odb/details/meta/remove-v.hxx
@@ -6,6 +6,8 @@
#ifndef ODB_DETAILS_META_REMOVE_V_HXX
#define ODB_DETAILS_META_REMOVE_V_HXX
+#include <odb/pre.hxx>
+
namespace odb
{
namespace details
@@ -27,4 +29,6 @@ namespace odb
}
}
+#include <odb/post.hxx>
+
#endif // ODB_DETAILS_META_REMOVE_V_HXX
diff --git a/odb/details/mutex.hxx b/odb/details/mutex.hxx
index e1121b9..b0d59bb 100644
--- a/odb/details/mutex.hxx
+++ b/odb/details/mutex.hxx
@@ -6,6 +6,43 @@
#ifndef ODB_DETAILS_MUTEX_HXX
#define ODB_DETAILS_MUTEX_HXX
+#include <odb/pre.hxx>
+
+#include <odb/details/config.hxx>
+#include <odb/details/export.hxx>
+
+#ifdef ODB_THREADS_NONE
+
+namespace odb
+{
+ namespace details
+ {
+ class LIBODB_EXPORT mutex
+ {
+ public:
+ mutex () {}
+
+ void
+ lock () {}
+
+ void
+ unlock () {}
+
+ private:
+ mutex (const mutex&);
+ mutex& operator= (const mutex&);
+ };
+ }
+}
+
+#elif defined(ODB_THREADS_POSIX)
#include <odb/details/posix/mutex.hxx>
+#elif defined(ODB_THREADS_WIN32)
+#include <odb/details/win32/mutex.hxx>
+#else
+# error unknown threading model
+#endif
+
+#include <odb/post.hxx>
#endif // ODB_DETAILS_MUTEX_HXX
diff --git a/odb/details/posix/condition.hxx b/odb/details/posix/condition.hxx
index 8e8e05c..1358db8 100644
--- a/odb/details/posix/condition.hxx
+++ b/odb/details/posix/condition.hxx
@@ -6,15 +6,18 @@
#ifndef ODB_DETAILS_POSIX_CONDITION_HXX
#define ODB_DETAILS_POSIX_CONDITION_HXX
+#include <odb/pre.hxx>
+
#include <pthread.h>
+#include <odb/details/export.hxx>
#include <odb/details/posix/mutex.hxx>
namespace odb
{
namespace details
{
- class condition
+ class LIBODB_EXPORT condition
{
public:
~condition ();
@@ -39,4 +42,6 @@ namespace odb
#include <odb/details/posix/condition.ixx>
+#include <odb/post.hxx>
+
#endif // ODB_DETAILS_POSIX_CONDITION_HXX
diff --git a/odb/details/posix/exceptions.hxx b/odb/details/posix/exceptions.hxx
index f4b4572..76f5763 100644
--- a/odb/details/posix/exceptions.hxx
+++ b/odb/details/posix/exceptions.hxx
@@ -6,13 +6,16 @@
#ifndef ODB_DETAILS_POSIX_EXCEPTIONS_HXX
#define ODB_DETAILS_POSIX_EXCEPTIONS_HXX
+#include <odb/pre.hxx>
+
+#include <odb/details/export.hxx>
#include <odb/details/exception.hxx>
namespace odb
{
namespace details
{
- struct posix_exception: details::exception
+ struct LIBODB_EXPORT posix_exception: details::exception
{
posix_exception (int code) : code_ (code) {}
@@ -28,4 +31,6 @@ namespace odb
}
}
+#include <odb/post.hxx>
+
#endif // ODB_DETAILS_POSIX_EXCEPTIONS_HXX
diff --git a/odb/details/posix/mutex.hxx b/odb/details/posix/mutex.hxx
index d06a8c3..d62fa24 100644
--- a/odb/details/posix/mutex.hxx
+++ b/odb/details/posix/mutex.hxx
@@ -6,13 +6,17 @@
#ifndef ODB_DETAILS_POSIX_MUTEX_HXX
#define ODB_DETAILS_POSIX_MUTEX_HXX
+#include <odb/pre.hxx>
+
#include <pthread.h>
+#include <odb/details/export.hxx>
+
namespace odb
{
namespace details
{
- class mutex
+ class LIBODB_EXPORT mutex
{
public:
~mutex ();
@@ -37,4 +41,6 @@ namespace odb
#include <odb/details/posix/mutex.ixx>
+#include <odb/post.hxx>
+
#endif // ODB_DETAILS_POSIX_MUTEX_HXX
diff --git a/odb/details/posix/thread.hxx b/odb/details/posix/thread.hxx
index 5036b37..f2e2a75 100644
--- a/odb/details/posix/thread.hxx
+++ b/odb/details/posix/thread.hxx
@@ -6,13 +6,17 @@
#ifndef ODB_DETAILS_POSIX_THREAD_HXX
#define ODB_DETAILS_POSIX_THREAD_HXX
+#include <odb/pre.hxx>
+
#include <pthread.h>
+#include <odb/details/export.hxx>
+
namespace odb
{
namespace details
{
- class thread
+ class LIBODB_EXPORT thread
{
public:
~thread ();
@@ -34,4 +38,6 @@ namespace odb
#include <odb/details/posix/thread.ixx>
+#include <odb/post.hxx>
+
#endif // ODB_DETAILS_POSIX_THREAD_HXX
diff --git a/odb/details/posix/tls.hxx b/odb/details/posix/tls.hxx
index 6e11a64..92b0f4b 100644
--- a/odb/details/posix/tls.hxx
+++ b/odb/details/posix/tls.hxx
@@ -6,6 +6,8 @@
#ifndef ODB_DETAILS_POSIX_TLS_HXX
#define ODB_DETAILS_POSIX_TLS_HXX
+#include <odb/pre.hxx>
+
#include <pthread.h>
namespace odb
@@ -69,23 +71,23 @@ namespace odb
template <typename T>
inline T&
- tls_get (const tls<T>& s)
+ tls_get (const tls<T>& t)
{
- return s.get ();
+ return t.get ();
}
template <typename T>
inline T*
- tls_get (const tls<T*>& s)
+ tls_get (const tls<T*>& t)
{
- return s.get ();
+ return t.get ();
}
template <typename T>
inline void
- tls_set (tls<T*>& s, T* p)
+ tls_set (tls<T*>& t, T* p)
{
- return s.set (p);
+ t.set (p);
}
}
}
@@ -93,4 +95,6 @@ namespace odb
#include <odb/details/posix/tls.ixx>
#include <odb/details/posix/tls.txx>
+#include <odb/post.hxx>
+
#endif // ODB_DETAILS_POSIX_TLS_HXX
diff --git a/odb/details/shared-ptr.hxx b/odb/details/shared-ptr.hxx
index 6a9a640..dfa620c 100644
--- a/odb/details/shared-ptr.hxx
+++ b/odb/details/shared-ptr.hxx
@@ -6,6 +6,8 @@
#ifndef ODB_DETAILS_SHARED_PTR_HXX
#define ODB_DETAILS_SHARED_PTR_HXX
+#include <odb/pre.hxx>
+
#include <odb/details/shared-ptr/base.hxx>
namespace odb
@@ -159,4 +161,6 @@ namespace odb
}
}
+#include <odb/post.hxx>
+
#endif // ODB_DETAILS_SHARED_PTR_HXX
diff --git a/odb/details/shared-ptr/base.hxx b/odb/details/shared-ptr/base.hxx
index 4fbbc0b..309f7d2 100644
--- a/odb/details/shared-ptr/base.hxx
+++ b/odb/details/shared-ptr/base.hxx
@@ -6,16 +6,20 @@
#ifndef ODB_DETAILS_SHARED_PTR_BASE_HXX
#define ODB_DETAILS_SHARED_PTR_BASE_HXX
+#include <odb/pre.hxx>
+
#include <new>
#include <cstddef> // std::size_t
#include <odb/exception.hxx>
+#include <odb/details/export.hxx>
+
namespace odb
{
namespace details
{
- struct share
+ struct LIBODB_EXPORT share
{
explicit
share (char id);
@@ -32,23 +36,23 @@ namespace odb
}
}
-void*
+LIBODB_EXPORT void*
operator new (std::size_t, odb::details::share) throw (std::bad_alloc);
-void
+LIBODB_EXPORT void
operator delete (void*, odb::details::share) throw ();
namespace odb
{
namespace details
{
- struct not_shared: exception
+ struct LIBODB_EXPORT not_shared: exception
{
virtual const char*
what () const throw ();
};
- struct shared_base
+ struct LIBODB_EXPORT shared_base
{
shared_base ();
shared_base (const shared_base&);
@@ -105,4 +109,6 @@ namespace odb
#include <odb/details/shared-ptr/base.ixx>
#include <odb/details/shared-ptr/base.txx>
+#include <odb/post.hxx>
+
#endif // ODB_DETAILS_SHARED_PTR_BASE_HXX
diff --git a/odb/details/thread.hxx b/odb/details/thread.hxx
index 4dba45e..f3da490 100644
--- a/odb/details/thread.hxx
+++ b/odb/details/thread.hxx
@@ -6,6 +6,20 @@
#ifndef ODB_DETAILS_THREAD_HXX
#define ODB_DETAILS_THREAD_HXX
+#include <odb/pre.hxx>
+
+#include <odb/details/config.hxx>
+
+#ifdef ODB_THREADS_NONE
+# error no thread support available
+#elif defined(ODB_THREADS_POSIX)
#include <odb/details/posix/thread.hxx>
+#elif defined(ODB_THREADS_WIN32)
+#include <odb/details/win32/thread.hxx>
+#else
+# error unknown threading model
+#endif
+
+#include <odb/post.hxx>
#endif // ODB_DETAILS_THREAD_HXX
diff --git a/odb/details/tls.hxx b/odb/details/tls.hxx
index 6d38e6b..7ce5c19 100644
--- a/odb/details/tls.hxx
+++ b/odb/details/tls.hxx
@@ -6,9 +6,101 @@
#ifndef ODB_DETAILS_TLS_HXX
#define ODB_DETAILS_TLS_HXX
-#include <odb/details/posix/tls.hxx>
+#include <odb/pre.hxx>
-#define ODB_TLS_POINTER(type) tls<type*>
-#define ODB_TLS_OBJECT(type) tls<type>
+#include <odb/details/config.hxx>
+
+#ifdef ODB_THREADS_NONE
+
+# define ODB_TLS_POINTER(type) type*
+# define ODB_TLS_OBJECT(type) type
+
+namespace odb
+{
+ namespace details
+ {
+ template <typename T>
+ inline T&
+ tls_get (T& x)
+ {
+ return x;
+ }
+
+ template <typename T>
+ inline T*
+ tls_get (T* p)
+ {
+ return p;
+ }
+
+ template <typename T>
+ inline void
+ tls_set (T*& rp, T* p)
+ {
+ rp = p;
+ }
+ }
+}
+
+#elif defined(ODB_THREADS_POSIX)
+
+# include <odb/details/posix/tls.hxx>
+# define ODB_TLS_POINTER(type) tls<type*>
+# define ODB_TLS_OBJECT(type) tls<type>
+
+#elif defined(ODB_THREADS_WIN32)
+
+# ifdef ODB_THREADS_TLS_DECLSPEC_POINTER
+# define ODB_TLS_POINTER(type) __declspec(thread) type*
+
+namespace odb
+{
+ namespace details
+ {
+ template <typename T>
+ inline T*
+ tls_get (T* p)
+ {
+ return p;
+ }
+
+ template <typename T>
+ inline void
+ tls_set (T*& rp, T* p)
+ {
+ rp = p;
+ }
+ }
+}
+
+# else
+# error unsupported TLS pointer model
+# endif
+
+# ifdef ODB_THREADS_TLS_DECLSPEC_OBJECT
+# define ODB_TLS_OBJECT(type) __declspec(thread) type
+
+namespace odb
+{
+ namespace details
+ {
+ template <typename T>
+ inline T&
+ tls_get (T& x)
+ {
+ return x;
+ }
+ }
+}
+
+# else
+# error unsupported TLS object model
+# endif
+
+#else
+# error unknown threading model
+#endif
+
+#include <odb/post.hxx>
#endif // ODB_DETAILS_TLS_HXX
diff --git a/odb/details/win32/condition.cxx b/odb/details/win32/condition.cxx
new file mode 100644
index 0000000..93c396b
--- /dev/null
+++ b/odb/details/win32/condition.cxx
@@ -0,0 +1,57 @@
+// file : odb/details/win32/condition.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#include <windows.h>
+
+#include <odb/details/win32/condition.hxx>
+#include <odb/details/win32/exceptions.hxx>
+
+namespace odb
+{
+ namespace details
+ {
+ void condition::
+ signal ()
+ {
+ mutex_.lock ();
+
+ if (waiters_ > signals_)
+ {
+ if (signals_++ == 0)
+ {
+ if (SetEvent (event_) == 0)
+ throw win32_exception ();
+ }
+ }
+
+ mutex_.unlock ();
+ }
+
+ void condition::
+ wait ()
+ {
+ // When we enter this functions the mutex is locked. When we
+ // return from this function the mutex must be locked.
+ //
+ waiters_++;
+ mutex_.unlock ();
+
+ if (WaitForSingleObject (event_, INFINITE) != 0)
+ throw win32_exception ();
+
+ mutex_.lock ();
+ waiters_--;
+ signals_--;
+
+ if (signals_ > 0)
+ {
+ // Wake up the next thread.
+ //
+ if (SetEvent (event_) == 0)
+ throw win32_exception ();
+ }
+ }
+ }
+}
diff --git a/odb/details/win32/condition.hxx b/odb/details/win32/condition.hxx
new file mode 100644
index 0000000..3c40f3a
--- /dev/null
+++ b/odb/details/win32/condition.hxx
@@ -0,0 +1,52 @@
+// file : odb/details/win32/condition.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#ifndef ODB_DETAILS_WIN32_CONDITION_HXX
+#define ODB_DETAILS_WIN32_CONDITION_HXX
+
+#include <odb/pre.hxx>
+
+#include <windows.h>
+
+#include <cstddef> // std::size_t
+
+#include <odb/details/export.hxx>
+#include <odb/details/win32/mutex.hxx>
+
+namespace odb
+{
+ namespace details
+ {
+ class LIBODB_EXPORT condition
+ {
+ public:
+ ~condition ();
+ condition (mutex&);
+
+ void
+ signal ();
+
+ void
+ wait ();
+
+ private:
+ condition (const condition&);
+ condition& operator= (const condition&);
+
+ private:
+ mutex& mutex_;
+ HANDLE event_;
+
+ std::size_t waiters_;
+ std::size_t signals_;
+ };
+ }
+}
+
+#include <odb/details/win32/condition.ixx>
+
+#include <odb/post.hxx>
+
+#endif // ODB_DETAILS_WIN32_CONDITION_HXX
diff --git a/odb/details/win32/condition.ixx b/odb/details/win32/condition.ixx
new file mode 100644
index 0000000..4a6bd1d
--- /dev/null
+++ b/odb/details/win32/condition.ixx
@@ -0,0 +1,32 @@
+// file : odb/details/win32/condition.ixx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#include <odb/details/win32/exceptions.hxx>
+
+namespace odb
+{
+ namespace details
+ {
+ inline condition::
+ ~condition ()
+ {
+ CloseHandle (event_);
+ }
+
+ inline condition::
+ condition (mutex& mutex)
+ : mutex_ (mutex), waiters_ (0), signals_ (0)
+ {
+ // Auto-reset event. Releases one waiting thread and automatically
+ // resets the event state. If no threads are waiting the event
+ // remains signalled.
+ //
+ event_ = CreateEvent (0, false, false, 0);
+
+ if (event_ == 0)
+ throw win32_exception ();
+ }
+ }
+}
diff --git a/odb/details/win32/exceptions.cxx b/odb/details/win32/exceptions.cxx
new file mode 100644
index 0000000..e8652cd
--- /dev/null
+++ b/odb/details/win32/exceptions.cxx
@@ -0,0 +1,18 @@
+// file : odb/details/win32/exceptions.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#include <odb/details/win32/exceptions.hxx>
+
+namespace odb
+{
+ namespace details
+ {
+ const char* win32_exception::
+ what () const throw ()
+ {
+ return "Win32 API error";
+ }
+ }
+}
diff --git a/odb/details/win32/exceptions.hxx b/odb/details/win32/exceptions.hxx
new file mode 100644
index 0000000..b9ccf50
--- /dev/null
+++ b/odb/details/win32/exceptions.hxx
@@ -0,0 +1,39 @@
+// file : odb/details/win32/exceptions.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#ifndef ODB_DETAILS_WIN32_EXCEPTIONS_HXX
+#define ODB_DETAILS_WIN32_EXCEPTIONS_HXX
+
+#include <odb/pre.hxx>
+
+#include <windows.h>
+
+#include <odb/details/export.hxx>
+#include <odb/details/exception.hxx>
+
+namespace odb
+{
+ namespace details
+ {
+ struct LIBODB_EXPORT win32_exception: details::exception
+ {
+ win32_exception () : code_ (GetLastError ()) {}
+ win32_exception (DWORD code) : code_ (code) {}
+
+ DWORD
+ code () const {return code_;}
+
+ virtual const char*
+ what () const throw ();
+
+ private:
+ DWORD code_;
+ };
+ }
+}
+
+#include <odb/post.hxx>
+
+#endif // ODB_DETAILS_WIN32_EXCEPTIONS_HXX
diff --git a/odb/details/win32/mutex.hxx b/odb/details/win32/mutex.hxx
new file mode 100644
index 0000000..9dbe3a8
--- /dev/null
+++ b/odb/details/win32/mutex.hxx
@@ -0,0 +1,46 @@
+// file : odb/details/win32/mutex.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#ifndef ODB_DETAILS_WIN32_MUTEX_HXX
+#define ODB_DETAILS_WIN32_MUTEX_HXX
+
+#include <odb/pre.hxx>
+
+#include <windows.h>
+
+#include <odb/details/export.hxx>
+
+namespace odb
+{
+ namespace details
+ {
+ class LIBODB_EXPORT mutex
+ {
+ public:
+ ~mutex ();
+ mutex ();
+
+ void
+ lock ();
+
+ void
+ unlock ();
+
+ private:
+ mutex (const mutex&);
+ mutex& operator= (const mutex&);
+
+ private:
+ friend class condition;
+ CRITICAL_SECTION cs_;
+ };
+ }
+}
+
+#include <odb/details/win32/mutex.ixx>
+
+#include <odb/post.hxx>
+
+#endif // ODB_DETAILS_WIN32_MUTEX_HXX
diff --git a/odb/details/win32/mutex.ixx b/odb/details/win32/mutex.ixx
new file mode 100644
index 0000000..a2b6d37
--- /dev/null
+++ b/odb/details/win32/mutex.ixx
@@ -0,0 +1,34 @@
+// file : odb/details/win32/mutex.ixx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+namespace odb
+{
+ namespace details
+ {
+ inline mutex::
+ ~mutex ()
+ {
+ DeleteCriticalSection (&cs_);
+ }
+
+ inline mutex::
+ mutex ()
+ {
+ InitializeCriticalSection (&cs_);
+ }
+
+ inline void mutex::
+ lock ()
+ {
+ EnterCriticalSection (&cs_);
+ }
+
+ inline void mutex::
+ unlock ()
+ {
+ LeaveCriticalSection (&cs_);
+ }
+ }
+}
diff --git a/odb/details/win32/thread.cxx b/odb/details/win32/thread.cxx
new file mode 100644
index 0000000..610980d
--- /dev/null
+++ b/odb/details/win32/thread.cxx
@@ -0,0 +1,91 @@
+// file : odb/details/win32/thread.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#include <windows.h>
+#include <process.h> // _beginthreadex, _endthreadex
+
+#include <memory> // std::auto_ptr
+
+#include <odb/details/win32/thread.hxx>
+#include <odb/details/win32/exceptions.hxx>
+
+unsigned int __stdcall
+odb_thread_thunk (void* arg)
+{
+ odb::details::thread::thread_thunk (arg);
+ _endthreadex (0);
+ return 0;
+}
+
+namespace odb
+{
+ namespace details
+ {
+ void thread::
+ thread_thunk (void* arg)
+ {
+ data* d (static_cast<data*> (arg));
+ d->ret = d->func (d->arg);
+ d->mutex.lock ();
+ unsigned char count = --d->count;
+ d->mutex.unlock ();
+
+ if (count == 0)
+ delete d;
+ }
+
+ thread::
+ ~thread ()
+ {
+ if (handle_ != 0)
+ {
+ CloseHandle (handle_);
+
+ // Win32 mutex implementation does not throw.
+ //
+ data_->mutex.lock ();
+ unsigned char count = --data_->count;
+ data_->mutex.unlock ();
+
+ if (count == 0)
+ delete data_;
+ }
+ }
+
+ thread::
+ thread (void* (*func) (void*), void* arg)
+ {
+ std::auto_ptr<data> d (new data);
+ d->func = func;
+ d->arg = arg;
+ d->count = 2; // One for the thread and one for us.
+
+ handle_ = (HANDLE)_beginthreadex (
+ 0, 0, &odb_thread_thunk, d.get (), 0, 0);
+
+ if (handle_ == 0)
+ throw win32_exception ();
+
+ data_ = d.release ();
+ }
+
+ void* thread::
+ join ()
+ {
+ void* r;
+
+ if (WaitForSingleObject (handle_, INFINITE) != 0)
+ throw win32_exception ();
+
+ r = data_->ret;
+
+ CloseHandle (handle_);
+ delete data_;
+ handle_ = 0;
+ data_ = 0;
+ return r;
+ }
+ }
+}
diff --git a/odb/details/win32/thread.hxx b/odb/details/win32/thread.hxx
new file mode 100644
index 0000000..d52de48
--- /dev/null
+++ b/odb/details/win32/thread.hxx
@@ -0,0 +1,62 @@
+// file : odb/details/win32/thread.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#ifndef ODB_DETAILS_WIN32_THREAD_HXX
+#define ODB_DETAILS_WIN32_THREAD_HXX
+
+#include <odb/pre.hxx>
+
+#include <windows.h>
+
+#include <odb/details/export.hxx>
+#include <odb/details/win32/mutex.hxx>
+
+namespace odb
+{
+ namespace details
+ {
+ class LIBODB_EXPORT thread
+ {
+ public:
+ ~thread ();
+ thread (void* (*thread_func) (void*), void* arg = 0);
+
+ void*
+ join ();
+
+ private:
+ thread (const thread&);
+ thread& operator= (const thread&);
+
+ private:
+ typedef void* (*thread_func) (void*);
+
+ struct data
+ {
+ thread_func func;
+ void* arg;
+ void* ret;
+
+ // Thread-safe reference counter.
+ //
+ details::mutex mutex;
+ unsigned char count;
+ };
+
+
+ public:
+ static void
+ thread_thunk (void*);
+
+ private:
+ HANDLE handle_;
+ data* data_;
+ };
+ }
+}
+
+#include <odb/post.hxx>
+
+#endif // ODB_DETAILS_WIN32_THREAD_HXX