4
#include <cell/atomic.h>
9
#define INL_ATOMOP_ITERLOCKED_INCREMENT InterlockedIncrement
10
#define INL_ATOMOP_ITERLOCKED_DECREMENT InterlockedDecrement
11
#define INL_ATOMOP_ITERLOCKED_EXCHANGED InterlockedExchange
12
#define INL_ATOMOP_ITERLOCKED_VALUE
14
#define INL_ATOMOP_ITERLOCKED_INCREMENT InterlockedIncrement64
15
#define INL_ATOMOP_ITERLOCKED_DECREMENT InterlockedDecrement64
16
#define INL_ATOMOP_ITERLOCKED_EXCHANGED InterlockedExchange64
17
#define INL_ATOMOP_ITERLOCKED_VALUE
20
t_u32 NThreadSafeCounter::Increment()
22
return cellAtomicIncr32(&m_Counter);
24
t_u32 NThreadSafeCounter::Decrement()
26
return cellAtomicDecr32(&m_Counter);
28
t_u32 NThreadSafeCounter::Set(t_u32 i)
30
return cellAtomicStore32(&m_Counter, i);
33
t_u32 NThreadSafeCounter::GetValue() const
38
t_u32 NThreadSafeCounter::operator ++ ()
43
t_u32 NThreadSafeCounter::operator -- ()
48
t_bool NThreadSafeCounter::operator == (t_u32 i)
50
return (m_Counter == i);
53
__thread void* NThreadLocalStorage::m_TLSIndex[NThreadLocalStorage::NbTLS];
54
BOOL NThreadLocalStorage::m_TLSUsed[NThreadLocalStorage::NbTLS];
55
NThreadLocalStorage::TLS_ShutdownCallback NThreadLocalStorage::m_TLSCallbacks[NThreadLocalStorage::NbTLS];
57
BOOL NThreadLocalStorage::RegisterTLS(t_u32 index, NThreadLocalStorage::TLS_ShutdownCallback shutdownCallback)
59
nuxAssert(!m_TLSUsed[index]);
61
if (!m_TLSUsed[index])
63
// m_TLSIndex[index] = TlsAlloc();
64
// if(m_TLSIndex[index] == TLS_OUT_OF_INDEXES)
66
// nuxAssertMsg(0, TEXT("[NThreadLocalStorage::RegisterTLS] Out of TLS index."));
68
m_TLSUsed[index] = TRUE;
69
m_TLSCallbacks[index] = shutdownCallback;
78
void NThreadLocalStorage::Initialize()
80
Memset(m_TLSUsed, 0, sizeof(m_TLSUsed));
82
for (t_u32 i = 0; i < NThreadLocalStorage::NbTLS; i++)
84
// Fill the array with invalid values
89
void NThreadLocalStorage::Shutdown()
94
void NThreadLocalStorage::ThreadInit()
98
void NThreadLocalStorage::ThreadShutdown()
100
TLS_ShutdownCallback *callback = m_TLSCallbacks;
101
for (t_u32 i = 0; i < NThreadLocalStorage::NbTLS; ++i, ++callback)
110
IMPLEMENT_ROOT_OBJECT_TYPE(NThread);
113
: m_ThreadState(THREADINIT)
115
m_pThreadFunc = NThread::EntryPoint; // Can call Detach() also.
118
NThread::NThread(ThreadRoutineFunc lpExternalRoutine)
120
Attach(lpExternalRoutine);
125
sys_ppu_thread_detach(m_ThreadCtx.m_dwTID);
128
ThreadState NThread::Start( void* arg )
130
m_ThreadCtx.m_pUserData = arg;
131
if(sys_ppu_thread_create(&m_ThreadCtx.m_dwTID,
137
"inalogic_thread") == CELL_OK)
139
nuxDebugMsg(TEXT("[NThread::Start] Cannot start thread."));
140
m_ThreadState = THREAD_START_ERROR;
141
return m_ThreadState;
143
return m_ThreadState;
146
ThreadState NThread::Stop( bool bForceKill )
148
sys_ppu_thread_detach(m_ThreadCtx.m_dwTID);
150
m_ThreadState = THREADSTOP;
151
return m_ThreadState;
154
ThreadState NThread::Suspend()
156
m_ThreadState = THREADSUSPENDED;
157
return m_ThreadState;
160
ThreadState NThread::Resume()
162
return m_ThreadState;
165
// go from suspended to thread start
166
ThreadState NThread::ResumeStart()
168
m_ThreadState = THREADINIT;
169
return m_ThreadState;
172
// go from suspended to thread exit
173
ThreadState NThread::ResumeExit()
175
m_ThreadState = THREADSTOP;
176
return m_ThreadState;
179
void NThread::EntryPoint(t_u64 pArg)
181
NThread *pParent = reinterpret_cast<NThread*>(pArg);
182
if(!pParent->ThreadCtor())
184
// return another message saying the thread could not execute due to error in ThreadCtor;
186
pParent->Run( pParent->m_ThreadCtx.m_pUserData );
187
pParent->ThreadDtor();
190
t_u32 NThread::GetExitCode() const
192
return m_ThreadCtx.m_dwExitCode;
195
t_u32 NThread::GetThreadId()
197
return (t_u32)m_ThreadCtx.m_dwTID;
200
ThreadState NThread::GetThreadState() const
202
return m_ThreadState;
205
void NThread::SetThreadState(ThreadState state)
207
m_ThreadState = state;