/////////////////////////////////////////////////////////////////////////////
// Name: include/wx/thrimpl.cpp
// Purpose: common part of wxThread Implementations
// Author: Vadim Zeitlin
// Modified by:
// Created: 04.06.02 (extracted from src/*/thread.cpp files)
// RCS-ID: $Id: thrimpl.cpp 61872 2009-09-09 22:37:05Z VZ $
// Copyright: (c) Vadim Zeitlin (2002)
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// this file is supposed to be included only by the various thread.cpp
// ----------------------------------------------------------------------------
// wxMutex
// ----------------------------------------------------------------------------
wxMutex::wxMutex(wxMutexType mutexType)
{
m_internal = new wxMutexInternal(mutexType);
if ( !m_internal->IsOk() )
{
delete m_internal;
m_internal = NULL;
}
}
wxMutex::~wxMutex()
{
delete m_internal;
}
bool wxMutex::IsOk() const
{
return m_internal != NULL;
}
wxMutexError wxMutex::Lock()
{
wxCHECK_MSG( m_internal, wxMUTEX_INVALID,
wxT("wxMutex::Lock(): not initialized") );
return m_internal->Lock();
}
wxMutexError wxMutex::TryLock()
{
wxCHECK_MSG( m_internal, wxMUTEX_INVALID,
wxT("wxMutex::TryLock(): not initialized") );
return m_internal->TryLock();
}
wxMutexError wxMutex::Unlock()
{
wxCHECK_MSG( m_internal, wxMUTEX_INVALID,
wxT("wxMutex::Unlock(): not initialized") );
return m_internal->Unlock();
}
// --------------------------------------------------------------------------
// wxConditionInternal
// --------------------------------------------------------------------------
// Win32 and OS/2 don't have explicit support for the POSIX condition
// variables and their events/event semaphores have quite different semantics,
// so we reimplement the conditions from scratch using the mutexes and
// semaphores
#if defined(__WXMSW__) || defined(__OS2__) || defined(__EMX__)
class wxConditionInternal
{
public:
wxConditionInternal(wxMutex& mutex);
bool IsOk() const { return m_mutex.IsOk() && m_semaphore.IsOk(); }
wxCondError Wait();
wxCondError WaitTimeout(unsigned long milliseconds);
wxCondError Signal();
wxCondError Broadcast();
private:
// the number of threads currently waiting for this condition
LONG m_numWaiters;
// the critical section protecting m_numWaiters
wxCriticalSection m_csWaiters;
wxMutex& m_mutex;
wxSemaphore m_semaphore;
DECLARE_NO_COPY_CLASS(wxConditionInternal)
};
wxConditionInternal::wxConditionInternal(wxMutex& mutex)
: m_mutex(mutex)
{
// another thread can't access it until we return from ctor, so no need to
// protect access to m_numWaiters here
m_numWaiters = 0;
}
wxCondError wxConditionInternal::Wait()
{
// increment the number of waiters
{
wxCriticalSectionLocker lock(m_csWaiters);
m_numWaiters++;
}
m_mutex.Unlock();
// a potential race condition can occur here
//
// after a thread increments m_numWaiters, and unlocks the mutex and before
// the semaphore.Wait() is called, if another thread can cause a signal to
// be generated
//
// this race condition is handled by using a semaphore and incrementing the
// semaphore only if m_numWaiters is greater that zero since the semaphore,
// can 'remember' signals the race condition will not occur
// wait ( if necessary ) and decrement semaphore
wxSemaError err = m_semaphore.Wait();
m_mutex.Lock();
if ( err == wxSEMA_NO_ERROR )
return wxCOND_NO_ERROR;
else if ( err == wxSEMA_TIMEOUT )
return wxCOND_TIMEOUT;
else
return wxCOND_MISC_ERROR;
}
wxCondError wxConditionInternal::WaitTimeout(unsigned long milliseconds)
{
{
wxCriticalSectionLocker lock(m_csWaiters);
m_numWaiters++;
}
m_mutex.Unlock();
// a race condition can occur at this point in the code
//
// please see the comments in Wait(), for details
wxSemaError err = m_semaphore.WaitTimeout(milliseconds);
if ( err == wxSEMA_TIMEOUT )
{
// another potential race condition exists here it is caused when a
// 'waiting' thread times out, and returns from WaitForSingleObject,
// but has not yet decremented m_numWaiters
//
// at this point if another thread calls signal() then the semaphore
// will be incremented, but the waiting thread will miss it.
//
// to handle this particular case, the waiting thread calls
// WaitForSingleObject again with a timeout of 0, after locking
// m_csWaiters. This call does not block because of the zero
// timeout, but will allow the waiting thread to catch the missed
// signals.
wxCriticalSectionLocker lock(m_csWaiters);
wxSemaError err2 = m_semaphore.WaitTimeout(0);
if ( err2 != wxSEMA_NO_ERROR )
{
m_numWaiters--;
}
}
m_mutex.Lock();
return err == wxSEMA_NO_ERROR ? wxCOND_NO_ERROR
: err == wxSEMA_TIMEOUT ? wxCOND_TIMEOUT
: wxCOND_MISC_ERROR;
}
wxCondError wxConditionInternal::Signal()
{
wxCriticalSectionLocker lock(m_csWaiters);
if ( m_numWaiters > 0 )
{
// increment the semaphore by 1
if ( m_semaphore.Post() != wxSEMA_NO_ERROR )
return wxCOND_MISC_ERROR;
m_numWaiters--;
}
return wxCOND_NO_ERROR;
}
wxCondError wxConditionInternal::Broadcast()
{
wxCriticalSectionLocker lock(m_csWaiters);
while ( m_numWaiters > 0 )
{
if ( m_semaphore.Post() != wxSEMA_NO_ERROR )
return wxCOND_MISC_ERROR;
m_numWaiters--;
}
return wxCOND_NO_ERROR;
}
#endif // MSW or OS2
// ----------------------------------------------------------------------------
// wxCondition
// ----------------------------------------------------------------------------
wxCondition::wxCondition(wxMutex& mutex)
{
m_internal = new wxConditionInternal(mutex);
if ( !m_internal->IsOk() )
{
delete m_internal;
m_internal = NULL;
}
}
wxCondition::~wxCondition()
{
delete m_internal;
}
bool wxCondition::IsOk() const
{
return m_internal != NULL;
}
wxCondError wxCondition::Wait()
{
wxCHECK_MSG( m_internal, wxCOND_INVALID,
wxT("wxCondition::Wait(): not initialized") );
return m_internal->Wait();
}
wxCondError wxCondition::WaitTimeout(unsigned long milliseconds)
{
wxCHECK_MSG( m_internal, wxCOND_INVALID,
wxT("wxCondition::Wait(): not initialized") );
return m_internal->WaitTimeout(milliseconds);
}
wxCondError wxCondition::Signal()
{
wxCHECK_MSG( m_internal, wxCOND_INVALID,
wxT("wxCondition::Signal(): not initialized") );
return m_internal->Signal();
}
wxCondError wxCondition::Broadcast()
{
wxCHECK_MSG( m_internal, wxCOND_INVALID,
wxT("wxCondition::Broadcast(): not initialized") );
return m_internal->Broadcast();
}
// --------------------------------------------------------------------------
// wxSemaphore
// --------------------------------------------------------------------------
wxSemaphore::wxSemaphore(int initialcount, int maxcount)
{
m_internal = new wxSemaphoreInternal( initialcount, maxcount );
if ( !m_internal->IsOk() )
{
delete m_internal;
m_internal = NULL;
}
}
wxSemaphore::~wxSemaphore()
{
delete m_internal;
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
wxMSW-2.8.11库文件 (810个子文件)
csquery.bmp 206B
colours.bmp 122B
thrimpl.cpp 9KB
arrimpl.cpp 9KB
listimpl.cpp 2KB
roller.cur 326B
rightarr.cur 326B
magnif1.cur 326B
hand.cur 326B
pntright.cur 326B
bullseye.cur 326B
pencil.cur 326B
pbrush.cur 326B
cross.cur 326B
blank.cur 326B
pntleft.cur 326B
wsock32_sc.def 875B
shell32_sc.def 474B
winmm32_sc.def 316B
dummy 57B
propgrid.h 291KB
event.h 115KB
defs.h 100KB
richtextbuffer.h 94KB
xti.h 83KB
grid.h 82KB
datetime.h 80KB
list.h 72KB
string.h 65KB
pg_dox_mainpage.h 64KB
window.h 62KB
dynarray.h 61KB
vms_x_fix.h 51KB
wxchar.h 51KB
chkconf.h 49KB
setup0.h 45KB
setup.h 45KB
setup.h 45KB
setup.h 45KB
setup.h 43KB
props.h 42KB
setup0.h 42KB
setup.h 42KB
richtextctrl.h 41KB
renderer.h 40KB
setup_inc.h 40KB
odcombo.h 39KB
db.h 38KB
isqlext.h 38KB
setup_microwin.h 38KB
dc.h 35KB
longlong.h 35KB
sizer.h 33KB
geometry.h 31KB
manager.h 31KB
framemanager.h 31KB
private.h 28KB
app.h 27KB
thread.h 27KB
filefn.h 27KB
combo.h 27KB
utils.h 27KB
graphics.h 26KB
hashmap.h 26KB
htmlcell.h 26KB
gdicmn.h 25KB
auibook.h 25KB
docview.h 24KB
log.h 24KB
rawbmp.h 24KB
hash.h 23KB
htmlwin.h 23KB
prntbase.h 23KB
window.h 23KB
tbarbase.h 23KB
richtextstyles.h 22KB
auibar.h 22KB
textctrl.h 22KB
strconv.h 21KB
filename.h 21KB
intl.h 21KB
object.h 21KB
dataobj.h 21KB
stream.h 20KB
editors.h 20KB
xmlres.h 20KB
zipstrm.h 19KB
textctrl.h 19KB
treectrl.h 19KB
platform.h 19KB
menu.h 19KB
listbase.h 18KB
xtistrm.h 18KB
treebase.h 18KB
image.h 18KB
dbtable.h 18KB
renderer.h 17KB
dataview.h 17KB
mimetype.h 17KB
listctrl.h 17KB
共 810 条
- 1
- 2
- 3
- 4
- 5
- 6
- 9
资源评论
破烂熊
- 粉丝: 12
- 资源: 82
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功