26#include <unordered_map>
28#include <osl/diagnose.h>
31#include <uno/threadpool.h>
48 return theDisposedCallerAdmin;
58 std::scoped_lock guard(
m_mutex );
64 std::scoped_lock guard(
m_mutex );
70 std::scoped_lock guard(
m_mutex );
89 std::scoped_lock guard(
m_mutex );
92 if( item.second.first )
94 item.second.first->dispose( nDisposeId );
96 if( item.second.second )
98 item.second.second->dispose( nDisposeId );
122 waitingThread.
condition.wait( std::chrono::seconds(2) );
126 if( waitingThread.
thread.is() )
129 WaitingThreadDeque::iterator ii =
find(
144 thread->condition.set();
151 const ByteSequence &aThreadId,
161 pWaitingThread->
thread->setTask( pQueue , aThreadId , bAsynchron );
162 pWaitingThread->
thread =
nullptr;
175 return pThread->launch();
180 std::scoped_lock guard(
m_mutex );
182 ThreadIdHashMap::iterator ii =
m_mapQueue.find( aThreadId );
187 if( ! (*ii).second.second->isEmpty() )
193 (*ii).second.second =
nullptr;
194 if( (*ii).second.first )
198 (*ii).second.first->resume();
203 if( ! (*ii).second.first->isEmpty() )
208 (*ii).second.first =
nullptr;
211 if(
nullptr == (*ii).second.first &&
nullptr == (*ii).second.second )
221 const ByteSequence &aThreadId ,
223 void *pThreadSpecificData,
225 void const * disposeId )
227 bool bCreateThread =
false;
230 std::scoped_lock guard(
m_mutex );
235 ThreadIdHashMap::iterator ii =
m_mapQueue.find( aThreadId );
239 m_mapQueue[ aThreadId ] = std::pair < JobQueue * , JobQueue * > (
nullptr ,
nullptr );
246 if( ! (*ii).second.second )
248 (*ii).second.second =
new JobQueue();
249 bCreateThread =
true;
251 pQueue = (*ii).second.second;
255 if( ! (*ii).second.first )
257 (*ii).second.first =
new JobQueue();
258 bCreateThread =
true;
260 pQueue = (*ii).second.first;
262 if( (*ii).second.second && ( (*ii).second.second->isBusy() ) )
267 pQueue->
add( pThreadSpecificData , doRequest );
270 return !bCreateThread ||
createThread( pQueue , aThreadId , bAsynchron);
275 std::scoped_lock guard(
m_mutex );
277 ThreadIdHashMap::iterator ii =
m_mapQueue.find( aThreadId );
282 m_mapQueue[ aThreadId ] = std::pair< JobQueue * , JobQueue * > (
p ,
nullptr );
284 else if(
nullptr == (*ii).second.first )
286 (*ii).second.first =
new JobQueue();
294 std::scoped_lock guard(
m_mutex );
296 ThreadIdHashMap::iterator ii =
m_mapQueue.find( aThreadId );
299 pQueue = (*ii).second.first;
302 OSL_ASSERT( pQueue );
303 void *pReturn = pQueue->
enter( nDisposeId );
328struct uno_ThreadPool_Equal
330 bool operator () (
const uno_ThreadPool &a ,
const uno_ThreadPool &b )
const
336struct uno_ThreadPool_Hash
338 std::size_t operator () (
const uno_ThreadPool &a )
const
340 return reinterpret_cast<std::size_t
>(
a );
346typedef std::unordered_map< uno_ThreadPool, ThreadPoolHolder, uno_ThreadPool_Hash, uno_ThreadPool_Equal >
ThreadpoolHashSet;
359 MutexGuard guard( Mutex::getGlobalMutex() );
368extern "C" uno_ThreadPool SAL_CALL
371 MutexGuard guard( Mutex::getGlobalMutex() );
390extern "C" void SAL_CALL
395 getThreadPool( hPool )->prepare( pThreadId );
396 rtl_byte_sequence_release( pThreadId );
400extern "C" void SAL_CALL
407 getThreadPool( hPool )->enter(
410 rtl_byte_sequence_release( pThreadId );
414extern "C" void SAL_CALL
420extern "C" void SAL_CALL
422 uno_ThreadPool hPool,
425 void ( SAL_CALL * doRequest ) (
void *pThreadSpecificData ),
428 if (!getThreadPool(hPool)->addJob( pThreadId, bIsOneway, pJob ,doRequest, hPool ))
432 "uno_threadpool_putJob in parallel with uno_threadpool_destroy");
436extern "C" void SAL_CALL
439 getThreadPool(hPool)->dispose(
443extern "C" void SAL_CALL
454 MutexGuard guard( Mutex::getGlobalMutex() );
static DisposedCallerAdminHolder const & getInstance()
void dispose(void const *nDisposeId)
bool isDisposed(void const *nDisposeId)
std::vector< void const * > m_vector
void destroy(void const *nDisposeId)
void * enter(void const *nDisposeId, bool bReturnWhenNoJob=false)
void add(void *pThreadSpecificData, RequestFun *doRequest)
bool isCallstackEmpty() const
void * enter(const ::rtl::ByteSequence &aThreadId, void const *nDisposeId)
WaitingThreadDeque m_dequeThreads
void prepare(const ::rtl::ByteSequence &aThreadId)
void destroy(void const *nDisposeId)
ThreadAdmin m_aThreadAdmin
DisposedCallerAdminHolder m_DisposedCallerAdmin
ThreadIdHashMap m_mapQueue
void dispose(void const *nDisposeId)
std::mutex m_mutexWaitingThreadList
bool addJob(const ::rtl::ByteSequence &aThreadId, bool bAsynchron, void *pThreadSpecificData, RequestFun *doRequest, void const *disposeId)
bool revokeQueue(const ::rtl::ByteSequence &aThreadId, bool bAsynchron)
void waitInPool(rtl::Reference< ORequestThread > const &pThread)
virtual ~ThreadPool() override
bool createThread(JobQueue *pQueue, const ::rtl::ByteSequence &aThreadId, bool bAsynchron)
#define SAL_WARN_IF(condition, area, stream)
#define SAL_WARN(area, stream)
OSQLColumns::const_iterator find(const OSQLColumns::const_iterator &first, const OSQLColumns::const_iterator &last, std::u16string_view _rVal, const ::comphelper::UStringMixEqual &_rCase)
std::shared_ptr< DisposedCallerAdmin > DisposedCallerAdminHolder
void() RequestFun(void *)
WaitingThread(rtl::Reference< ORequestThread > theThread)
rtl::Reference< ORequestThread > thread
void SAL_CALL uno_releaseIdFromCurrentThread() SAL_THROW_EXTERN_C()
void SAL_CALL uno_getIdOfCurrentThread(sal_Sequence **ppThreadId) SAL_THROW_EXTERN_C()
void SAL_CALL uno_threadpool_enter(uno_ThreadPool hPool, void **ppJob) SAL_THROW_EXTERN_C()
uno_ThreadPool SAL_CALL uno_threadpool_create() SAL_THROW_EXTERN_C()
void SAL_CALL uno_threadpool_detach(SAL_UNUSED_PARAMETER uno_ThreadPool) SAL_THROW_EXTERN_C()
void SAL_CALL uno_threadpool_putJob(uno_ThreadPool hPool, sal_Sequence *pThreadId, void *pJob, void(SAL_CALL *doRequest)(void *pThreadSpecificData), sal_Bool bIsOneway) SAL_THROW_EXTERN_C()
void SAL_CALL uno_threadpool_attach(uno_ThreadPool hPool) SAL_THROW_EXTERN_C()
void SAL_CALL uno_threadpool_destroy(uno_ThreadPool hPool) SAL_THROW_EXTERN_C()
static ThreadpoolHashSet * g_pThreadpoolHashSet
void SAL_CALL uno_threadpool_dispose(uno_ThreadPool hPool) SAL_THROW_EXTERN_C()
std::unordered_map< uno_ThreadPool, ThreadPoolHolder, uno_ThreadPool_Hash, uno_ThreadPool_Equal > ThreadpoolHashSet
#define SAL_THROW_EXTERN_C()