]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/threadsgi.cpp
check that the version of __sync_sub_and_fetch that returns a value is supported...
[wxWidgets.git] / src / gtk / threadsgi.cpp
index 07d7cdabdeb2ecc4fd9af222a72b42db780caeda..f8d7d177e0ffb1171be2930c24876246a048cfa0 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
-// Name:        threadsgi.cpp
+// Name:        src/gtk/threadsgi.cpp
 // Purpose:     wxThread (SGI) Implementation
 // Author:      Original from Wolfram Gloger/Guilhem Lavaux
 // Modified by:
 // 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
 /////////////////////////////////////////////////////////////////////////////
 // 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 <stdio.h>
 #endif
 
 #include <stdio.h>
 #include <sys/wait.h>
 #include <sys/prctl.h>
 
 #include <sys/wait.h>
 #include <sys/prctl.h>
 
-enum thread_state {
+#include "gdk/gdk.h"
+#include "gtk/gtk.h"
+
+enum thread_state
+{
   STATE_IDLE = 0,
   STATE_RUNNING,
   STATE_CANCELED,
   STATE_IDLE = 0,
   STATE_RUNNING,
   STATE_CANCELED,
@@ -31,7 +43,7 @@ enum thread_state {
 /////////////////////////////////////////////////////////////////////////////
 
 static int p_mainid;
 /////////////////////////////////////////////////////////////////////////////
 
 static int p_mainid;
-wxMutex wxMainMutex;
+wxMutex *wxMainMutex;
 
 #include "threadgui.inc"
 
 
 #include "threadgui.inc"
 
@@ -46,42 +58,51 @@ public:
 
 wxMutex::wxMutex()
 {
 
 wxMutex::wxMutex()
 {
+  m_locked = 0;
   p_internal = new wxMutexInternal;
   init_lock(&(p_internal->p_mutex));
 }
 
 wxMutex::~wxMutex()
 {
   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));
 {
   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)
 {
   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));
   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::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 {
 
 class
 wxThreadPrivate {
@@ -116,22 +137,34 @@ void wxThread::Exit(void* status)
   _exit(0);
 }
 
   _exit(0);
 }
 
-wxThread::ThreadError wxThread::Create()
+wxThreadError wxThread::Create()
 {
   if (p_internal->state != STATE_IDLE)
 {
   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;
   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;
 {
   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()
 }
 
 void *wxThread::Join()
@@ -141,10 +174,10 @@ void *wxThread::Join()
     int stat;
 
     if (do_unlock)
     int stat;
 
     if (do_unlock)
-      wxMainMutex.Unlock();
+      wxMainMutex->Unlock();
     waitpid(p_internal->thread_id, &stat, 0);
     if (do_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;
     if (!WIFEXITED(stat) && !WIFSIGNALED(stat))
       return 0;
     p_internal->state = STATE_IDLE;
@@ -153,7 +186,7 @@ void *wxThread::Join()
   return 0;
 }
 
   return 0;
 }
 
-unsigned long wxThread::GetID()
+unsigned long wxThread::GetID() const
 {
   return (unsigned long)p_internal->thread_id;
 }
 {
   return (unsigned long)p_internal->thread_id;
 }
@@ -170,15 +203,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;
 }
 
 {
   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();
 wxThread::wxThread()
 {
   p_internal = new wxThreadPrivate();
@@ -198,19 +242,31 @@ void wxThread::OnExit()
 }
 
 // Global initialization
 }
 
 // Global initialization
-class wxThreadModule : public wxModule {
-  DECLARE_DYNAMIC_CLASS(wxThreadModule)
+
+class wxThreadModule : public wxModule
+{
 public:
 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)
 };
 
 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;
+}