Changed the way the engine is stopping the worker thread.

git-svn-id: http://voip.null.ro/svn/yate@1822 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
marian 2008-03-21 09:14:31 +00:00
parent e4cf2990f8
commit 14c2ccd61b
1 changed files with 32 additions and 4 deletions

View File

@ -33,11 +33,10 @@ namespace TelEngine {
class SignallingThreadPrivate : public Thread
{
public:
inline SignallingThreadPrivate(SignallingEngine*engine, const char* name, Priority prio, unsigned long usec)
inline SignallingThreadPrivate(SignallingEngine* engine, const char* name, Priority prio, unsigned long usec)
: Thread(name,prio), m_engine(engine), m_sleep(usec)
{ }
virtual ~SignallingThreadPrivate()
{ }
virtual ~SignallingThreadPrivate();
virtual void run();
private:
@ -155,8 +154,12 @@ SignallingEngine::SignallingEngine(const char* name)
SignallingEngine::~SignallingEngine()
{
if (m_thread) {
Debug(this,DebugGoOn,
"Engine destroyed with worker thread still running [%p]",this);
stop();
}
lock();
// stop();
m_components.clear();
unlock();
}
@ -228,6 +231,15 @@ bool SignallingEngine::start(const char* name, Thread::Priority prio, unsigned l
// sanity check - 20ms is long enough
if (usec > 20000)
usec = 20000;
// TODO: experimental: remove commented if it's working
m_thread = new SignallingThreadPrivate(this,name,prio,usec);
if (m_thread->startup()) {
Debug(this,DebugAll,"Engine started worker thread [%p]",this);
return true;
}
#if 0
SignallingThreadPrivate* tmp = new SignallingThreadPrivate(this,name,prio,usec);
if (tmp->startup()) {
m_thread = tmp;
@ -235,12 +247,21 @@ bool SignallingEngine::start(const char* name, Thread::Priority prio, unsigned l
return true;
}
delete tmp;
#endif
Debug(this,DebugGoOn,"Engine failed to start worker thread [%p]",this);
return false;
}
void SignallingEngine::stop()
{
// TODO: experimental: remove commented if it's working
if (!m_thread)
return;
m_thread->cancel(false);
while (m_thread)
Thread::yield(true);
Debug(this,DebugAll,"Engine stopped worker thread [%p]",this);
#if 0
lock();
SignallingThreadPrivate* tmp = m_thread;
m_thread = 0;
@ -249,6 +270,7 @@ void SignallingEngine::stop()
DDebug(this,DebugInfo,"Engine stopped worker thread [%p]",this);
}
unlock();
#endif
}
Thread* SignallingEngine::thread() const
@ -274,6 +296,12 @@ void SignallingEngine::timerTick(const Time& when)
}
SignallingThreadPrivate::~SignallingThreadPrivate()
{
if (m_engine)
m_engine->m_thread = 0;
}
void SignallingThreadPrivate::run()
{
for (;;) {