#include <unistd.h>
#include <sched.h>
#include <pthread.h>
+#include <errno.h>
+#include "wx/thread.h"
+#include "wx/module.h"
+#include "wx/utils.h"
enum thread_state {
STATE_IDLE = 0,
// Static variables
/////////////////////////////////////////////////////////////////////////////
-#include "thread.h"
-
static pthread_t p_mainid;
wxMutex wxMainMutex; // controls access to all GUI functions
{
p_internal = new wxMutexInternal;
pthread_mutex_init(&(p_internal->p_mutex), NULL);
- m_locked = false;
+ m_locked = 0;
}
wxMutex::~wxMutex()
{
- if (m_locked)
- pthread_mutex_unlock(&(p_internal->p_mutex));
+ if (m_locked > 0)
+ wxDebugMsg("wxMutex warning: freeing a locked mutex (%d locks)\n",
+ m_locked);
+
pthread_mutex_destroy(&(p_internal->p_mutex));
delete p_internal;
}
int err;
err = pthread_mutex_lock(&(p_internal->p_mutex));
- switch (err) {
- case EDEADLK: return MUTEX_DEAD_LOCK;
- }
+ if (err == EDEADLK)
+ return MUTEX_DEAD_LOCK;
m_locked++;
return MUTEX_NO_ERROR;
}
wxMutexError wxMutex::Unlock()
{
- if (m_locked > 0) m_locked--;
+ if (m_locked > 0)
+ m_locked--;
+ else
+ return MUTEX_UNLOCKED;
pthread_mutex_unlock(&(p_internal->p_mutex));
return MUTEX_NO_ERROR;
}
pthread_testcancel();
}
-bool wxThread::IsMain() const
+bool wxThread::IsMain()
{
return (bool)pthread_equal(pthread_self(), p_mainid);
}