X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7c351dad14431c3e1aeeef6b86f61ba898d1d9ad..bb5a951418acd22d69a7f1973319f47190fbac79:/src/gtk1/threadsgi.cpp diff --git a/src/gtk1/threadsgi.cpp b/src/gtk1/threadsgi.cpp index 07d7cdabde..6ba3e7255c 100644 --- a/src/gtk1/threadsgi.cpp +++ b/src/gtk1/threadsgi.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: threadsgi.cpp +// Name: src/gtk1/threadsgi.cpp // Purpose: wxThread (SGI) Implementation // Author: Original from Wolfram Gloger/Guilhem Lavaux // Modified by: @@ -8,8 +8,16 @@ // Copyright: (c) Wolfram Gloger (1996, 1997); Guilhem Lavaux (1998) // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "thread.h" + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#include "wx/thread.h" + +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/utils.h" + #include "wx/module.h" #endif #include @@ -19,7 +27,11 @@ #include #include -enum thread_state { +#include "gdk/gdk.h" +#include "gtk/gtk.h" + +enum thread_state +{ STATE_IDLE = 0, STATE_RUNNING, STATE_CANCELED, @@ -31,7 +43,7 @@ enum thread_state { ///////////////////////////////////////////////////////////////////////////// static int p_mainid; -wxMutex wxMainMutex; +wxMutex *wxMainMutex; #include "threadgui.inc" @@ -46,42 +58,53 @@ public: wxMutex::wxMutex() { + m_locked = 0; p_internal = new wxMutexInternal; init_lock(&(p_internal->p_mutex)); } wxMutex::~wxMutex() { + if (m_locked > 0) + { + wxLogDebug( "wxMutex warning: freeing a locked mutex (%d locks)\n", m_locked ); + } + delete p_internal; } -wxMutex::MutexError wxMutex::Lock(void) +wxMutexError wxMutex::Lock() { spin_lock(&(p_internal->p_mutex)); - return NO_ERROR; + m_locked++; + return wxMUTEX_NO_ERROR; } -wxMutex::MutexError wxMutex::TryLock(void) +wxMutexError wxMutex::TryLock() { if (acquire_lock(&(p_internal->p_mutex)) != 0) - return BUSY; - return NO_ERROR; + return wxMUTEX_BUSY; + m_locked++; + return wxMUTEX_NO_ERROR; } -wxMutex::MutexError wxMutex::Unlock(void) +wxMutexError wxMutex::Unlock() { + if (m_locked == 0) + return wxMUTEX_UNLOCKED; release_lock(&(p_internal->p_mutex)); - return NO_ERROR; + m_locked--; + return wxMUTEX_NO_ERROR; } -// GLH: Don't now how it works on SGI. Wolfram ? +// GL: Don't know how it works on SGI. Wolfram ? -wxCondition::wxCondition(void) {} -wxCondition::~wxCondition(void) {} +wxCondition::wxCondition() {} +wxCondition::~wxCondition() {} int wxCondition::Wait(wxMutex& WXUNUSED(mutex)) { return 0;} int wxCondition::Wait(wxMutex& WXUNUSED(mutex), unsigned long WXUNUSED(sec), unsigned long WXUNUSED(nsec)) { return 0; } -int wxCondition::Signal(void) { return 0; } -int wxCondition::Broadcast(void) { return 0; } +int wxCondition::Signal() { return 0; } +int wxCondition::Broadcast() { return 0; } class wxThreadPrivate { @@ -116,22 +139,34 @@ void wxThread::Exit(void* status) _exit(0); } -wxThread::ThreadError wxThread::Create() +wxThreadError wxThread::Create() { if (p_internal->state != STATE_IDLE) - return RUNNING; + return wxTHREAD_RUNNING; p_internal->state = STATE_RUNNING; if (sproc(p_internal->SprocStart, PR_SALL, this) < 0) { p_internal->state = STATE_IDLE; - return NO_RESOURCE; + return wxTHREAD_NO_RESOURCE; } - return NO_ERROR; + return wxTHREAD_NO_ERROR; } -void wxThread::Destroy() +wxThreadError wxThread::Destroy() { if (p_internal->state == STATE_RUNNING) p_internal->state = STATE_CANCELED; + + return wxTHREAD_NO_ERROR; +} + +wxThreadError wxThread::Pause() +{ + return wxTHREAD_NO_ERROR; +} + +wxThreadError wxThread::Resume() +{ + return wxTHREAD_NO_ERROR; } void *wxThread::Join() @@ -141,10 +176,10 @@ void *wxThread::Join() int stat; if (do_unlock) - wxMainMutex.Unlock(); + wxMainMutex->Unlock(); waitpid(p_internal->thread_id, &stat, 0); if (do_unlock) - wxMainMutex.Lock(); + wxMainMutex->Lock(); if (!WIFEXITED(stat) && !WIFSIGNALED(stat)) return 0; p_internal->state = STATE_IDLE; @@ -153,7 +188,7 @@ void *wxThread::Join() return 0; } -unsigned long wxThread::GetID() +unsigned long wxThread::GetID() const { return (unsigned long)p_internal->thread_id; } @@ -170,15 +205,26 @@ void wxThread::SetPriority(int prio) { } -int wxThread::GetPriority(void) +int wxThread::GetPriority() const { + return 0; } -bool wxThreadIsMain() +bool wxThread::IsMain() { return (int)getpid() == main_id; } +bool wxThread::IsAlive() const +{ + return (p_internal->state == STATE_RUNNING); +} + +bool wxThread::IsRunning() const +{ + return (p_internal->state == STATE_RUNNING); +} + wxThread::wxThread() { p_internal = new wxThreadPrivate(); @@ -198,19 +244,31 @@ void wxThread::OnExit() } // Global initialization -class wxThreadModule : public wxModule { - DECLARE_DYNAMIC_CLASS(wxThreadModule) + +class wxThreadModule : public wxModule +{ public: - virtual bool OnInit(void) { - wxThreadGuiInit(); - p_mainid = (int)getpid(); - wxMainMutex.Lock(); - } + virtual bool OnInit(); + virtual void OnExit(); - virtual void OnExit(void) { - wxMainMutex.Unlock(); - wxThreadGuiExit(); - } +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; +}