void Broadcast()
{
+ // we need to save the original value as m_nWaiters is goign to be
+ // decreased by the signalled thread resulting in the loop being
+ // executed less times than needed
+ LONG nWaiters = m_nWaiters;
+
// this works because all these threads are already waiting and so each
// SetEvent() inside Signal() is really a PulseEvent() because the
// event state is immediately returned to non-signaled
- for ( LONG n = 0; n < m_nWaiters; n++ )
+ for ( LONG n = 0; n < nWaiters; n++ )
{
Signal();
}
wxCriticalSection::wxCriticalSection()
{
- wxASSERT_MSG( sizeof(CRITICAL_SECTION) <= sizeof(m_buffer),
+#ifdef __WXDEBUG__
+ // Done this way to stop warnings during compilation about statement
+ // always being false
+ int csSize = sizeof(CRITICAL_SECTION);
+ int bSize = sizeof(m_buffer);
+ wxASSERT_MSG( csSize <= bSize,
_T("must increase buffer size in wx/thread.h") );
+#endif
::InitializeCriticalSection((CRITICAL_SECTION *)m_buffer);
}