00001
00056 #ifndef INC_MI32_THRLCSTR_H
00057 #define INC_MI32_THRLCSTR_H
00058
00059 #ifndef INC_MI32_STDDEFNS_H
00060 #include <mi32/stddefns.h>
00061 #endif
00062
00063 #ifdef MISYSTEMDLL
00064 #define CLASSLIBEXPORT MI_DLLCLASSEXPORT
00065 #else
00066 #define CLASSLIBEXPORT MI_DLLCLASSIMPORT
00067 #endif
00068
00069 namespace MITHREAD {
00070
00075 class CLASSLIBEXPORT LOCALSTORAGE {
00076 public:
00079 class CLASSLIBEXPORT BASE {
00080 protected:
00081 BASE ();
00082 virtual ~BASE () = 0;
00083
00084 friend class LOCALSTORAGE;
00085 };
00086
00087 protected:
00088
00089 LOCALSTORAGE (
00090 );
00091
00093 virtual ~LOCALSTORAGE (
00094 );
00095
00097 void SetValue (
00098 BASE* data
00099 );
00100
00103 BASE* GetValue (
00104 ) const;
00105
00106 private:
00107 #ifndef GENERATING_DOXYGEN_OUTPUT
00109 class PRIV;
00110 PRIV *m_priv;
00111
00112 #if defined(UNIX)
00113 static void dtorFunc (void* data);
00114 #else
00115 static void dtorFunc (void* cb, void* data);
00116 #endif
00117 #endif
00118 };
00119
00120
00152 template <class _CT> class LOCALSTORAGE_T : public LOCALSTORAGE {
00153 public:
00159 virtual ~LOCALSTORAGE_T (
00160 ) {
00161 _CT::TLSSystemClose();
00162 }
00163
00168 _CT *GetValue (
00169 ) {
00170 BASE* data = LOCALSTORAGE::GetValue();
00171 if (data == 0) {
00172 data = new _CT;
00173 SetValue(data);
00174 }
00175 return (static_cast<_CT*>(data));
00176 }
00177 };
00178
00179 }
00180
00181 #undef CLASSLIBEXPORT
00182
00183 #endif