#include "wx/utils.h"
#include "wx/log.h"
+#include "gdk/gdk.h"
+#include "gtk/gtk.h"
+
enum thread_state
{
STATE_IDLE = 0,
static pthread_t p_mainid;
-wxMutex *wxMainMutex; // controls access to all GUI functions
+wxMutex *wxMainMutex; /* controls access to all GUI functions */
//--------------------------------------------------------------------
// common GUI thread code
wxMutex::wxMutex()
{
p_internal = new wxMutexInternal;
- pthread_mutex_init(&(p_internal->p_mutex), NULL);
+ pthread_mutex_init( &(p_internal->p_mutex), (const pthread_mutexattr_t*) NULL );
m_locked = 0;
}
if (m_locked > 0)
wxLogDebug( "wxMutex warning: freeing a locked mutex (%d locks)\n", m_locked );
- pthread_mutex_destroy(&(p_internal->p_mutex));
+ pthread_mutex_destroy( &(p_internal->p_mutex) );
delete p_internal;
}
wxMutexError wxMutex::Lock()
{
- int err;
-
- err = pthread_mutex_lock(&(p_internal->p_mutex));
+ int err = pthread_mutex_lock( &(p_internal->p_mutex) );
if (err == EDEADLK)
+ {
return wxMUTEX_DEAD_LOCK;
+ }
m_locked++;
+
return wxMUTEX_NO_ERROR;
}
wxMutexError wxMutex::TryLock()
{
- int err;
-
if (m_locked)
+ {
return wxMUTEX_BUSY;
+ }
- err = pthread_mutex_trylock(&(p_internal->p_mutex));
+ int err = pthread_mutex_trylock( &(p_internal->p_mutex) );
switch (err)
{
case EBUSY: return wxMUTEX_BUSY;
}
+
m_locked++;
+
return wxMUTEX_NO_ERROR;
}
wxMutexError wxMutex::Unlock()
{
if (m_locked > 0)
+ {
m_locked--;
+ }
else
+ {
return wxMUTEX_UNLOCKED;
+ }
- pthread_mutex_unlock(&(p_internal->p_mutex));
+ pthread_mutex_unlock( &(p_internal->p_mutex) );
+
return wxMUTEX_NO_ERROR;
}
wxCondition::wxCondition()
{
p_internal = new wxConditionInternal;
- pthread_cond_init(&(p_internal->p_condition), NULL);
+ pthread_cond_init( &(p_internal->p_condition), (const pthread_condattr_t *) NULL );
}
wxCondition::~wxCondition()
{
- pthread_cond_destroy(&(p_internal->p_condition));
+ pthread_cond_destroy( &(p_internal->p_condition) );
+
delete p_internal;
}
void wxCondition::Wait(wxMutex& mutex)
{
- pthread_cond_wait(&(p_internal->p_condition), &(mutex.p_internal->p_mutex));
+ pthread_cond_wait( &(p_internal->p_condition), &(mutex.p_internal->p_mutex) );
}
bool wxCondition::Wait(wxMutex& mutex, unsigned long sec, unsigned long nsec)
{
struct timespec tspec;
- tspec.tv_sec = time(NULL)+sec;
+ tspec.tv_sec = time(0L)+sec;
tspec.tv_nsec = nsec;
return (pthread_cond_timedwait(&(p_internal->p_condition), &(mutex.p_internal->p_mutex), &tspec) != ETIMEDOUT);
}
void wxCondition::Signal()
{
- pthread_cond_signal(&(p_internal->p_condition));
+ pthread_cond_signal( &(p_internal->p_condition) );
}
void wxCondition::Broadcast()
{
- pthread_cond_broadcast(&(p_internal->p_condition));
+ pthread_cond_broadcast( &(p_internal->p_condition) );
}
//--------------------------------------------------------------------
{
wxThread *thread = (wxThread *)ptr;
- // Call the main entry
- pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
+ /* Call the main entry */
+ pthread_setcanceltype( PTHREAD_CANCEL_ASYNCHRONOUS, (int*) NULL );
void* status = thread->Entry();
thread->Exit(status);
if (p_internal->state != STATE_IDLE)
return wxTHREAD_RUNNING;
- // Change thread priority
+ /* Change thread priority */
pthread_attr_init(&a);
pthread_attr_getschedpolicy(&a, &p);
void wxThread::DeferDestroy(bool on)
{
if (on)
- pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
+ pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, (int*) NULL);
else
- pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
+ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, (int*) NULL);
}
wxThreadError wxThread::Destroy()
pthread_exit(status);
}
-void wxThread::TestDestroy()
+bool wxThread::TestDestroy()
{
if (p_internal->state == STATE_PAUSING)
{
usleep(1);
}
}
+
+ // VZ: do I understand it correctly that it will terminate the thread all by
+ // itself if it was cancelled?
pthread_testcancel();
+
+ return FALSE;
}
bool wxThread::IsMain()
delete p_internal;
}
-// The default callback just joins the thread and throws away the result.
+/* The default callback just joins the thread and throws away the result. */
void wxThread::OnExit()
{
Join();
// wxThreadModule
//--------------------------------------------------------------------
-class wxThreadModule : public wxModule
+class wxThreadModule : public wxModule
{
- DECLARE_DYNAMIC_CLASS(wxThreadModule)
-
public:
- virtual bool OnInit()
- {
- wxMainMutex = new wxMutex();
- wxThreadGuiInit();
- p_mainid = pthread_self();
- wxMainMutex->Lock();
-
- return TRUE;
- }
+ virtual bool OnInit();
+ virtual void OnExit();
- virtual void OnExit()
- {
- wxMainMutex->Unlock();
- wxThreadGuiExit();
- delete wxMainMutex;
- }
+private:
+ DECLARE_DYNAMIC_CLASS(wxThreadModule)
};
IMPLEMENT_DYNAMIC_CLASS(wxThreadModule, wxModule)
+bool wxThreadModule::OnInit()
+{
+ wxMainMutex = new wxMutex();
+ wxThreadGuiInit();
+ p_mainid = (int)getpid();
+ wxMainMutex->Lock();
+ return TRUE;
+}
+
+void wxThreadModule::OnExit()
+{
+ wxMainMutex->Unlock();
+ wxThreadGuiExit();
+ delete wxMainMutex;
+}
+
+