33 #include <QtCore/QObject>
34 #include <QtCore/QMutex>
35 #include <QtCore/QDebug>
50 using namespace ThreadWeaver;
56 , m_mutex ( new QMutex( QMutex::Recursive ) )
57 , m_finishMutex( new QMutex )
58 , m_jobAvailableMutex ( new QMutex )
73 Qt::QueuedConnection );
80 REQUIRE( QThread::currentThread() == thread() );
81 debug ( 3,
"WeaverImpl dtor: destroying inventory.\n" );
96 if ( !th->isFinished() )
101 if ( th->wait( 100 ) )
break;
102 debug ( 1,
"WeaverImpl::~WeaverImpl: thread %i did not exit as expected, "
103 "retrying.\n", th->
id() );
112 delete m_finishMutex;
113 delete m_jobAvailableMutex;
114 debug ( 3,
"WeaverImpl dtor: done\n" );
122 if ( m_state==0 || m_state->
stateId() != id )
124 m_state = m_states[id];
125 debug ( 2,
"WeaverImpl::setState: state changed to \"%s\".\n",
126 m_state->
stateName().toLatin1().constData() );
145 Q_ASSERT_X ( cap > 0,
"Weaver Impl",
"Thread inventory size has to be larger than zero." );
146 QMutexLocker l (m_mutex);
152 QMutexLocker l (m_mutex);
158 QMutexLocker l (m_mutex);
181 debug ( 3,
"WeaverImpl::enqueue: queueing job %p of type %s.\n",
182 (
void*)job, job->metaObject()->className() );
183 QMutexLocker l (m_mutex);
203 QMutexLocker l (m_mutex);
210 for (
int i = 0; i < qMin ( reserve, numberOfNewJobs ); ++i )
213 th->moveToThread( th );
223 debug ( 2,
"WeaverImpl::adjustInventory: thread created, "
231 return new Thread(
this );
238 QMutexLocker l (m_mutex);
247 debug( 3,
"WeaverImpl::dequeue: job %p dequeued, %i jobs left.\n",
250 debug( 3,
"WeaverImpl::dequeue: job %p not found in queue.\n", (
void*)job );
263 debug( 3,
"WeaverImpl::dequeue: dequeueing all jobs.\n" );
264 QMutexLocker l (m_mutex);
291 QMutexLocker l (m_mutex);
311 QMutexLocker l (m_mutex);
313 debug ( 4,
"WeaverImpl::adjustActiveThreadCount: %i active threads (%i jobs"
325 QMutexLocker l (m_mutex);
331 QMutexLocker l (m_mutex);
362 debug ( 4,
"WeaverImpl::blockThread...: thread %i blocked.\n", th->
id());
364 QMutexLocker l( m_jobAvailableMutex );
366 debug ( 4,
"WeaverImpl::blockThread...: thread %i resumed.\n", th->
id());
371 QMutexLocker l (m_mutex);
377 QMutexLocker l (m_mutex);
384 const int MaxWaitMilliSeconds = 200;
386 const int MaxWaitMilliSeconds = 2000;
391 debug (2,
"WeaverImpl::finish: not done, waiting.\n" );
392 QMutexLocker l( m_finishMutex );
393 if (
m_jobFinished.wait( m_finishMutex, MaxWaitMilliSeconds ) == false )
395 debug ( 2,
"WeaverImpl::finish: wait timed out, %i jobs left, waking threads.\n",
400 debug (2,
"WeaverImpl::finish: done.\n\n\n" );
405 QMutexLocker l (m_mutex);
414 QMutexLocker l (m_mutex);
415 debug( 0,
"WeaverImpl::dumpJobs: current jobs:\n" );
424 #include "WeaverImpl.moc"