#include <sched.h>
#endif
+#ifdef __WXGTK12__
+#include "gtk/gtk.h"
+#endif
+
// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
// the key for the pointer to the associated wxThread object
static pthread_key_t gs_keySelf;
+#ifndef __WXGTK12__
// this mutex must be acquired before any call to a GUI function
static wxMutex *gs_mutexGui;
+#endif
// ============================================================================
// implementation
wxThreadInternal::~wxThreadInternal()
{
- m_mutexSuspend.Unlock();
+ // GL: moved to SignalExit
+ // m_mutexSuspend.Unlock();
// note that m_mutex will be unlocked by the thread which waits for our
// termination
void wxThreadInternal::SignalExit()
{
+ // GL: Unlock mutexSuspend here.
+ m_mutexSuspend.Unlock();
+
// as mutex is currently locked, this will block until some other thread
// (normally the same which created this one) unlocks it by entering Wait()
m_mutex.Lock();
wxThreadError wxThread::Create()
{
- // Maybe we could think about recreate the thread once it has exited.
- if (p_internal->GetState() != STATE_NEW &&
- p_internal->GetState() != STATE_EXITED)
+ if (p_internal->GetState() != STATE_NEW)
return wxTHREAD_RUNNING;
// set up the thread attribute: right now, we only set thread priority
if ( p_internal->GetState() == STATE_PAUSED )
{
+ m_critsect.Leave();
p_internal->Resume();
+ m_critsect.Enter();
return wxTHREAD_NO_ERROR;
}
// next wake up the threads waiting for us (OTOH, this function won't return
// until someone waited for us!)
- p_internal->SignalExit();
-
p_internal->SetState(STATE_EXITED);
+ p_internal->SignalExit();
+
// delete both C++ thread object and terminate the OS thread object
// GL: This is very ugly and buggy ...
// delete this;
}
}
+bool wxThread::IsPaused() const
+{
+ wxCriticalSectionLocker lock((wxCriticalSection&)m_critsect);
+
+ return (p_internal->GetState() == STATE_PAUSED);
+}
+
//--------------------------------------------------------------------
// wxThreadModule
//--------------------------------------------------------------------
return FALSE;
}
+#ifndef __WXGTK12__
gs_mutexGui = new wxMutex();
-
- //wxThreadGuiInit();
+#endif
gs_tidMain = pthread_self();
+
+#ifndef __WXGTK12__
gs_mutexGui->Lock();
+#endif
return TRUE;
}
gs_allThreads[n]->Delete();
}
+#ifndef __WXGTK12__
// destroy GUI mutex
gs_mutexGui->Unlock();
- //wxThreadGuiExit();
-
delete gs_mutexGui;
+#endif
// and free TLD slot
(void)pthread_key_delete(gs_keySelf);
void wxMutexGuiEnter()
{
+#ifdef __WXGTK12__
+ gdk_threads_enter();
+#else
gs_mutexGui->Lock();
+#endif
}
void wxMutexGuiLeave()
{
+#ifdef __WXGTK12__
+ gdk_threads_leave();
+#else
gs_mutexGui->Unlock();
+#endif
}
#endif