00001 #ifndef HIDDEN_FROM_DOC
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef _SB_THREAD_STORAGE_BASE_H_
00028 #define _SB_THREAD_STORAGE_BASE_H_
00029
00030 #include <Inventor/SoInventorBase.h>
00031 #include <Inventor/threads/SbThreadLocalStorage.h>
00032 #include <Inventor/threads/SbThreadSpinlock.h>
00033 #include <Inventor/STL/list>
00034 #include <deque>
00035
00036 #if defined(_WIN32)
00037 #pragma warning( push )
00038 #pragma warning(disable:4251)
00039 #endif //_WIN32
00040
00041
00042 class SbThreadStorageMapStruct;
00043
00051 class SbThreadStorageBase
00052 {
00053 SB_THREAD_TLS_HEADER();
00054
00055 public:
00056
00058 void cleanStorage();
00059
00060 private:
00062 SbThreadStorageBase();
00063 private:
00065 SbThreadStorageBase(const SbThreadStorageBase& tocopy);
00066 private:
00068 virtual ~SbThreadStorageBase();
00069
00071 virtual void deleteStorage(void* p) = 0;
00072
00073 private:
00075 static void initClass();
00077 static void exitClass();
00078
00079 void* getValue() const;
00080 void Register( void* );
00081
00082 typedef std::list< SbThreadStorageMapStruct* > SbThreadStorageGlobalList;
00083
00084 struct MTstruct
00085 {
00086 SbThreadStorageMapStruct* threadStorageMapStruct;
00087 };
00088
00089 private:
00090
00091 void erase();
00092
00093 void setAll(void* p);
00094
00095 void* get (const SbThreadStorageGlobalList::const_iterator& it_i);
00096
00097
00098 static SbThreadStorageGlobalList s_threadStorageGlobalList;
00099
00100 static SbThreadSpinlock s_threadStorageGlobalMutex;
00101
00102 private:
00103
00104 size_t m_storageID;
00105
00106
00107 static size_t getID();
00108
00109
00110
00111 static size_t s_storageID;
00112
00113
00114
00115
00116 typedef std::deque<size_t> SbThreadStorageFreeIDList;
00117 static SbThreadStorageFreeIDList s_freeStorageIDList;
00118 };
00119
00120 #if defined(_WIN32)
00121 #pragma warning(pop)
00122 #endif //_WIN32
00123
00124
00125 #endif //_SB_THREAD_STORAGE_BASE_H_
00126
00127
00128 #endif // HIDDEN_FROM_DOC
00129
00130
00131