]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/thread.h
Added new stream tests to typetest.
[wxWidgets.git] / include / wx / thread.h
index 3f1415adc7830ec7563d2bd61b7104a36f084dbc..7dd5cfa6212558f56a0b1c83ab69e6eaf5bf77e8 100644 (file)
 
 enum wxMutexError
 {
 
 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
 {
 };
 
 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
 };
 
 enum wxThreadKind
@@ -99,14 +99,12 @@ public:
     bool IsLocked() const { return (m_locked > 0); }
 
 protected:
     bool IsLocked() const { return (m_locked > 0); }
 
 protected:
-    friend class wxCondition;
-
     // no assignment operator nor copy ctor
     wxMutex(const wxMutex&);
     wxMutex& operator=(const wxMutex&);
 
     int m_locked;
     // no assignment operator nor copy ctor
     wxMutex(const wxMutex&);
     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:
 };
 
 // a helper class which locks the mutex in the ctor and unlocks it in the dtor:
@@ -150,11 +148,11 @@ class WXDLLEXPORT wxCriticalSectionInternal;
 
 // in order to avoid any overhead under platforms where critical sections are
 // just mutexes make all wxCriticalSection class functions inline
 
 // in order to avoid any overhead under platforms where critical sections are
 // just mutexes make all wxCriticalSection class functions inline
-#if !defined(__WXMSW__) && !defined(__WXPM__) && !defined(__WXMAC__)
+#if !defined(__WXMSW__) && !defined(__WXPM__)
     #define WXCRITICAL_INLINE   inline
 
     #define wxCRITSECT_IS_MUTEX 1
     #define WXCRITICAL_INLINE   inline
 
     #define wxCRITSECT_IS_MUTEX 1
-#else // MSW || Mac || OS2
+#else // MSW || OS2
     #define WXCRITICAL_INLINE
 
     #define wxCRITSECT_IS_MUTEX 0
     #define WXCRITICAL_INLINE
 
     #define wxCRITSECT_IS_MUTEX 0
@@ -213,28 +211,37 @@ private:
 };
 
 // ----------------------------------------------------------------------------
 };
 
 // ----------------------------------------------------------------------------
-// Condition handler.
+// Condition variable: allows to block the thread execution until something
+// happens (== condition is signaled)
 // ----------------------------------------------------------------------------
 
 class wxConditionInternal;
 class WXDLLEXPORT wxCondition
 {
 public:
 // ----------------------------------------------------------------------------
 
 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 on this condition
+    void Broadcast();
+
+#ifdef __WXDEBUG__
+    // for debugging purposes only
+    void *GetId() const { return m_internal; }
+#endif // __WXDEBUG__
 
 private:
 
 private:
-  wxConditionInternal *p_internal;
+    wxConditionInternal *m_internal;
 };
 
 // ----------------------------------------------------------------------------
 };
 
 // ----------------------------------------------------------------------------
@@ -250,6 +257,13 @@ private:
 //     created by the wxThread object while "main thread" is the thread created
 //     during the process initialization (a.k.a. the GUI thread)
 
 //     created by the wxThread object while "main thread" is the thread created
 //     during the process initialization (a.k.a. the GUI thread)
 
