diff options
Diffstat (limited to 'cppu/source/threadpool/current.cxx')
-rw-r--r-- | cppu/source/threadpool/current.cxx | 152 |
1 files changed, 48 insertions, 104 deletions
diff --git a/cppu/source/threadpool/current.cxx b/cppu/source/threadpool/current.cxx index 7dbfc9050488..46fdc8c253f3 100644 --- a/cppu/source/threadpool/current.cxx +++ b/cppu/source/threadpool/current.cxx @@ -20,7 +20,6 @@ #include <sal/config.h> #include <rtl/byteseq.h> -#include <osl/thread.h> #include <osl/mutex.hxx> #include <uno/current_context.h> @@ -31,7 +30,6 @@ #include "current.hxx" -using namespace ::osl; using namespace ::rtl; using namespace ::cppu; using namespace ::com::sun::star::uno; @@ -81,137 +79,84 @@ static typelib_InterfaceTypeDescription * get_type_XCurrentContext() return s_type_XCurrentContext; } -namespace { - -class ThreadKey +IdContainer::IdContainer() + : pCurrentContext(nullptr) + , pCurrentContextEnv(nullptr) + , pLocalThreadId(nullptr) + , pCurrentId(nullptr) + , nRefCountOfCurrentId(0) + , bInit(false) { - bool _bInit; - oslThreadKey _hThreadKey; - oslThreadKeyCallbackFunction _pCallback; - -public: - oslThreadKey getThreadKey() - { - if (! _bInit) - { - MutexGuard aGuard( Mutex::getGlobalMutex() ); - if (! _bInit) - { - _hThreadKey = ::osl_createThreadKey( _pCallback ); - _bInit = true; - } - } - return _hThreadKey; - } - - explicit ThreadKey( oslThreadKeyCallbackFunction pCallback ) - : _bInit(false) - , _hThreadKey(nullptr) - , _pCallback(pCallback) - { - } - - ~ThreadKey() - { - if (_bInit) - { - ::osl_destroyThreadKey( _hThreadKey ); - } - } -}; - } -extern "C" { - -static void delete_IdContainer( void * p ) +IdContainer::~IdContainer() { - if (!p) - return; - - IdContainer * pId = static_cast< IdContainer * >( p ); - if (pId->pCurrentContext) + if (pCurrentContext) { - (*pId->pCurrentContextEnv->releaseInterface)( - pId->pCurrentContextEnv, pId->pCurrentContext ); - (*pId->pCurrentContextEnv->aBase.release)( - &pId->pCurrentContextEnv->aBase ); + (*pCurrentContextEnv->releaseInterface)( + pCurrentContextEnv, pCurrentContext ); + (*pCurrentContextEnv->aBase.release)( + &pCurrentContextEnv->aBase ); } - if (pId->bInit) + if (bInit) { - ::rtl_byte_sequence_release( pId->pLocalThreadId ); - ::rtl_byte_sequence_release( pId->pCurrentId ); + ::rtl_byte_sequence_release( pLocalThreadId ); + ::rtl_byte_sequence_release( pCurrentId ); } - delete pId; -} - } -IdContainer * getIdContainer() +IdContainer& getIdContainer() { - static ThreadKey s_key( delete_IdContainer ); - oslThreadKey aKey = s_key.getThreadKey(); - - IdContainer * pId = static_cast< IdContainer * >( ::osl_getThreadKeyData( aKey ) ); - if (! pId) - { - pId = new IdContainer; - pId->pCurrentContext = nullptr; - pId->pCurrentContextEnv = nullptr; - pId->bInit = false; - ::osl_setThreadKeyData( aKey, pId ); - } - return pId; + static thread_local IdContainer aId; + return aId; } } - extern "C" sal_Bool SAL_CALL uno_setCurrentContext( void * pCurrentContext, rtl_uString * pEnvTypeName, void * pEnvContext ) SAL_THROW_EXTERN_C() { - IdContainer * pId = getIdContainer(); - OSL_ASSERT( pId ); + IdContainer& id = getIdContainer(); // free old one - if (pId->pCurrentContext) + if (id.pCurrentContext) { - (*pId->pCurrentContextEnv->releaseInterface)( - pId->pCurrentContextEnv, pId->pCurrentContext ); - (*pId->pCurrentContextEnv->aBase.release)( - &pId->pCurrentContextEnv->aBase ); - pId->pCurrentContextEnv = nullptr; + (*id.pCurrentContextEnv->releaseInterface)( + id.pCurrentContextEnv, id.pCurrentContext ); + (*id.pCurrentContextEnv->aBase.release)( + &id.pCurrentContextEnv->aBase ); + id.pCurrentContextEnv = nullptr; - pId->pCurrentContext = nullptr; + id.pCurrentContext = nullptr; } - if (pCurrentContext) + if (!pCurrentContext) + return true; + + uno_Environment * pEnv = nullptr; + ::uno_getEnvironment( &pEnv, pEnvTypeName, pEnvContext ); + OSL_ASSERT( pEnv && pEnv->pExtEnv ); + if (pEnv) { - uno_Environment * pEnv = nullptr; - ::uno_getEnvironment( &pEnv, pEnvTypeName, pEnvContext ); - OSL_ASSERT( pEnv && pEnv->pExtEnv ); - if (pEnv) + if (pEnv->pExtEnv) { - if (pEnv->pExtEnv) - { - pId->pCurrentContextEnv = pEnv->pExtEnv; - (*pId->pCurrentContextEnv->acquireInterface)( - pId->pCurrentContextEnv, pCurrentContext ); - pId->pCurrentContext = pCurrentContext; - } - else - { - (*pEnv->release)( pEnv ); - return false; - } + id.pCurrentContextEnv = pEnv->pExtEnv; + (*id.pCurrentContextEnv->acquireInterface)( + id.pCurrentContextEnv, pCurrentContext ); + id.pCurrentContext = pCurrentContext; } else { + (*pEnv->release)( pEnv ); return false; } } + else + { + return false; + } return true; } @@ -219,8 +164,7 @@ extern "C" sal_Bool SAL_CALL uno_getCurrentContext( void ** ppCurrentContext, rtl_uString * pEnvTypeName, void * pEnvContext ) SAL_THROW_EXTERN_C() { - IdContainer * pId = getIdContainer(); - OSL_ASSERT( pId ); + IdContainer& id = getIdContainer(); Environment target_env; @@ -241,7 +185,7 @@ extern "C" sal_Bool SAL_CALL uno_getCurrentContext( } // case: null-ref - if (nullptr == pId->pCurrentContext) + if (nullptr == id.pCurrentContext) return true; if (! target_env.is()) @@ -252,12 +196,12 @@ extern "C" sal_Bool SAL_CALL uno_getCurrentContext( return false; } - Mapping mapping(&pId->pCurrentContextEnv->aBase, target_env.get()); + Mapping mapping(&id.pCurrentContextEnv->aBase, target_env.get()); OSL_ASSERT( mapping.is() ); if (! mapping.is()) return false; - mapping.mapInterface(ppCurrentContext, pId->pCurrentContext, ::cppu::get_type_XCurrentContext() ); + mapping.mapInterface(ppCurrentContext, id.pCurrentContext, ::cppu::get_type_XCurrentContext()); return true; } |