OSCL_EXPORT_REF OsclAny* OsclTLSRegistry::getInstance(uint32 ID, int32 &aError) { OSCL_ASSERT(ID < OSCL_TLS_MAX_SLOTS); aError = 0; TOsclTlsKey* pkey = NULL; sLock.Lock(); #if (OSCL_TLS_IS_KEYED) if (!iTlsKey) { aError = EPVErrorBaseNotInstalled;//No table! sLock.Unlock(); return NULL; } pkey = iTlsKey->iOsclTlsKey; #endif registry_pointer_type registry = OSCL_STATIC_CAST(registry_pointer_type , TLSStorageOps::get_registry(pkey)); if (!OSCL_TLS_REGISTRY_VALID(registry)) { aError = EPVErrorBaseNotInstalled;//No registry! sLock.Unlock(); return NULL; } registry_type id = registry[ID]; sLock.Unlock(); return id; }
OSCL_EXPORT_REF void OsclTLSRegistry::registerInstance(OsclAny* ptr, uint32 ID, int32 &aError) { OSCL_ASSERT(ID < OSCL_TLS_MAX_SLOTS); aError = 0; TOsclTlsKey *pkey = NULL; #if (OSCL_TLS_IS_KEYED) if (!iTlsKey) { aError = EPVErrorBaseNotInstalled;//No table! return ; } pkey = iTlsKey->iOsclTlsKey; #endif registry_pointer_type registry = OSCL_STATIC_CAST(registry_pointer_type , TLSStorageOps::get_registry(pkey)); if (!OSCL_TLS_REGISTRY_VALID(registry)) { aError = EPVErrorBaseNotInstalled;//no registry! return; } registry[ID] = ptr; }
OSCL_EXPORT_REF void OsclTLSRegistry::cleanup(Oscl_DefAlloc &alloc, int32 &aError) { TOsclTlsKey* pkey = NULL; aError = 0; sLock.Lock(); #if (OSCL_TLS_IS_KEYED) if (!iTlsKey) { aError = EPVErrorBaseNotInstalled;//No key! sLock.Unlock(); return; } pkey = iTlsKey->iOsclTlsKey; #endif //Cleanup this thread's registry registry_pointer_type registry = OSCL_STATIC_CAST(registry_pointer_type , TLSStorageOps::get_registry(pkey)); if (!OSCL_TLS_REGISTRY_VALID(registry)) { aError = EPVErrorBaseNotInstalled;//No registry! sLock.Unlock(); return; } alloc.deallocate(registry); TLSStorageOps::save_registry(pkey, NULL, aError); if (aError) { sLock.Unlock(); return; } #if (OSCL_TLS_IS_KEYED) //Remove Tls key iTlsKey->iRefCnt--; if (iTlsKey->iRefCnt == 0) { //Deallocate key. OSCL_TLS_KEY_DELETE_FUNC(*pkey); alloc.deallocate(pkey); iTlsKey->~TlsKey(); alloc.deallocate(iTlsKey); iTlsKey = NULL; } #endif sLock.Unlock(); }