00001
00002
00003
00004
00005
00006
00007
00022 #ifndef OSCL_TLS_H_INCLUDED
00023 #define OSCL_TLS_H_INCLUDED
00024
00025 #ifndef OSCL_BASE_H_INCLUDED
00026 #include "oscl_base.h"
00027 #endif
00028
00029 #ifndef OSCL_DEFALLOC_H_INCLUDED
00030 #include "oscl_defalloc.h"
00031 #endif
00032
00033
00034 #if (OSCL_TLS_IS_KEYED)
00035
00036
00037 #else
00038
00039
00040 typedef OsclAny TOsclTlsKey;
00041
00042 #endif //OSCL_TLS_IS_KEYED
00043
00044
00045
00046 const uint32 OSCL_TLS_ID_MAGICNUM = 0;
00047 const uint32 OSCL_TLS_ID_ERRORHOOK = 1;
00048 const uint32 OSCL_TLS_ID_PVLOGGER = 2;
00049 const uint32 OSCL_TLS_ID_TEST = 3;
00050 const uint32 OSCL_TLS_ID_PVSCHEDULER = 4;
00051 const uint32 OSCL_TLS_ID_PVERRORTRAP = 5;
00052 const uint32 OSCL_TLS_ID_SDPMEDIAPARSER = 6;
00053 const uint32 OSCL_TLS_ID_PAYLOADPARSER = 7;
00054 const uint32 OSCL_TLS_ID_PVMFRECOGNIZER = 8;
00055 const uint32 OSCL_TLS_ID_WMDRM = 9;
00056 const uint32 OSCL_TLS_ID_OSCLREGISTRY = 10;
00057 const uint32 OSCL_TLS_ID_SQLITE3 = 11;
00058 const uint32 OSCL_TLS_ID_BASE_LAST = 11;
00059
00060 #define OSCL_TLS_BASE_SLOTS OSCL_TLS_ID_BASE_LAST +1
00061
00062
00063 #ifndef OSCL_TLS_EXTERNAL_SLOTS
00064 #define OSCL_TLS_EXTERNAL_SLOTS 0
00065 #endif
00066
00067 #define OSCL_TLS_MAX_SLOTS ( OSCL_TLS_BASE_SLOTS + OSCL_TLS_EXTERNAL_SLOTS)
00068
00069 class TLSStorageOps
00070 {
00071 public:
00072 OSCL_IMPORT_REF static void save_registry(TOsclTlsKey* key, OsclAny* ptr, int32&);
00073 OSCL_IMPORT_REF static OsclAny* get_registry(TOsclTlsKey* key);
00074 };
00075
00076 class OsclTLSRegistry
00077 {
00078 public:
00079
00080
00081
00082
00083
00084
00085 OSCL_IMPORT_REF static OsclAny* getInstance(uint32 ID, int32 &error);
00086
00087
00088
00089
00090
00091
00092 OSCL_IMPORT_REF static void registerInstance(OsclAny* ptr, uint32 ID, int32 &error);
00093
00094 private:
00095 OsclTLSRegistry()
00096 {}
00097 typedef OsclAny* registry_type;
00098 typedef registry_type* registry_pointer_type;
00099
00100 #if ( OSCL_TLS_IS_KEYED)
00101 class TlsKey
00102 {
00103 public:
00104 TlsKey(): iRefCnt(0), iOsclTlsKey(NULL)
00105 {}
00106 _OsclBasicLock iLock;
00107 uint32 iRefCnt;
00108 TOsclTlsKey *iOsclTlsKey;
00109 };
00110
00111
00112 static TlsKey* iTlsKey;
00113 #endif
00114
00115 private:
00116 OSCL_IMPORT_REF static void initialize(Oscl_DefAlloc &alloc, int32 &error);
00117 OSCL_IMPORT_REF static void cleanup(Oscl_DefAlloc &alloc, int32 &error);
00118 friend class OsclBase;
00119
00120 };
00121
00122 template < class T, uint32 ID, class Registry = OsclTLSRegistry > class OsclTLS
00123 {
00124 private:
00125
00126 OsclTLS& operator=(OsclTLS& _Y)
00127 {
00128 return(*this);
00129 }
00130
00131 protected:
00132 T* _Ptr;
00133
00134 public:
00135 OsclTLS()
00136 {
00137 int32 err;
00138 _Ptr = OSCL_STATIC_CAST(T*, Registry::getInstance(ID, err));
00139 }
00140
00141 ~OsclTLS() {};
00142
00150 T& operator*() const
00151 {
00152 return(*_Ptr);
00153 }
00154
00162 T *operator->() const
00163 {
00164 return(_Ptr);
00165 }
00166
00167
00174 bool set()
00175 {
00176 int32 err;
00177 _Ptr = OSCL_STATIC_CAST(T*, Registry::getInstance(ID, err));
00178 return (_Ptr ? true : false);
00179 }
00180
00181 };
00182
00187 #endif
00188