00001
00002
00003
00004
00005
00006
00007
00020 #ifndef OSCL_SINGLETON_H_INCLUDED
00021 #define OSCL_SINGLETON_H_INCLUDED
00022
00023 #ifndef OSCL_BASE_H_INCLUDED
00024 #include "oscl_base.h"
00025 #endif
00026
00027 #ifndef OSCL_DEFALLOC_H_INCLUDED
00028 #include "oscl_defalloc.h"
00029 #endif
00030
00031
00032 #if (OSCL_HAS_SINGLETON_SUPPORT)
00033
00034
00035
00036
00037 const uint32 OSCL_SINGLETON_ID_TEST = 0;
00038 const uint32 OSCL_SINGLETON_ID_OSCLMEM = 1;
00039 const uint32 OSCL_SINGLETON_ID_PVLOGGER = 2;
00040 const uint32 OSCL_SINGLETON_ID_PVSCHEDULER = 3;
00041 const uint32 OSCL_SINGLETON_ID_PVERRORTRAP = 4;
00042 const uint32 OSCL_SINGLETON_ID_SDPMEDIAPARSER = 5;
00043 const uint32 OSCL_SINGLETON_ID_PAYLOADPARSER = 6;
00044 const uint32 OSCL_SINGLETON_ID_CPM_PLUGIN = 7;
00045 const uint32 OSCL_SINGLETON_ID_PVMFRECOGNIZER = 8;
00046 const uint32 OSCL_SINGLETON_ID_OSCLREGISTRY = 9;
00047 const uint32 OSCL_SINGLETON_ID_OMX = 10;
00048 const uint32 OSCL_SINGLETON_ID_OMXMASTERCORE = 11;
00049 const uint32 OSCL_SINGLETON_ID_TICKCOUNT = 12;
00050 const uint32 OSCL_SINGLETON_ID_WMDRMLOCK = 13;
00051 const uint32 OSCL_SINGLETON_ID_LAST = 14;
00052
00053
00054 class OsclSingletonRegistry
00055 {
00056 public:
00057
00058
00059
00060
00061
00062
00063 OSCL_IMPORT_REF static OsclAny* getInstance(uint32 ID, int32 &error);
00064
00065
00066
00067
00068
00069
00070 OSCL_IMPORT_REF static void registerInstance(OsclAny* ptr, uint32 ID, int32 &error);
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084 OSCL_IMPORT_REF static OsclAny* lockAndGetInstance(uint32 ID, int32& error);
00085
00086
00087
00088
00089
00090
00091 OSCL_IMPORT_REF static void registerInstanceAndUnlock(OsclAny* ptr, uint32 ID, int32& error);
00092
00093 private:
00094 OsclSingletonRegistry()
00095 {}
00096 typedef OsclAny* registry_type;
00097 typedef registry_type* registry_pointer_type;
00098
00099 private:
00100 friend class OsclBase;
00101
00102 private:
00103 class SingletonTable
00104 {
00105 public:
00106 SingletonTable()
00107 {
00108 for (uint32 i = 0; i < OSCL_SINGLETON_ID_LAST; i++)
00109 iSingletons[i] = NULL;
00110 }
00111 OsclAny* iSingletons[OSCL_SINGLETON_ID_LAST];
00112 _OsclBasicLock iSingletonLocks[OSCL_SINGLETON_ID_LAST];
00113 };
00114
00115 static SingletonTable sSingletonTable;
00116 };
00117
00118 template < class T, uint32 ID, class Registry = OsclSingletonRegistry > class OsclSingleton
00119 {
00120 private:
00121
00122 OsclSingleton& operator=(OsclSingleton& _Y)
00123 {
00124 return(*this);
00125 }
00126
00127 protected:
00128 T* _Ptr;
00129
00130 public:
00131 OsclSingleton()
00132 {
00133 int32 err;
00134 _Ptr = OSCL_STATIC_CAST(T*, Registry::getInstance(ID, err));
00135 }
00136
00137 ~OsclSingleton() {};
00138
00146 T& operator*() const
00147 {
00148 return(*_Ptr);
00149 }
00150
00158 T *operator->() const
00159 {
00160 return(_Ptr);
00161 }
00162
00163
00170 bool set()
00171 {
00172 int32 err;
00173 _Ptr = OSCL_STATIC_CAST(T*, Registry::getInstance(ID, err));
00174 return (_Ptr ? true : false);
00175 }
00176
00177 };
00178
00179
00180 #endif //OSCL_HAS_SINGLETON_SUPPORT
00181
00182 #endif
00183