]> git.cworth.org Git - apitrace/commitdiff
Revert "Remove os::thread_specific_ptr"
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Tue, 23 Apr 2013 08:42:48 +0000 (09:42 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Tue, 23 Apr 2013 13:05:59 +0000 (14:05 +0100)
This reverts commit 67ec200baea241d55bea33c43fd5194d90d9e401.

common/os_thread.hpp

index 2c3f73250893e9beba24bc84781acedf8f1e4775..5ec7f5dd00aa3d6a484532076a453c04f41c4c8f 100644 (file)
@@ -26,7 +26,7 @@
 /*
  * OS native thread abstraction.
  *
- * Mimics C++11 threads.
+ * Mimics C++11 / boost threads.
  */
 
 #ifndef _OS_THREAD_HPP_
@@ -283,6 +283,85 @@ namespace os {
     };
 
 
+    /**
+     * Same interface as boost::thread_specific_ptr.
+     */
+    template <typename T>
+    class thread_specific_ptr
+    {
+    private:
+#ifdef _WIN32
+        DWORD dwTlsIndex;
+#else
+        pthread_key_t key;
+
+        static void destructor(void *ptr) {
+            delete static_cast<T *>(ptr);
+        }
+#endif
+
+    public:
+        thread_specific_ptr(void) {
+#ifdef _WIN32
+            dwTlsIndex = TlsAlloc();
+#else
+            pthread_key_create(&key, &destructor);
+#endif
+        }
+
+        ~thread_specific_ptr() {
+#ifdef _WIN32
+            TlsFree(dwTlsIndex);
+#else
+            pthread_key_delete(key);
+#endif
+        }
+
+        T* get(void) const {
+            void *ptr;
+#ifdef _WIN32
+            ptr = TlsGetValue(dwTlsIndex);
+#else
+            ptr = pthread_getspecific(key);
+#endif
+            return static_cast<T*>(ptr);
+        }
+
+        T* operator -> (void) const
+        {
+            return get();
+        }
+
+        T& operator * (void) const
+        {
+            return *get();
+        }
+
+        void reset(T* new_value=0) {
+            T * old_value = get();
+            set(new_value);
+            if (old_value) {
+                delete old_value;
+            }
+        }
+
+        T* release (void) {
+            T * old_value = get();
+            set(0);
+            return old_value;
+        }
+
+private:
+        void set(T* new_value) {
+#ifdef _WIN32
+            TlsSetValue(dwTlsIndex, new_value);
+#else
+            pthread_setspecific(key, new_value);
+#endif
+        }
+    };
+
+
     /**
      * Same interface as std::thread
      */