20 #include <tqapplication.h>
25 namespace ThreadWeaver {
31 : TQObject (parent, name),
33 m_mutex (new TQMutex (true) ),
68 TQMutexLocker l (m_mutex);
74 TQMutexLocker l (m_mutex);
80 TQMutexLocker l (m_mutex);
88 case Event::JobStarted:
91 case Event::JobFinished:
110 m_wc = new TQWaitCondition;
113 thread()-> post (KPIM::ThreadWeaver::Event::JobSPR, this);
125 m_wc = new TQWaitCondition;
134 TQMutexLocker l(m_mutex);
143 const int Event::Type = TQEvent::User + 1000;
145 Event::Event ( Action action, Thread *thread, Job *job)
146 : TQCustomEvent ( type () ),
178 unsigned int Thread::sm_Id;
191 unsigned int Thread::makeId()
193 static TQMutex mutex;
194 TQMutexLocker l (&mutex);
212 debug ( 3, "Thread::run [%u]: trying to execute the next job.\n", id() );
220 post ( Event::JobStarted, job );
222 post ( Event::JobFinished, job );
226 post ( Event::ThreadExiting );
231 m_parent-> post ( a, this, j);
234 void Thread::msleep( unsigned long msec)
236 TQThread::msleep(msec);
239 Weaver::Weaver(TQObject* parent, const char* name,
240 int inventoryMin, int inventoryMax)
241 : TQObject(parent, name),
243 m_inventoryMin(inventoryMin),
244 m_inventoryMax(inventoryMax),
245 m_shuttingDown(false),
248 m_mutex ( new TQMutex(true) )
252 for ( int count = 0; count < m_inventoryMin; ++count)
255 m_inventory.append(th);
259 emit (threadCreated (th) );
269 debug ( 1, "Weaver dtor: destroying inventory.\n" );
286 if ( !th->finished() )
292 emit (threadDestroyed (th) );
301 debug ( 1, "Weaver dtor: done\n" );
307 debug ( 3 , "Weaver::lock: lock (mutex is %s).\n",
308 ( m_mutex->locked() ? "locked" : "not locked" ) );
316 debug ( 3 , "Weaver::unlock: unlock (mutex is %s).\n",
317 ( m_mutex->locked() ? "locked" : "not locked" ) );
322 TQMutexLocker l (m_mutex);
342 for ( Job * job = jobs.first(); job; job = jobs.next() )
354 TQMutexLocker l (m_mutex);
360 TQMutexLocker l (m_mutex);
380 debug (2, "Weaver::suspend: queueing resumed.\n" );
393 if ( e->type() >= TQEvent::User )
400 switch ( event->action() )
402 case Event::JobFinished:
403 if ( event->job() !=0 )
408 case Event::Finished:
414 case Event::ThreadSuspended:
417 emit (threadSuspended ( event->thread() ) );
420 case Event::ThreadBusy:
423 emit (threadBusy ( event->thread() ) );
430 if ( event->job() !=0 )
432 event->job()->processEvent ( event);
435 debug ( 0, "Weaver::event: Strange: received unknown user event.\n" );
447 TQApplication::postEvent ( this, e);
452 TQMutexLocker l (m_mutex);
459 bool lastjob = false;
470 debug ( 3, "Weaver::applyForWork: job done, %i jobs left, "
471 "%i active jobs left.\n",
478 post (Event::Finished);
479 debug ( 3, "Weaver::applyForWork: last job.\n" );
486 debug ( 2, "Weaver::applyForWork: queueing suspended.\n" );
506 debug ( 3, "Weaver::applyForWork: job assigned, "
507 "%i jobs in queue (%i active).\n",
511 post (Event::ThreadBusy, th);
517 post (Event::ThreadSuspended, th);
526 TQMutexLocker l (m_mutex);
532 TQMutexLocker l (m_mutex);
540 debug (2, "Weaver::finish: not done, waiting.\n" );
543 debug (1, "Weaver::finish: done.\n\n\n" );
549 #include "weaver.moc"
|