Added wxCriticalSection::TryEnter() method.
This is similar to wxMutex::TryLock() and useful for the same reasons. Closes #13638. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@69883 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -463,6 +463,7 @@ All:
|
|||||||
wxStopWatch precision.
|
wxStopWatch precision.
|
||||||
- Made wxGetLocalTimeMillis() really return local time, added
|
- Made wxGetLocalTimeMillis() really return local time, added
|
||||||
wxGetUTCTimeMillis() returning what this function used to return.
|
wxGetUTCTimeMillis() returning what this function used to return.
|
||||||
|
- Added wxCriticalSection::TryEnter() (Catalin Raceanu).
|
||||||
|
|
||||||
All (GUI):
|
All (GUI):
|
||||||
|
|
||||||
|
@@ -249,6 +249,9 @@ public:
|
|||||||
// enter the section (the same as locking a mutex)
|
// enter the section (the same as locking a mutex)
|
||||||
wxCRITSECT_INLINE void Enter();
|
wxCRITSECT_INLINE void Enter();
|
||||||
|
|
||||||
|
// try to enter the section (the same as trying to lock a mutex)
|
||||||
|
wxCRITSECT_INLINE bool TryEnter();
|
||||||
|
|
||||||
// leave the critical section (same as unlocking a mutex)
|
// leave the critical section (same as unlocking a mutex)
|
||||||
wxCRITSECT_INLINE void Leave();
|
wxCRITSECT_INLINE void Leave();
|
||||||
|
|
||||||
@@ -291,6 +294,7 @@ private:
|
|||||||
inline wxCriticalSection::~wxCriticalSection() { }
|
inline wxCriticalSection::~wxCriticalSection() { }
|
||||||
|
|
||||||
inline void wxCriticalSection::Enter() { (void)m_mutex.Lock(); }
|
inline void wxCriticalSection::Enter() { (void)m_mutex.Lock(); }
|
||||||
|
inline bool wxCriticalSection::TryEnter() { return m_mutex.TryLock() == wxMUTEX_NO_ERROR; }
|
||||||
inline void wxCriticalSection::Leave() { (void)m_mutex.Unlock(); }
|
inline void wxCriticalSection::Leave() { (void)m_mutex.Unlock(); }
|
||||||
#endif // wxCRITSECT_IS_MUTEX
|
#endif // wxCRITSECT_IS_MUTEX
|
||||||
|
|
||||||
|
@@ -584,6 +584,14 @@ public:
|
|||||||
*/
|
*/
|
||||||
void Enter();
|
void Enter();
|
||||||
|
|
||||||
|
/**
|
||||||
|
Try to enter the critical section (same as trying to lock a mutex).
|
||||||
|
If it can't, immediately returns false.
|
||||||
|
|
||||||
|
@since 2.9.3
|
||||||
|
*/
|
||||||
|
bool TryEnter();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Leave the critical section allowing other threads use the global data
|
Leave the critical section allowing other threads use the global data
|
||||||
protected by it. There is no error return for this function.
|
protected by it. There is no error return for this function.
|
||||||
|
@@ -40,6 +40,8 @@
|
|||||||
|
|
||||||
#include "wx/except.h"
|
#include "wx/except.h"
|
||||||
|
|
||||||
|
#include "wx/dynlib.h"
|
||||||
|
|
||||||
// must have this symbol defined to get _beginthread/_endthread declarations
|
// must have this symbol defined to get _beginthread/_endthread declarations
|
||||||
#ifndef _MT
|
#ifndef _MT
|
||||||
#define _MT
|
#define _MT
|
||||||
@@ -163,6 +165,25 @@ void wxCriticalSection::Enter()
|
|||||||
::EnterCriticalSection((CRITICAL_SECTION *)m_buffer);
|
::EnterCriticalSection((CRITICAL_SECTION *)m_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool wxCriticalSection::TryEnter()
|
||||||
|
{
|
||||||
|
#if wxUSE_DYNLIB_CLASS
|
||||||
|
typedef BOOL
|
||||||
|
(WINAPI *TryEnterCriticalSection_t)(LPCRITICAL_SECTION lpCriticalSection);
|
||||||
|
|
||||||
|
static TryEnterCriticalSection_t
|
||||||
|
pfnTryEnterCriticalSection = (TryEnterCriticalSection_t)
|
||||||
|
wxDynamicLibrary(wxT("kernel32.dll")).
|
||||||
|
GetSymbol(wxT("TryEnterCriticalSection"));
|
||||||
|
|
||||||
|
return pfnTryEnterCriticalSection
|
||||||
|
? (*pfnTryEnterCriticalSection)((CRITICAL_SECTION *)m_buffer) != 0
|
||||||
|
: false;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void wxCriticalSection::Leave()
|
void wxCriticalSection::Leave()
|
||||||
{
|
{
|
||||||
::LeaveCriticalSection((CRITICAL_SECTION *)m_buffer);
|
::LeaveCriticalSection((CRITICAL_SECTION *)m_buffer);
|
||||||
|
@@ -121,6 +121,11 @@ void wxCriticalSection::Enter()
|
|||||||
MPEnterCriticalRegion( (MPCriticalRegionID) m_critRegion, kDurationForever );
|
MPEnterCriticalRegion( (MPCriticalRegionID) m_critRegion, kDurationForever );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool wxCriticalSection::TryEnter()
|
||||||
|
{
|
||||||
|
return MPEnterCriticalRegion( (MPCriticalRegionID) m_critRegion, kDurationImmediate ) == noErr;
|
||||||
|
}
|
||||||
|
|
||||||
void wxCriticalSection::Leave()
|
void wxCriticalSection::Leave()
|
||||||
{
|
{
|
||||||
MPExitCriticalRegion( (MPCriticalRegionID) m_critRegion );
|
MPExitCriticalRegion( (MPCriticalRegionID) m_critRegion );
|
||||||
|
@@ -146,6 +146,11 @@ void wxCriticalSection::Enter()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool wxCriticalSection::TryEnter()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void wxCriticalSection::Leave()
|
void wxCriticalSection::Leave()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user