X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9e84b84742248ef54a561b4937bbc039332c2c51..61ecf6d34ffb087e4a02d1c4e29e1f155875eba0:/include/wx/thread.h diff --git a/include/wx/thread.h b/include/wx/thread.h index 9917e594df..8652d6cbf8 100644 --- a/include/wx/thread.h +++ b/include/wx/thread.h @@ -23,7 +23,7 @@ #if wxUSE_THREADS // only for wxUSE_THREADS - otherwise we'd get undefined symbols -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(__APPLE__) #pragma interface "thread.h" #endif @@ -212,8 +212,12 @@ private: // just mutexes make all wxCriticalSection class functions inline #if !defined(__WXMSW__) && !defined(__WXPM__) #define wxCRITSECT_IS_MUTEX 1 + + #define wxCRITSECT_INLINE inline #else // MSW || OS2 #define wxCRITSECT_IS_MUTEX 0 + + #define wxCRITSECT_INLINE #endif // MSW/!MSW // you should consider wxCriticalSectionLocker whenever possible instead of @@ -222,14 +226,14 @@ class WXDLLEXPORT wxCriticalSection { public: // ctor & dtor - inline wxCriticalSection(); - inline ~wxCriticalSection(); + wxCRITSECT_INLINE wxCriticalSection(); + wxCRITSECT_INLINE ~wxCriticalSection(); // enter the section (the same as locking a mutex) - inline void Enter(); + wxCRITSECT_INLINE void Enter(); // leave the critical section (same as unlocking a mutex) - inline void Leave(); + wxCRITSECT_INLINE void Leave(); private: #if wxCRITSECT_IS_MUTEX @@ -237,11 +241,23 @@ private: #elif defined(__WXMSW__) // we can't allocate any memory in the ctor, so use placement new - // unfortunately, we have to hardcode the sizeof() here because we can't - // include windows.h from this public header + // include windows.h from this public header and we also have to use the + // union to force the correct (i.e. maximal) alignment // // if CRITICAL_SECTION size changes in Windows, you'll get an assert from // thread.cpp and will need to increase the buffer size - char m_buffer[24]; + // + // finally, we need this typedef instead of declaring m_buffer directly + // because otherwise the assert mentioned above wouldn't compile with some + // compilers (notably CodeWarrior 8) + typedef char wxCritSectBuffer[24]; + union + { + unsigned long m_dummy1; + void *m_dummy2; + + wxCritSectBuffer m_buffer; + }; #else // nothing for OS/2 #endif // Unix/Win32/OS2 @@ -258,6 +274,9 @@ private: inline void wxCriticalSection::Leave() { (void)m_mutex.Unlock(); } #endif // wxCRITSECT_IS_MUTEX +#undef wxCRITSECT_INLINE +#undef wxCRITSECT_IS_MUTEX + // wxCriticalSectionLocker is the same to critical sections as wxMutexLocker is // to th mutexes class WXDLLEXPORT wxCriticalSectionLocker @@ -594,6 +613,27 @@ inline void WXDLLEXPORT wxMutexGuiLeave() { } #endif // wxUSE_THREADS/!wxUSE_THREADS +// mark part of code as being a critical section: this macro declares a +// critical section with the given name and enters it immediately and leaves +// it at the end of the current scope +// +// example: +// +// int Count() +// { +// static int s_counter = 0; +// +// wxCRITICAL_SECTION(counter); +// +// return ++s_counter; +// } +// +// this function is MT-safe in presence of the threads but there is no +// overhead when the library is compiled without threads +#define wxCRITICAL_SECTION(name) \ + wxCRIT_SECT_DECLARE(s_cs##name); \ + wxCRIT_SECT_LOCKER(cs##name##Locker, s_cs##name) + // automatically lock GUI mutex in ctor and unlock it in dtor class WXDLLEXPORT wxMutexGuiLocker {