]>
git.saurik.com Git - wxWidgets.git/blob - src/gtk1/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"
37 /////////////////////////////////////////////////////////////////////////////
39 /////////////////////////////////////////////////////////////////////////////
44 #include "threadgui.inc"
46 /////////////////////////////////////////////////////////////////////////////
47 // Unix implementations (SGI threads)
48 /////////////////////////////////////////////////////////////////////////////
50 class wxMutexInternal
{
58 p_internal
= new wxMutexInternal
;
59 init_lock(&(p_internal
->p_mutex
));
65 wxLogDebug( "wxMutex warning: freeing a locked mutex (%d locks)\n", m_locked
);
69 wxMutexError
wxMutex::Lock()
71 spin_lock(&(p_internal
->p_mutex
));
73 return wxMUTEX_NO_ERROR
;
76 wxMutexError
wxMutex::TryLock()
78 if (acquire_lock(&(p_internal
->p_mutex
)) != 0)
81 return wxMUTEX_NO_ERROR
;
84 wxMutexError
wxMutex::Unlock()
87 return wxMUTEX_UNLOCKED
;
88 release_lock(&(p_internal
->p_mutex
));
90 return wxMUTEX_NO_ERROR
;
93 // GL: Don't know how it works on SGI. Wolfram ?
95 wxCondition::wxCondition() {}
96 wxCondition::~wxCondition() {}
97 int wxCondition::Wait(wxMutex
& WXUNUSED(mutex
)) { return 0;}
98 int wxCondition::Wait(wxMutex
& WXUNUSED(mutex
), unsigned long WXUNUSED(sec
),
99 unsigned long WXUNUSED(nsec
)) { return 0; }
100 int wxCondition::Signal() { return 0; }
101 int wxCondition::Broadcast() { return 0; }
106 wxThreadPrivate() { thread_id
= 0; state
= STATE_IDLE
; }
107 ~wxThreadPrivate() {}
108 static void SprocStart(void *ptr
);
109 static void SignalHandler(int sig
);
111 int state
, thread_id
;
115 void wxThreadPrivate::SprocStart(void *ptr
)
119 wxThread
*thr
= (wxThread
*)ptr
;
121 thr
->p_internal
->thread_id
= getpid();
122 thr
->p_internal
->exit_status
= 0;
123 status
= thr
->Entry();
127 void wxThread::Exit(void* status
)
129 wxThread
* ptr
= this;
130 THREAD_SEND_EXIT_MSG(ptr
);
131 p_internal
->state
= STATE_EXITED
;
132 p_internal
->exit_status
= status
;
136 wxThreadError
wxThread::Create()
138 if (p_internal
->state
!= STATE_IDLE
)
139 return wxTHREAD_RUNNING
;
140 p_internal
->state
= STATE_RUNNING
;
141 if (sproc(p_internal
->SprocStart
, PR_SALL
, this) < 0) {
142 p_internal
->state
= STATE_IDLE
;
143 return wxTHREAD_NO_RESOURCE
;
145 return wxTHREAD_NO_ERROR
;
148 wxThreadError
wxThread::Destroy()
150 if (p_internal
->state
== STATE_RUNNING
)
151 p_internal
->state
= STATE_CANCELED
;
153 return wxTHREAD_NO_ERROR
;
156 wxThreadError
wxThread::Pause()
158 return wxTHREAD_NO_ERROR
;
161 wxThreadError
wxThread::Resume()
163 return wxTHREAD_NO_ERROR
;
166 void *wxThread::Join()
168 if (p_internal
->state
!= STATE_IDLE
) {
169 bool do_unlock
= wxThread::IsMain();
173 wxMainMutex
->Unlock();
174 waitpid(p_internal
->thread_id
, &stat
, 0);
177 if (!WIFEXITED(stat
) && !WIFSIGNALED(stat
))
179 p_internal
->state
= STATE_IDLE
;
180 return p_internal
->exit_status
;
185 unsigned long wxThread::GetID() const
187 return (unsigned long)p_internal
->thread_id
;
190 void wxThread::TestDestroy()
192 if (p_internal
->state
== STATE_CANCELED
) {
193 p_internal
->exit_status
= 0;
198 void wxThread::SetPriority(int prio
)
202 int wxThread::GetPriority() const
207 bool wxThread::IsMain()
209 return (int)getpid() == main_id
;
212 bool wxThread::IsAlive() const
214 return (p_internal
->state
== STATE_RUNNING
);
217 bool wxThread::IsRunning() const
219 return (p_internal
->state
== STATE_RUNNING
);
224 p_internal
= new wxThreadPrivate();
227 wxThread::~wxThread()
234 // The default callback just joins the thread and throws away the result.
235 void wxThread::OnExit()
240 // Global initialization
242 class wxThreadModule
: public wxModule
245 virtual bool OnInit();
246 virtual void OnExit();
249 DECLARE_DYNAMIC_CLASS(wxThreadModule
)
252 IMPLEMENT_DYNAMIC_CLASS(wxThreadModule
, wxModule
)
254 bool wxThreadModule::OnInit()
256 wxMainMutex
= new wxMutex();
258 p_mainid
= (int)getpid();
263 void wxThreadModule::OnExit()
265 wxMainMutex
->Unlock();