/////////////////////////////////////////////////////////////////////////////
// Name: thread.cpp
-// Purpose: No thread support
-// Author: Original from Wolfram Gloger/Guilhem Lavaux
+// Purpose: Solaris thread support
+// Author: Guilhem Lavaux
// Modified by:
// Created: 04/22/98
// RCS-ID: $Id$
// Copyright: (c) Wolfram Gloger (1996, 1997); Guilhem Lavaux (1998)
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-#ifdef __GNUG__
-#pragma implementation "thread.h"
+
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
+ #pragma implementation "thread.h"
#endif
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
#include "wx/wx.h"
+#include "wx/module.h"
+#include "wx/thread.h"
+#include "wx/log.h"
wxMutex::wxMutex()
{
- m_locked = FALSE;
+ m_locked = 0;
}
wxMutex::~wxMutex()
{
+ if (m_locked)
+ wxLogDebug( "wxMutex warning: destroying a locked mutex (%d locks)", m_locked );
}
-MutexError wxMutex::Lock()
+wxMutexError wxMutex::Lock()
{
- m_locked = TRUE;
- return NO_ERROR;
+ m_locked++;
+ return wxMUTEX_NO_ERROR;
}
-MutexError wxMutex::TryLock()
+wxMutexError wxMutex::TryLock()
{
- m_locked = TRUE;
- return NO_ERROR;
+ if (m_locked > 0)
+ return wxMUTEX_BUSY;
+ m_locked++;
+ return wxMUTEX_NO_ERROR;
}
-MutexError wxMutex::Unlock()
+wxMutexError wxMutex::Unlock()
{
- m_locked = FALSE;
- return NO_ERROR;
+ if (m_locked == 0)
+ return wxMUTEX_UNLOCKED;
+ m_locked--;
+ return wxMUTEX_NO_ERROR;
}
wxCondition::wxCondition()
}
bool wxCondition::Wait(wxMutex& WXUNUSED(mutex), unsigned long WXUNUSED(sec),
- unsigned long WXUNUSED(nsec))
+ unsigned long WXUNUSED(nsec))
{
- return FALSE;
+ return FALSE;
}
void wxCondition::Signal()
{
}
-struct wxThreadPrivate {
- int thread_id;
- void* exit_status;
+struct wxThreadInternal
+{
+ int thread_id;
+ void* exit_status;
};
-ThreadError wxThread::Create()
+wxThreadError wxThread::Create()
+{
+ p_internal->exit_status = Entry();
+ OnExit();
+ return wxTHREAD_NO_ERROR;
+}
+
+wxThreadError wxThread::Destroy()
{
- p_internal->exit_status = Entry();
- OnExit();
- return NO_ERROR;
+ return wxTHREAD_NOT_RUNNING;
}
-ThreadError wxThread::Destroy()
+wxThreadError wxThread::Pause()
{
- return RUNNING;
+ return wxTHREAD_NOT_RUNNING;
}
-void wxThread::DeferDestroy()
+wxThreadError wxThread::Resume()
+{
+ return wxTHREAD_NOT_RUNNING;
+}
+
+void wxThread::DeferDestroy( bool WXUNUSED(on) )
{
}
void *wxThread::Join()
{
- return p_internal->exit_status;
+ return p_internal->exit_status;
}
unsigned long wxThread::GetID() const
{
- return 0;
+ return 0;
}
bool wxThread::IsMain()
{
- return TRUE;
+ return TRUE;
+}
+
+bool wxThread::IsRunning() const
+{
+ return FALSE;
}
bool wxThread::IsAlive() const
{
- return FALSE;
+ return FALSE;
}
void wxThread::SetPriority(int WXUNUSED(prio)) { }
-int wxThread::GetPriority() const { }
+int wxThread::GetPriority() const { return 0; }
-wxMutex wxMainMutex; // controls access to all GUI functions
+wxMutex *wxMainMutex; // controls access to all GUI functions
wxThread::wxThread()
{
- p_internal = new wxThreadPrivate();
+ p_internal = new wxThreadInternal();
}
wxThread::~wxThread()
{
- Cancel();
- Join();
- delete p_internal;
+ Destroy();
+ Join();
+ delete p_internal;
}
// The default callback just joins the thread and throws away the result.
void wxThread::OnExit()
{
- Join();
+ Join();
+}
+
+IMPLEMENT_DYNAMIC_CLASS(wxThreadModule, wxModule)
+
+bool wxThreadModule::OnInit()
+{
+ wxMainMutex = new wxMutex();
+ wxMainMutex->Lock();
+ return TRUE;
}
-// Global initialization
-static void wxThreadInit(void *WXUNUSED(client))
+void wxThreadModule::OnExit()
{
- wxMainMutex.Lock();
+ wxMainMutex->Unlock();
+ delete wxMainMutex;
}
-// Global cleanup
-static void wxThreadExit(void *WXUNUSED(client))
+
+
+void wxMutexGuiEnter()
{
- wxMainMutex.Unlock();
}
-// Let automatic initialization be performed from wxCommonInit().
-static struct
-wxThreadGlobal {
- wxThreadGlobal() {
- wxRegisterModuleFunction(wxThreadInit, wxThreadExit, NULL);
- }
-} dummy;
+void wxMutexGuiLeave()
+{
+}