summaryrefslogtreecommitdiff
path: root/cppu/source/threadpool/current.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'cppu/source/threadpool/current.cxx')
-rw-r--r--cppu/source/threadpool/current.cxx152
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;
}