00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef THREAD_STATIC_BASE_HPP
00021 #define THREAD_STATIC_BASE_HPP
00022
00023 #include <config.h>
00024 #include <Assert.hpp>
00025
00026 #ifdef HAVE_PTHREAD
00027 #include <pthread.h>
00028
00029 #include <map>
00030
00040 template <typename EmbeddingClass>
00041 class ThreadStaticBase
00042 {
00043 protected:
00044 static std::map<pthread_t, EmbeddingClass*> __pInstances;
00045
00046 public:
00052 static EmbeddingClass& instance()
00053 {
00054 const pthread_t threadId = pthread_self();
00055 ASSERT(__pInstances.find(threadId) != __pInstances.end());
00056 return *(__pInstances[threadId]);
00057 }
00058
00063 static void create()
00064 {
00065 const pthread_t threadId = pthread_self();
00066 ASSERT(__pInstances.find(threadId) == __pInstances.end());
00067 __pInstances[threadId] = new EmbeddingClass();
00068 }
00069
00074 static void destroy()
00075 {
00076 const pthread_t threadId = pthread_self();
00077 ASSERT(__pInstances.find(threadId) != __pInstances.end());
00078 delete __pInstances[threadId];
00079 __pInstances.erase(threadId);
00080 }
00081
00086 ThreadStaticBase()
00087 {
00088 ;
00089 }
00090
00095 ~ThreadStaticBase()
00096 {
00097 ;
00098 }
00099 };
00100
00101 template <typename EmbeddingClass> std::map<pthread_t, EmbeddingClass*>
00102 ThreadStaticBase<EmbeddingClass>::__pInstances;
00103
00104 #else // HAVE_PTHREAD
00105
00106 #include <StaticBase.hpp>
00107
00108
00109
00110 template <typename T>
00111 struct ThreadStaticBase
00112 : public StaticBase<T>
00113 {
00118 ThreadStaticBase()
00119 {
00120 ;
00121 }
00122
00127 ~ThreadStaticBase()
00128 {
00129 ;
00130 }
00131 };
00132
00133 #endif // HAVE_PTHREAD
00134
00135 #endif // THREAD_STATIC_BASE_HPP