7
#define INL_ATOMOP_ITERLOCKED_INCREMENT InterlockedIncrement
8
#define INL_ATOMOP_ITERLOCKED_DECREMENT InterlockedDecrement
9
#define INL_ATOMOP_ITERLOCKED_EXCHANGED InterlockedExchange
10
#define INL_ATOMOP_ITERLOCKED_VALUE
12
#define INL_ATOMOP_ITERLOCKED_INCREMENT InterlockedIncrement64
13
#define INL_ATOMOP_ITERLOCKED_DECREMENT InterlockedDecrement64
14
#define INL_ATOMOP_ITERLOCKED_EXCHANGED InterlockedExchange64
15
#define INL_ATOMOP_ITERLOCKED_VALUE
18
t_int NThreadSafeCounter::Increment()
20
return __sync_add_and_fetch(&m_Counter, 1);
23
t_int NThreadSafeCounter::Decrement()
25
return __sync_add_and_fetch(&m_Counter, -1);
28
t_int NThreadSafeCounter::Set(t_int i)
34
t_int NThreadSafeCounter::GetValue() const
39
t_int NThreadSafeCounter::operator ++ ()
44
t_int NThreadSafeCounter::operator -- ()
49
t_bool NThreadSafeCounter::operator == (t_int i)
51
return (m_Counter == i);
54
__thread void* NThreadLocalStorage::m_TLSIndex[NThreadLocalStorage::NbTLS];
55
BOOL NThreadLocalStorage::m_TLSUsed[NThreadLocalStorage::NbTLS];
56
NThreadLocalStorage::TLS_ShutdownCallback NThreadLocalStorage::m_TLSCallbacks[NThreadLocalStorage::NbTLS];
58
BOOL NThreadLocalStorage::RegisterTLS(t_u32 index, NThreadLocalStorage::TLS_ShutdownCallback shutdownCallback)
60
nuxAssert(!m_TLSUsed[index]);
62
if (!m_TLSUsed[index])
64
// m_TLSIndex[index] = TlsAlloc();
65
// if(m_TLSIndex[index] == TLS_OUT_OF_INDEXES)
67
// nuxAssertMsg(0, TEXT("[NThreadLocalStorage::RegisterTLS] Out of TLS index."));
69
m_TLSUsed[index] = TRUE;
70
m_TLSCallbacks[index] = shutdownCallback;
79
void NThreadLocalStorage::Initialize()
81
Memset(m_TLSUsed, 0, sizeof(m_TLSUsed));
83
for (t_u32 i = 0; i < NThreadLocalStorage::NbTLS; i++)
85
// Fill the array with invalid values
90
void NThreadLocalStorage::Shutdown()
95
void NThreadLocalStorage::ThreadInit()
99
void NThreadLocalStorage::ThreadShutdown()
101
TLS_ShutdownCallback *callback = m_TLSCallbacks;
102
for (t_u32 i = 0; i < NThreadLocalStorage::NbTLS; ++i, ++callback)
111
IMPLEMENT_ROOT_OBJECT_TYPE(NThread);
114
: m_ThreadState(THREADINIT)
116
m_pThreadFunc = NThread::EntryPoint; // Can call Detach() also.
119
NThread::NThread(ThreadRoutineFunc lpExternalRoutine)
121
Attach(lpExternalRoutine);
126
if(m_ThreadCtx.m_dwTID)
127
pthread_detach(m_ThreadCtx.m_dwTID);
130
ThreadState NThread::Start( void* arg )
132
m_ThreadCtx.m_pUserData = arg;
133
int ret = pthread_create(&m_ThreadCtx.m_dwTID,
140
nuxDebugMsg(TEXT("[NThread::Start] Cannot start thread."));
141
m_ThreadState = THREAD_START_ERROR;
142
return m_ThreadState;
144
return m_ThreadState;
147
ThreadState NThread::Stop( bool bForceKill )
149
int ret = pthread_detach(m_ThreadCtx.m_dwTID);
152
nuxDebugMsg(TEXT("[NThread::Stop] Cannot detach thread."));
153
m_ThreadState = THREAD_STOP_ERROR;
154
return m_ThreadState;
156
m_ThreadState = THREADSTOP;
157
return m_ThreadState;
160
ThreadState NThread::Suspend()
162
m_ThreadState = THREADSUSPENDED;
163
return m_ThreadState;
166
ThreadState NThread::Resume()
168
return m_ThreadState;
171
// go from suspended to thread start
172
ThreadState NThread::ResumeStart()
174
m_ThreadState = THREADINIT;
175
return m_ThreadState;
178
// go from suspended to thread exit
179
ThreadState NThread::ResumeExit()
181
m_ThreadState = THREADSTOP;
182
return m_ThreadState;
185
void* NThread::EntryPoint(void* pArg)
187
NThread *pParent = reinterpret_cast<NThread*>(pArg);
190
nuxDebugMsg(TEXT("[NThread::EntryPoint] Invalid pointer. The thread will exit."));
194
if(!pParent->ThreadCtor())
196
// return another message saying the thread could not execute due to error in ThreadCtor;
199
pParent->Run( pParent->m_ThreadCtx.m_pUserData );
201
pParent->ThreadDtor();
205
t_u32 NThread::GetExitCode() const
207
return m_ThreadCtx.m_dwExitCode;
210
t_u32 NThread::GetThreadId()
212
return (t_u32)m_ThreadCtx.m_dwTID;
215
ThreadState NThread::GetThreadState() const
217
return m_ThreadState;
220
void NThread::SetThreadState(ThreadState state)
222
m_ThreadState = state;