X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b568d04ffa191f9e3b643ca33526094eca0ba304..0656d2e68df4a42780800b057c4b2390a99eecd3:/include/wx/thread.h diff --git a/include/wx/thread.h b/include/wx/thread.h index 3f1415adc7..a4c4b465df 100644 --- a/include/wx/thread.h +++ b/include/wx/thread.h @@ -40,21 +40,21 @@ enum wxMutexError { - wxMUTEX_NO_ERROR = 0, - wxMUTEX_DEAD_LOCK, // Mutex has been already locked by THE CALLING thread - wxMUTEX_BUSY, // Mutex has been already locked by ONE thread - wxMUTEX_UNLOCKED, - wxMUTEX_MISC_ERROR + wxMUTEX_NO_ERROR = 0, + wxMUTEX_DEAD_LOCK, // Mutex has been already locked by THE CALLING thread + wxMUTEX_BUSY, // Mutex has been already locked by ONE thread + wxMUTEX_UNLOCKED, + wxMUTEX_MISC_ERROR }; enum wxThreadError { - wxTHREAD_NO_ERROR = 0, // No error - wxTHREAD_NO_RESOURCE, // No resource left to create a new thread - wxTHREAD_RUNNING, // The thread is already running - wxTHREAD_NOT_RUNNING, // The thread isn't running - wxTHREAD_KILLED, // Thread we waited for had to be killed - wxTHREAD_MISC_ERROR // Some other error + wxTHREAD_NO_ERROR = 0, // No error + wxTHREAD_NO_RESOURCE, // No resource left to create a new thread + wxTHREAD_RUNNING, // The thread is already running + wxTHREAD_NOT_RUNNING, // The thread isn't running + wxTHREAD_KILLED, // Thread we waited for had to be killed + wxTHREAD_MISC_ERROR // Some other error }; enum wxThreadKind @@ -106,7 +106,7 @@ protected: wxMutex& operator=(const wxMutex&); int m_locked; - wxMutexInternal *p_internal; + wxMutexInternal *m_internal; }; // a helper class which locks the mutex in the ctor and unlocks it in the dtor: @@ -213,28 +213,32 @@ private: }; // ---------------------------------------------------------------------------- -// Condition handler. +// Condition variable: allows to block the thread execution until something +// happens (== condition is signaled) // ---------------------------------------------------------------------------- class wxConditionInternal; class WXDLLEXPORT wxCondition { public: - // constructor & destructor - wxCondition(); - ~wxCondition(); - - // Waits indefinitely. - void Wait(wxMutex& mutex); - // Waits until a signal is raised or the timeout is elapsed. - bool Wait(wxMutex& mutex, unsigned long sec, unsigned long nsec); - // Raises a signal: only one "Waiter" is released. - void Signal(); - // Broadcasts to all "Waiters". - void Broadcast(); + // constructor & destructor + wxCondition(); + ~wxCondition(); + + // wait until the condition is signaled + // waits indefinitely. + void Wait(); + // waits until a signal is raised or the timeout elapses + bool Wait(unsigned long sec, unsigned long nsec); + + // signal the condition + // wakes up one (and only one) of the waiting threads + void Signal(); + // wakes up all threads waiting onthis condition + void Broadcast(); private: - wxConditionInternal *p_internal; + wxConditionInternal *m_internal; }; // ---------------------------------------------------------------------------- @@ -276,6 +280,21 @@ public: // NB: at least under MSW worker threads can not call ::wxSleep()! static void Sleep(unsigned long milliseconds); + // get the number of system CPUs - useful with SetConcurrency() + // (the "best" value for it is usually number of CPUs + 1) + // + // Returns -1 if unknown, number of CPUs otherwise + static int GetCPUCount(); + + // sets the concurrency level: this is, roughly, the number of threads + // the system tries to schedule to run in parallel. 0 means the + // default value (usually acceptable, but may not yield the best + // performance for this process) + // + // Returns TRUE on success, FALSE otherwise (if not implemented, for + // example) + static bool SetConcurrency(size_t level); + // constructor only creates the C++ thread object and doesn't create (or // start) the real thread wxThread(wxThreadKind kind = wxTHREAD_DETACHED); @@ -381,7 +400,7 @@ private: friend class wxThreadInternal; // the (platform-dependent) thread class implementation - wxThreadInternal *p_internal; + wxThreadInternal *m_internal; // protects access to any methods of wxThreadInternal object wxCriticalSection m_critsect; @@ -402,6 +421,7 @@ void WXDLLEXPORT wxMutexGuiLeave(); // having to take them inside "#if wxUSE_THREADS" #define wxENTER_CRIT_SECT(cs) (cs).Enter() #define wxLEAVE_CRIT_SECT(cs) (cs).Leave() +#define wxCRIT_SECT_DECLARE(cs) static wxCriticalSection cs #define wxCRIT_SECT_LOCKER(name, cs) wxCriticalSectionLocker name(cs) #else // !wxUSE_THREADS @@ -416,6 +436,7 @@ inline void WXDLLEXPORT wxMutexGuiLeave() { } // having to take them inside "#if wxUSE_THREADS" #define wxENTER_CRIT_SECT(cs) #define wxLEAVE_CRIT_SECT(cs) +#define wxCRIT_SECT_DECLARE(cs) #define wxCRIT_SECT_LOCKER(name, cs) #endif // wxUSE_THREADS