|
@@ -12,7 +12,9 @@ CThread::CThread(void) : m_tID(0), m_tCond(PTHREAD_COND_INITIALIZER),
|
|
m_vSigs(),
|
|
m_vSigs(),
|
|
m_nCondSig(-1),
|
|
m_nCondSig(-1),
|
|
m_bSignaled(false),
|
|
m_bSignaled(false),
|
|
- m_bBlocked(false)
|
|
|
|
|
|
+ m_bBlocked(false),
|
|
|
|
+ m_bDetached(false),
|
|
|
|
+ m_bJoined(false)
|
|
{
|
|
{
|
|
::pthread_attr_init(&m_tAttr);
|
|
::pthread_attr_init(&m_tAttr);
|
|
m_itp.pThis = this;
|
|
m_itp.pThis = this;
|
|
@@ -20,7 +22,7 @@ CThread::CThread(void) : m_tID(0), m_tCond(PTHREAD_COND_INITIALIZER),
|
|
|
|
|
|
CThread::~CThread(void)
|
|
CThread::~CThread(void)
|
|
{
|
|
{
|
|
- ::pthread_detach(m_tID);
|
|
|
|
|
|
+ Detach();
|
|
::pthread_attr_destroy(&m_tAttr);
|
|
::pthread_attr_destroy(&m_tAttr);
|
|
::pthread_cond_destroy(&m_tCond);
|
|
::pthread_cond_destroy(&m_tCond);
|
|
::pthread_mutex_destroy(&m_tMtxCond);
|
|
::pthread_mutex_destroy(&m_tMtxCond);
|
|
@@ -50,15 +52,25 @@ int CThread::Cancel(void)
|
|
|
|
|
|
int CThread::Join(void **ppRetval)
|
|
int CThread::Join(void **ppRetval)
|
|
{
|
|
{
|
|
- if(m_tID != 0)
|
|
|
|
- return ::pthread_join(m_tID, ppRetval);
|
|
|
|
|
|
+ if((m_tID != 0) && ! m_bDetached && !m_bJoined)
|
|
|
|
+ {
|
|
|
|
+ int ret = ::pthread_join(m_tID, ppRetval);
|
|
|
|
+ if(!ret)
|
|
|
|
+ m_bJoined = true;
|
|
|
|
+ return ret;
|
|
|
|
+ }
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
int CThread::Detach(void)
|
|
int CThread::Detach(void)
|
|
{
|
|
{
|
|
- if(m_tID != 0)
|
|
|
|
- return ::pthread_detach(m_tID);
|
|
|
|
|
|
+ if((m_tID != 0) && ! m_bDetached && !m_bJoined)
|
|
|
|
+ {
|
|
|
|
+ int ret = ::pthread_detach(m_tID);
|
|
|
|
+ if(!ret)
|
|
|
|
+ m_bDetached = true;
|
|
|
|
+ return ret;
|
|
|
|
+ }
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|