fix TLS support for platforms (e.g. Mac OS X) where __thread storage class doesn...
authorMorgan Deters <mdeters@gmail.com>
Tue, 28 Sep 2010 20:09:33 +0000 (20:09 +0000)
committerMorgan Deters <mdeters@gmail.com>
Tue, 28 Sep 2010 20:09:33 +0000 (20:09 +0000)
src/expr/node_manager.cpp
src/expr/node_manager.h
src/util/tls.h.in

index 31b848885af3f25e39a39a6a59bdcc0895e60fe2..5d99fb31ef638dc74b70493a7e370b4070926494 100644 (file)
@@ -39,7 +39,7 @@ using __gnu_cxx::hash_set;
 
 namespace CVC4 {
 
-CVC4_THREADLOCAL(NodeManager*) NodeManager::s_current = 0;
+CVC4_THREADLOCAL(NodeManager*) NodeManager::s_current = NULL;
 
 /**
  * This class sets it reference argument to true and ensures that it gets set
index 5fb7c57ad3b4d4d0dccd2bdf02a06700f785e9dd..4f658c507cc60eb1268db168e96760acf6bd7218 100644 (file)
@@ -562,11 +562,12 @@ public:
  */
 class NodeManagerScope {
   /** The old NodeManager, to be restored on destruction. */
-  NodeManager *d_oldNodeManager;
+  NodeManagerd_oldNodeManager;
 
 public:
 
-  NodeManagerScope(NodeManager* nm) : d_oldNodeManager(NodeManager::s_current) {
+  NodeManagerScope(NodeManager* nm) :
+    d_oldNodeManager(NodeManager::s_current) {
     NodeManager::s_current = nm;
     Debug("current") << "node manager scope: "
                      << NodeManager::s_current << "\n";
index 29a52497a4977df99365fa22705a03211a6ccd8c..80eac93b0ffaab38a4ab7ddac6ab921af21c09a0 100644 (file)
@@ -24,6 +24,8 @@
 #ifndef __CVC4__TLS_H
 #define __CVC4__TLS_H
 
+#line 28 "@srcdir@/tls.h.in"
+
 #if @CVC4_TLS_SUPPORTED@
 #  define CVC4_THREADLOCAL(__type) @CVC4_TLS@ __type
 #  define CVC4_THREADLOCAL_PUBLIC(__type) @CVC4_TLS@ CVC4_PUBLIC __type
@@ -49,7 +51,7 @@ public:
     pthread_key_create(&d_key, ThreadLocalImpl::cleanup);
   }
 
-  ThreadLocalImpl(T t) {
+  ThreadLocalImpl(const T& t) {
     pthread_key_create(&d_key, ThreadLocalImpl::cleanup);
     pthread_setspecific(d_key, const_cast<void*>(reinterpret_cast<const void*>(t)));
   }
@@ -73,6 +75,10 @@ public:
   }
 };/* class ThreadLocalImpl<T, true> */
 
+template <class T>
+class ThreadLocalImpl<T, false> {
+};/* class ThreadLocalImpl<T, false> */
+
 template <class T>
 class ThreadLocal : public ThreadLocalImpl<T, sizeof(T) <= sizeof(void*)> {
   typedef ThreadLocalImpl<T, sizeof(T) <= sizeof(void*)> super;
@@ -81,6 +87,13 @@ public:
   ThreadLocal() : super() {}
   ThreadLocal(const T& t) : super(t) {}
   ThreadLocal(const ThreadLocal<T>& tl) : super(tl) {}
+
+  ThreadLocal<T>& operator=(const T& t) {
+    return static_cast< ThreadLocal<T>& >(super::operator=(t));
+  }
+  ThreadLocal<T>& operator=(const ThreadLocal<T>& tl) {
+    return static_cast< ThreadLocal<T>& >(super::operator=(tl));
+  }
 };/* class ThreadLocal<T> */
 
 }/* CVC4 namespace */