Changeset 7461

Show
Ignore:
Timestamp:
09/24/07 15:18:27
Author:
robert
Message:

Added Mutexing of starting threads and thread destruction to avoid crashes
when threads are destructed soon after the Thread has been started via
Thead::startThread().

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • OpenThreads/trunk/include/OpenThreads/Thread

    r6096 r7461  
    2323#include <sys/types.h> 
    2424 
    25 #include <OpenThreads/Exports
     25#include <OpenThreads/Mutex
    2626 
    2727namespace OpenThreads { 
     
    374374    void * _prvData; 
    375375     
     376    Mutex _prvDataMutex; 
     377     
    376378    /** 
    377379     *  Master thread's priority, set by Thread::Init. 
  • OpenThreads/trunk/src/OpenThreads/pthreads/PThread.c++

    r7376 r7461  
    3939 
    4040#include <OpenThreads/Thread> 
     41#include <OpenThreads/ScopedLock> 
    4142#include "PThreadPrivateData.h" 
    4243 
     
    110111 
    111112        Thread *thread = static_cast<Thread *>(data); 
     113         
     114        ScopedLock<Mutex> lock(thread->_prvDataMutex); 
     115         
    112116        PThreadPrivateData *pd = 
    113117            static_cast<PThreadPrivateData *>(thread->_prvData); 
     118             
     119        if (thread->_prvData==0) return 0; 
    114120 
    115121        if (pd->cpunum>=0) 
     
    390396// Use: public. 
    391397// 
    392 Thread::~Thread() { 
     398Thread::~Thread() 
     399
     400    ScopedLock<Mutex> lock(_prvDataMutex);  
    393401 
    394402    PThreadPrivateData *pd = static_cast<PThreadPrivateData *>(_prvData); 
    395403 
    396     if(pd->isRunning) { 
    397  
     404    if(pd->isRunning) 
     405    { 
    398406        std::cout<<"Error: Thread "<<this<<" still running in destructor"<<std::endl; 
    399407 
     
    405413 
    406414    delete pd; 
    407  
    408 
    409  
    410 Thread *Thread::CurrentThread() { 
     415     
     416    _prvData = 0; 
     417 
     418
     419 
     420Thread *Thread::CurrentThread() 
     421
    411422 
    412423    Thread *thread = 
     
    640651// Use: public 
    641652// 
    642 int Thread::startThread() { return start(); } 
     653int Thread::startThread() 
     654
     655    ScopedLock<Mutex> lock(_prvDataMutex); 
     656    if (_prvData) return start();  
     657    else return 0; 
     658
    643659 
    644660//----------------------------------------------------------------------------- 
  • OpenThreads/trunk/src/OpenThreads/sproc/SprocThread.c++

    r7401 r7461  
    128128// standard start routine. 
    129129// 
    130 void ThreadPrivateActions::StartThread(void *data) { 
     130void ThreadPrivateActions::StartThread(void *data) 
     131
    131132 
    132133    Thread *thread = static_cast<Thread *>(data); 
     134 
     135    ScopedLock<Mutex> lock(thread->_prvDataMutex); 
     136 
     137    if (thread->_prvData==0) return; 
    133138 
    134139    AddThread(thread); 
     
    354359// Use: public. 
    355360// 
    356 Thread::~Thread() { 
     361Thread::~Thread() 
     362
     363    ScopedLock<Mutex> lock(_prvDataMutex);  
    357364 
    358365    DPRINTF(("(SPROC THREAD) %s:%d, In OpenThreads::Thread destructor\n", 
     
    362369        static_cast<SprocThreadPrivateData *>(_prvData); 
    363370 
    364     if(pd->isRunning) { 
     371    if(pd->isRunning) 
     372    { 
    365373 
    366374        DPRINTF(("(SPROC THREAD) %s:%d, about to kill OpenThreads::Thread\n", 
     
    386394    delete pd; 
    387395 
     396    _prvData = 0; 
    388397} 
    389398 
     
    504513// Use: public 
    505514// 
    506 int Thread::startThread() { return start(); } 
     515int Thread::startThread() 
     516
     517    ScopedLock<Mutex> lock(_prvDataMutex); 
     518    if (_prvData) return start();  
     519    else return 0; 
     520
    507521 
    508522//----------------------------------------------------------------------------- 
  • OpenThreads/trunk/src/OpenThreads/win32/Win32Thread.cpp

    r7330 r7461  
    9292 
    9393            Thread *thread = static_cast<Thread *>(data); 
     94         
     95            ScopedLock<Mutex> lock(thread->_prvDataMutex); 
     96 
    9497            Win32ThreadPrivateData *pd = 
    9598                static_cast<Win32ThreadPrivateData *>(thread->_prvData); 
     99 
     100            if (thread->_prvData==0) return 0; 
    96101 
    97102            TlsSetValue(Win32ThreadPrivateData::TLS.ID ,data); 
     
    253258// Use: public. 
    254259// 
    255 Thread::~Thread() { 
     260Thread::~Thread() 
     261
     262    ScopedLock<Mutex> lock(_prvDataMutex);  
     263 
    256264    Win32ThreadPrivateData *pd = static_cast<Win32ThreadPrivateData *>(_prvData); 
    257     if(pd->isRunning) { 
     265 
     266    if(pd->isRunning) 
     267    { 
    258268        std::cout<<"Error: Thread "<<this<<" still running in destructor"<<std::endl; 
    259269        pd->cancelMode = 0; 
    260270        cancel(); 
    261271    } 
     272 
    262273    delete pd; 
     274     
     275    _prvData = 0; 
    263276} 
    264277//----------------------------------------------------------------------------- 
     
    335348 
    336349int Thread::startThread() 
    337 { return start(); } 
     350
     351    ScopedLock<Mutex> lock(_prvDataMutex); 
     352    if (_prvData) return start();  
     353    else return 0; 
     354
    338355 
    339356//-----------------------------------------------------------------------------