+// On VMS thread pointers are 64 bits (also needed for other systems???
+#ifdef __VMS
+   typedef unsigned long long wxThreadIdType;
+#else
+   typedef unsigned long wxThreadIdType;
+#endif
+
 class wxThreadInternal;
 class WXDLLEXPORT wxThread
 {
 class wxThreadInternal;
 class WXDLLEXPORT wxThread
 {
@@ -276,6 +290,26 @@ public:
         // NB: at least under MSW worker threads can not call ::wxSleep()!
     static void Sleep(unsigned long milliseconds);
 
         // 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();
+
+        // Get the platform specific thread ID and return as a long.  This
+        // can be used to uniquely identify threads, even if they are not
+        // wxThreads.  This is used by wxPython.
+   static wxThreadIdType GetCurrentId();
+
+        // 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);
     // constructor only creates the C++ thread object and doesn't create (or
     // start) the real thread
     wxThread(wxThreadKind kind = wxTHREAD_DETACHED);
@@ -284,8 +318,11 @@ public:
     // from _another_ thread (typically the thread that created this one, e.g.
     // the main thread), not from the thread itself
 
     // from _another_ thread (typically the thread that created this one, e.g.
     // the main thread), not from the thread itself
 
-        // create a new thread - call Run() to start it
-    wxThreadError Create();
+        // create a new thread and optionally set the stack size on
+        // platforms that support that - call Run() to start it
+        // (special cased for watcom which won't accept 0 default)
+
+    wxThreadError Create(unsigned int stackSize = 0);
 
         // starts execution of the thread - from the moment Run() is called
         // the execution of wxThread::Entry() may start at any moment, caller
 
         // starts execution of the thread - from the moment Run() is called
         // the execution of wxThread::Entry() may start at any moment, caller
@@ -349,7 +386,7 @@ public:
 
     // Get the thread ID - a platform dependent number which uniquely
     // identifies a thread inside a process
 
     // Get the thread ID - a platform dependent number which uniquely
     // identifies a thread inside a process
-    unsigned long GetId() const;
+    wxThreadIdType GetId() const;
 
     // called when the thread exits - in the context of this thread
     //
 
     // called when the thread exits - in the context of this thread
     //
@@ -381,7 +418,7 @@ private:
     friend class wxThreadInternal;
 
     // the (platform-dependent) thread class implementation
     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;
 
     // protects access to any methods of wxThreadInternal object
     wxCriticalSection m_critsect;
@@ -402,6 +439,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()
 // 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
 #define wxCRIT_SECT_LOCKER(name, cs)  wxCriticalSectionLocker name(cs)
 
 #else // !wxUSE_THREADS
@@ -416,6 +454,7 @@ inline void WXDLLEXPORT wxMutexGuiLeave() { }
 // having to take them inside "#if wxUSE_THREADS"
 #define wxENTER_CRIT_SECT(cs)
 #define wxLEAVE_CRIT_SECT(cs)
 // 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
 #define wxCRIT_SECT_LOCKER(name, cs)
 
 #endif // wxUSE_THREADS
@@ -450,7 +489,7 @@ public:
     // wxApp then should block all "dangerous" messages
     extern bool WXDLLEXPORT wxIsWaitingForThread();
 #elif defined(__WXMAC__)
     // wxApp then should block all "dangerous" messages
     extern bool WXDLLEXPORT wxIsWaitingForThread();
 #elif defined(__WXMAC__)
-    extern void WXDLLEXPORT wxMutexGuiLeaveOrEnter();
+   extern void WXDLLEXPORT wxMutexGuiLeaveOrEnter();
 
     // returns TRUE if the main thread has GUI lock
     extern bool WXDLLEXPORT wxGuiOwnedByMainThread();
 
     // returns TRUE if the main thread has GUI lock
     extern bool WXDLLEXPORT wxGuiOwnedByMainThread();
@@ -461,6 +500,13 @@ public:
     // return TRUE if the main thread is waiting for some other to terminate:
     // wxApp then should block all "dangerous" messages
     extern bool WXDLLEXPORT wxIsWaitingForThread();
     // return TRUE if the main thread is waiting for some other to terminate:
     // wxApp then should block all "dangerous" messages
     extern bool WXDLLEXPORT wxIsWaitingForThread();
+
+    // implement wxCriticalSection using mutexes
+    inline wxCriticalSection::wxCriticalSection() { }
+    inline wxCriticalSection::~wxCriticalSection() { }
+
+    inline void wxCriticalSection::Enter() { (void)m_mutex.Lock(); }
+    inline void wxCriticalSection::Leave() { (void)m_mutex.Unlock(); }
 #elif defined(__WXPM__)
     // unlock GUI if there are threads waiting for and lock it back when
     // there are no more of them - should be called periodically by the main
 #elif defined(__WXPM__)
     // unlock GUI if there are threads waiting for and lock it back when
     // there are no more of them - should be called periodically by the main
@@ -493,3 +539,5 @@ public:
 #endif // wxUSE_THREADS
 
 #endif // __THREADH__
 #endif // wxUSE_THREADS
 
 #endif // __THREADH__
+
+// vi:sts=4:sw=4:et