]>
git.saurik.com Git - wxWidgets.git/blob - src/gtk/threadsgi.cpp
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxThread (SGI) Implementation
4 // Author: Original from Wolfram Gloger/Guilhem Lavaux
8 // Copyright: (c) Wolfram Gloger (1996, 1997); Guilhem Lavaux (1998)
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #pragma implementation "thread.h"
20 #include <sys/prctl.h>
21 #include "wx/thread.h"
22 #include "wx/module.h"
32 /////////////////////////////////////////////////////////////////////////////
34 /////////////////////////////////////////////////////////////////////////////
39 #include "threadgui.inc"
41 /////////////////////////////////////////////////////////////////////////////
42 // Unix implementations (SGI threads)
43 /////////////////////////////////////////////////////////////////////////////
45 class wxMutexInternal
{
53 p_internal
= new wxMutexInternal
;
54 init_lock(&(p_internal
->p_mutex
));
60 wxDebugMsg("wxMutex warning: freeing a locked mutex (%d locks)\n",
65 wxMutexError
wxMutex::Lock()
67 spin_lock(&(p_internal
->p_mutex
));
69 return MUTEX_NO_ERROR
;
72 wxMutexError
wxMutex::TryLock()
74 if (acquire_lock(&(p_internal
->p_mutex
)) != 0)
77 return MUTEX_NO_ERROR
;
80 wxMutexError
wxMutex::Unlock()
83 return MUTEX_UNLOCKED
;
84 release_lock(&(p_internal
->p_mutex
));
86 return MUTEX_NO_ERROR
;
89 // GL: Don't know how it works on SGI. Wolfram ?
91 wxCondition::wxCondition() {}
92 wxCondition::~wxCondition() {}
93 int wxCondition::Wait(wxMutex
& WXUNUSED(mutex
)) { return 0;}
94 int wxCondition::Wait(wxMutex
& WXUNUSED(mutex
), unsigned long WXUNUSED(sec
),
95 unsigned long WXUNUSED(nsec
)) { return 0; }
96 int wxCondition::Signal() { return 0; }
97 int wxCondition::Broadcast() { return 0; }
102 wxThreadPrivate() { thread_id
= 0; state
= STATE_IDLE
; }
103 ~wxThreadPrivate() {}
104 static void SprocStart(void *ptr
);
105 static void SignalHandler(int sig
);
107 int state
, thread_id
;
111 void wxThreadPrivate::SprocStart(void *ptr
)
115 wxThread
*thr
= (wxThread
*)ptr
;
117 thr
->p_internal
->thread_id
= getpid();
118 thr
->p_internal
->exit_status
= 0;
119 status
= thr
->Entry();
123 void wxThread::Exit(void* status
)
125 wxThread
* ptr
= this;
126 THREAD_SEND_EXIT_MSG(ptr
);
127 p_internal
->state
= STATE_EXITED
;
128 p_internal
->exit_status
= status
;
132 wxThreadError
wxThread::Create()
134 if (p_internal
->state
!= STATE_IDLE
)
135 return THREAD_RUNNING
;
136 p_internal
->state
= STATE_RUNNING
;
137 if (sproc(p_internal
->SprocStart
, PR_SALL
, this) < 0) {
138 p_internal
->state
= STATE_IDLE
;
139 return THREAD_NO_RESOURCE
;
141 return THREAD_NO_ERROR
;
144 wxThreadError
wxThread::Destroy()
146 if (p_internal
->state
== STATE_RUNNING
)
147 p_internal
->state
= STATE_CANCELED
;
149 return THREAD_NO_ERROR
;
152 wxThreadError
wxThread::Pause()
154 return THREAD_NO_ERROR
;
157 wxThreadError
wxThread::Resume()
159 return THREAD_NO_ERROR
;
162 void *wxThread::Join()
164 if (p_internal
->state
!= STATE_IDLE
) {
165 bool do_unlock
= wxThread::IsMain();
169 wxMainMutex
->Unlock();
170 waitpid(p_internal
->thread_id
, &stat
, 0);
173 if (!WIFEXITED(stat
) && !WIFSIGNALED(stat
))
175 p_internal
->state
= STATE_IDLE
;
176 return p_internal
->exit_status
;
181 unsigned long wxThread::GetID() const
183 return (unsigned long)p_internal
->thread_id
;
186 void wxThread::TestDestroy()
188 if (p_internal
->state
== STATE_CANCELED
) {
189 p_internal
->exit_status
= 0;
194 void wxThread::SetPriority(int prio
)
198 int wxThread::GetPriority() const
203 bool wxThread::IsMain()
205 return (int)getpid() == main_id
;
208 bool wxThread::IsAlive() const
210 return (p_internal
->state
== STATE_RUNNING
);
213 bool wxThread::IsRunning() const
215 return (p_internal
->state
== STATE_RUNNING
);
220 p_internal
= new wxThreadPrivate();
223 wxThread::~wxThread()
230 // The default callback just joins the thread and throws away the result.
231 void wxThread::OnExit()
236 // Global initialization
237 class wxThreadModule
: public wxModule
{
238 DECLARE_DYNAMIC_CLASS(wxThreadModule
)
240 virtual bool OnInit() {
241 wxMainMutex
= new wxMutex();
243 p_mainid
= (int)getpid();
247 virtual void OnExit() {
248 wxMainMutex
->Unlock();
254 IMPLEMENT_DYNAMIC_CLASS(wxThreadModule
, wxModule
)