1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include <sal/config.h>
23 #include <osl/diagnose.h>
24 #include <uno/threadpool.h>
27 #include "jobqueue.hxx"
28 #include "threadpool.hxx"
33 namespace cppu_threadpool
{
36 ThreadAdmin::ThreadAdmin(): m_disposed(false) {}
38 ThreadAdmin::~ThreadAdmin()
40 #if OSL_DEBUG_LEVEL > 1
43 fprintf( stderr
, "%lu Threads left\n" , static_cast<unsigned long>(m_lst
.size()) );
48 bool ThreadAdmin::add( rtl::Reference
< ORequestThread
> const & p
)
50 MutexGuard
aGuard( m_mutex
);
59 void ThreadAdmin::remove_locked( rtl::Reference
< ORequestThread
> const & p
)
61 ::std::list
< rtl::Reference
< ORequestThread
> >::iterator ii
= ::std::find( m_lst
.begin(), m_lst
.end(), p
);
62 if( ii
!= m_lst
.end() )
68 void ThreadAdmin::remove( rtl::Reference
< ORequestThread
> const & p
)
70 MutexGuard
aGuard( m_mutex
);
74 void ThreadAdmin::join()
77 MutexGuard
aGuard( m_mutex
);
82 rtl::Reference
< ORequestThread
> pCurrent
;
84 MutexGuard
aGuard( m_mutex
);
89 pCurrent
= m_lst
.front();
97 ORequestThread::ORequestThread( ThreadPoolHolder
const &aThreadPool
,
99 const ByteSequence
&aThreadId
,
101 : m_aThreadPool( aThreadPool
)
103 , m_aThreadId( aThreadId
)
104 , m_bAsynchron( bAsynchron
)
107 ORequestThread::~ORequestThread() {}
109 void ORequestThread::setTask( JobQueue
*pQueue
,
110 const ByteSequence
&aThreadId
,
114 m_aThreadId
= aThreadId
;
115 m_bAsynchron
= bAsynchron
;
118 bool ORequestThread::launch()
120 // Assumption is that osl::Thread::create returns normally with a true
121 // return value iff it causes osl::Thread::run to start executing:
123 ThreadAdmin
& rThreadAdmin
= m_aThreadPool
->getThreadAdmin();
124 osl::ClearableMutexGuard
g(rThreadAdmin
.m_mutex
);
125 if (!rThreadAdmin
.add( this )) {
133 rThreadAdmin
.remove_locked( this );
141 void ORequestThread::onTerminated()
143 m_aThreadPool
->getThreadAdmin().remove( this );
147 void ORequestThread::run()
149 osl_setThreadName("cppu_threadpool::ORequestThread");
157 if ( !uno_bindIdToCurrentThread( m_aThreadId
.getHandle() ) )
163 while( ! m_pQueue
->isEmpty() )
165 // Note : Oneways should not get a disposable disposeid,
166 // It does not make sense to dispose a call in this state.
167 // That's way we put it an disposeid, that can't be used otherwise.
169 sal::static_int_cast
< sal_Int64
>(
170 reinterpret_cast< sal_IntPtr
>(this)),
173 if( m_pQueue
->isEmpty() )
175 m_aThreadPool
->revokeQueue( m_aThreadId
, m_bAsynchron
);
176 // Note : revokeQueue might have failed because m_pQueue.isEmpty()
177 // may be false (race).
186 uno_releaseIdFromCurrentThread();
189 m_aThreadPool
->waitInPool( this );
194 // Work around the problem that onTerminated is not called if run
195 // throws an exception:
202 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */