21 #include <tqapplication.h>
26 namespace ThreadWeaver {
32 : TQObject (parent, name),
34 m_mutex (new TQMutex (true) ),
69 TQMutexLocker l (m_mutex);
75 TQMutexLocker l (m_mutex);
81 TQMutexLocker l (m_mutex);
89 case Event::JobStarted:
92 case Event::JobFinished:
111 m_wc = new TQWaitCondition;
114 thread()-> post (KPIM::ThreadWeaver::Event::JobSPR, this);
126 m_wc = new TQWaitCondition;
135 TQMutexLocker l(m_mutex);
144 const int Event::Type = TQEvent::User + 1000;
146 Event::Event ( Action action, Thread *thread, Job *job)
147 : TQCustomEvent ( type () ),
179 unsigned int Thread::sm_Id;
192 unsigned int Thread::makeId()
194 static TQMutex mutex;
195 TQMutexLocker l (&mutex);
213 debug ( 3, "Thread::run [%u]: trying to execute the next job.\n", id() );
221 post ( Event::JobStarted, job );
223 post ( Event::JobFinished, job );
227 post ( Event::ThreadExiting );
232 m_parent-> post ( a, this, j);
235 void Thread::msleep( unsigned long msec)
237 TQThread::msleep(msec);
240 Weaver::Weaver(TQObject* parent, const char* name,
241 int inventoryMin, int inventoryMax)
242 : TQObject(parent, name),
244 m_inventoryMin(inventoryMin),
245 m_inventoryMax(inventoryMax),
246 m_shuttingDown(false),
249 m_mutex ( new TQMutex(true) )
253 for ( int count = 0; count < m_inventoryMin; ++count)
256 m_inventory.append(th);
260 emit (threadCreated (th) );
270 debug ( 1, "Weaver dtor: destroying inventory.\n" );
287 if ( !th->finished() )
293 emit (threadDestroyed (th) );
302 debug ( 1, "Weaver dtor: done\n" );
308 debug ( 3 , "Weaver::lock: lock (mutex is %s).\n",
309 ( m_mutex->locked() ? "locked" : "not locked" ) );
317 debug ( 3 , "Weaver::unlock: unlock (mutex is %s).\n",
318 ( m_mutex->locked() ? "locked" : "not locked" ) );
323 TQMutexLocker l (m_mutex);
343 for ( Job * job = jobs.first(); job; job = jobs.next() )
355 TQMutexLocker l (m_mutex);
361 TQMutexLocker l (m_mutex);
381 debug (2, "Weaver::suspend: queueing resumed.\n" );
394 if ( e->type() >= TQEvent::User )
401 switch ( event->action() )
403 case Event::JobFinished:
404 if ( event->job() !=0 )
409 case Event::Finished:
415 case Event::ThreadSuspended:
418 emit (threadSuspended ( event->thread() ) );
421 case Event::ThreadBusy:
424 emit (threadBusy ( event->thread() ) );
431 if ( event->job() !=0 )
433 event->job()->processEvent ( event);
436 debug ( 0, "Weaver::event: Strange: received unknown user event.\n" );
441 return TQObject::event ( e );
448 TQApplication::postEvent ( this, e);
453 TQMutexLocker l (m_mutex);
460 bool lastjob = false;
471 debug ( 3, "Weaver::applyForWork: job done, %i jobs left, "
472 "%i active jobs left.\n",
479 post (Event::Finished);
480 debug ( 3, "Weaver::applyForWork: last job.\n" );
487 debug ( 2, "Weaver::applyForWork: queueing suspended.\n" );
507 debug ( 3, "Weaver::applyForWork: job assigned, "
508 "%i jobs in queue (%i active).\n",
512 post (Event::ThreadBusy, th);
518 post (Event::ThreadSuspended, th);
527 TQMutexLocker l (m_mutex);
533 TQMutexLocker l (m_mutex);
541 debug (2, "Weaver::finish: not done, waiting.\n" );
544 debug (1, "Weaver::finish: done.\n\n\n" );
550 #include "weaver.moc"
|