static wxThread *This();
// Returns true if current thread is the main thread.
- static bool IsMain();
+ //
+ // Notice that it also returns true if main thread id hadn't been
+ // initialized yet on the assumption that it's too early in wx startup
+ // process for any other threads to have been created in this case.
+ static bool IsMain()
+ {
+ return !ms_idMainThread || GetCurrentId() == ms_idMainThread;
+ }
+
+ // Return the main thread id
+ static wxThreadIdType GetMainId() { return ms_idMainThread; }
// Release the rest of our time slice letting the other threads run
static void Yield();
// 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();
+ 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
// of this thread.
virtual void *Entry() = 0;
+
+ // Callbacks which may be overridden by the derived class to perform some
+ // specific actions when the thread is deleted or killed. By default they
+ // do nothing.
+
+ // This one is called by Delete() before actually deleting the thread and
+ // is executed in the context of the thread that called Delete().
+ virtual void OnDelete() {}
+
+ // This one is called by Kill() before killing the thread and is executed
+ // in the context of the thread that called Kill().
+ virtual void OnKill() {}
+
private:
// no copy ctor/assignment operator
wxThread(const wxThread&);
virtual void OnExit() { }
friend class wxThreadInternal;
+ friend class wxThreadModule;
+
+
+ // the main thread identifier, should be set on startup
+ static wxThreadIdType ms_idMainThread;
// the (platform-dependent) thread class implementation
wxThreadInternal *m_internal;
// macros for entering/leaving critical sections which may be used without
// having to take them inside "#if wxUSE_THREADS"
-// (the implementation uses dummy structs to force semicolon after the macro)
+// (the implementation uses dummy structs to force semicolon after the macro;
+// also notice that Watcom doesn't like declaring a struct as a member so we
+// need to actually define it in wxCRIT_SECT_DECLARE_MEMBER)
#define wxENTER_CRIT_SECT(cs) do {} while (0)
#define wxLEAVE_CRIT_SECT(cs) do {} while (0)
#define wxCRIT_SECT_DECLARE(cs) struct wxDummyCS##cs
-#define wxCRIT_SECT_DECLARE_MEMBER(cs) struct wxDummyCSMember##cs
+#define wxCRIT_SECT_DECLARE_MEMBER(cs) struct wxDummyCSMember##cs { }
#define wxCRIT_SECT_LOCKER(name, cs) struct wxDummyCSLocker##name
// if there is only one thread, it is always the main one
#if wxUSE_THREADS
-#if defined(__WXMSW__) || defined(__OS2__) || defined(__EMX__)
+#if defined(__WXMSW__) || defined(__OS2__) || defined(__EMX__) || defined(__WXOSX__)
// 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
// thread
// wakes up the main thread if it's sleeping inside ::GetMessage()
extern void WXDLLIMPEXP_BASE wxWakeUpMainThread();
+#ifndef __WXOSX__
// return true if the main thread is waiting for some other to terminate:
// wxApp then should block all "dangerous" messages
extern bool WXDLLIMPEXP_BASE wxIsWaitingForThread();
+#endif
#endif // MSW, OS/2
#endif // wxUSE_THREADS