/*
* OS native thread abstraction.
*
- * Mimics C++11 / boost threads.
+ * Mimics C++11 threads.
*/
#ifndef _OS_THREAD_HPP_
#endif
+/*
+ * This feature is not supported on Windows XP
+ */
#define USE_WIN32_CONDITION_VARIABLES 0
* - http://gcc.gnu.org/onlinedocs/gcc-4.6.3/gcc/Thread_002dLocal.html
* - http://msdn.microsoft.com/en-us/library/9w1sdazb.aspx
*/
-#if defined(_MSC_VER)
-# define thread_specific __declspec(thread)
-#elif defined(__GNUC__)
-# define thread_specific __thread
+#if defined(HAVE_COMPILER_TLS)
+# define OS_THREAD_SPECIFIC_PTR(_type) HAVE_COMPILER_TLS _type *
#else
-# define thread_specific
-# error "Unsupported compiler"
+# define OS_THREAD_SPECIFIC_PTR(_type) os::thread_specific_ptr< _type >
#endif
};
- /**
- * Same interface as boost::thread_specific_ptr.
- */
template <typename T>
class thread_specific_ptr
{
DWORD dwTlsIndex;
#else
pthread_key_t key;
-
- static void destructor(void *ptr) {
- delete static_cast<T *>(ptr);
- }
#endif
public:
#ifdef _WIN32
dwTlsIndex = TlsAlloc();
#else
- pthread_key_create(&key, &destructor);
+ pthread_key_create(&key, NULL);
#endif
}
#endif
}
- T* get(void) const {
+ inline T *
+ get(void) const {
void *ptr;
#ifdef _WIN32
ptr = TlsGetValue(dwTlsIndex);
return static_cast<T*>(ptr);
}
- T* operator -> (void) const
+ inline
+ operator T * (void) const
{
return get();
}
- T& operator * (void) const
+ inline T *
+ operator -> (void) const
{
- return *get();
+ return get();
}
- void reset(T* new_value=0) {
- T * old_value = get();
+ inline T *
+ operator = (T * new_value)
+ {
set(new_value);
- if (old_value) {
- delete old_value;
- }
- }
-
- T* release (void) {
- T * old_value = get();
- set(0);
- return old_value;
+ return new_value;
}
-private:
- void set(T* new_value) {
+ inline void
+ set(T* new_value) {
#ifdef _WIN32
TlsSetValue(dwTlsIndex, new_value);
#else
{
}
+ inline
+ ~thread() {
+ }
+
template< class Function, class Arg >
explicit thread( Function& f, Arg arg ) {
#ifdef _WIN32
#endif
}
+ inline thread &
+ operator =(const thread &other) {
+ _native_handle = other._native_handle;
+ return *this;
+ }
+
inline bool
joinable(void) const {
return _native_handle != 0;