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
00049 class SbThreadStorageBase
00050 {
00051 SB_THREAD_TLS_HEADER();
00052
00053 public:
00054
00056 void cleanStorage();
00057
00058 private:
00060 SbThreadStorageBase();
00061 private:
00063 SbThreadStorageBase(const SbThreadStorageBase& tocopy);
00064 private:
00066 virtual ~SbThreadStorageBase();
00067
00069 virtual void deleteStorage(void* p) = 0;
00070
00071 private:
00073 static void initClass();
00075 static void exitClass();
00076
00077 void* getValue() const;
00078 void Register( void* );
00079
00080 typedef std::list< SbThreadStorageMapStruct* > SbThreadStorageGlobalList;
00081
00082 struct MTstruct
00083 {
00084 SbThreadStorageMapStruct* threadStorageMapStruct;
00085 };
00086
00087 private:
00088
00089 void erase();
00090
00091 void setAll(void* p);
00092
00093 void* get (const SbThreadStorageGlobalList::const_iterator& it_i);
00094
00095
00096 static SbThreadStorageGlobalList s_threadStorageGlobalList;
00097
00098 static SbThreadSpinlock s_threadStorageGlobalMutex;
00099
00100 private:
00101
00102 size_t m_storageID;
00103
00104
00105 static size_t getID();
00106
00107
00108
00109 static size_t s_storageID;
00110
00111
00112
00113
00114 typedef std::deque<size_t> SbThreadStorageFreeIDList;
00115 static SbThreadStorageFreeIDList s_freeStorageIDList;
00116 };
00117
00118 #if defined(_WIN32)
00119 #pragma warning(pop)
00120 #endif //_WIN32
00121
00122
00123 #endif //_SB_THREAD_STORAGE_BASE_H_
00124
00125
00126 #endif // HIDDEN_FROM_DOC
00127
00128
00129