36#ifndef _U_Thread_Win32_
37#define _U_Thread_Win32_
39#include "rtabmap/utilite/utilite_export.h"
40#include "rtabmap/utilite/Win32/UWin32.h"
41#include "rtabmap/utilite/USemaphore.h"
42#include "rtabmap/utilite/UMutex.h"
44inline void uSleep(
unsigned int ms)
51# ifdef _USE_BEGINTHREAD
52# define THREAD_CALL __cdecl
53# define THREAD_HANDLE uintptr_t
54# define THREAD_RET_T void
55# define CREATE_THREAD_FAILED (-1L)
56# define CREATE_THREAD_ERROR (errno)
57# define CREATE_THREAD(_S,_F,_P) ((Handle)_beginthread((void (__cdecl *)(void *))_F,_S,(void *)_P))
58# define EXIT_THREAD _endthread()
59# define CLOSE_HANDLE(x) 1
60# define THREAD_RETURN(x) return
62# define THREAD_CALL WINAPI
63# define THREAD_HANDLE HANDLE
64# define THREAD_RET_T UINT
65# define CREATE_THREAD_FAILED (0L)
66# define CREATE_THREAD_ERROR (errno)
67# define CREATE_THREAD(_S,_F,_P) ((Handle)_beginthreadex(0,_S,(UINT (WINAPI *)(void *))_F,(void *)_P,0,0))
68# define EXIT_THREAD _endthreadex(0)
69# define CLOSE_HANDLE(x) CloseHandle(x)
70# define THREAD_RETURN(x) return(x)
73# define THREAD_CALL WINAPI
74# define THREAD_HANDLE HANDLE
75# define THREAD_RET_T DWORD
76# define CREATE_THREAD_FAILED (0L)
77# define CREATE_THREAD_ERROR GetLastError()
78# define CREATE_THREAD(_S,_F,_P) ((Handle)CreateThread(0,_S,(DWORD (WINAPI *)(void *))_F,(void *)_P,0,0))
79# define CREATE_THREAD2(_S,_F,_P,_ID) ((Handle)CreateThread(0,_S,(DWORD (WINAPI *)(void *))_F,(void *)_P,0,_ID))
80# define EXIT_THREAD ExitThread(0)
81# define CLOSE_HANDLE(x) CloseHandle(x)
82# define THREAD_RETURN(x) return(x)
85#define InvalidHandle 0
97 typedef Thread_T & Thread_R;
98 typedef const Thread_T & Thread_C_R;
100 typedef THREAD_HANDLE Handle;
101 typedef void (* Handler)( Thread_R );
106 virtual void ThreadMain( Thread_R ) = 0;
111 static void TestCancel()
116 Handle Hnd = InvalidHandle;
117 DuplicateHandle(GetCurrentProcess(),GetCurrentThread(),GetCurrentProcess(),(LPHANDLE)&Hnd,NULL,0,NULL);
127 const Handler & Function,
129 Handle *
const & H = 0,
130 const bool & CreateDetached =
false,
131 const unsigned int & StackSize = 0,
132 const bool & CancelEnable =
false,
133 const bool & CancelAsync =
false
138 Instance I(Param,0,Function);
140 Handle Hnd(CREATE_THREAD(StackSize,ThreadMainHandler,&I));
142 if ( Hnd == CREATE_THREAD_FAILED )
144 if ( H ) *H = InvalidHandle;
146 return CREATE_THREAD_ERROR;
154 if ( CreateDetached ) CLOSE_HANDLE(Hnd);
160 Handle *
const & H = 0,
161 const bool & CreateDetached =
false,
162 const unsigned int & StackSize = 0,
163 const bool & CancelEnable =
false,
164 const bool & CancelAsync =
false
169 Instance I(Param,
const_cast<UThreadC *
>(
this));
171 Handle Hnd(CREATE_THREAD(StackSize,ThreadMainHandler,&I));
173 if ( Hnd == CREATE_THREAD_FAILED )
175 if ( H ) *H = InvalidHandle;
177 return CREATE_THREAD_ERROR;
185 if ( CreateDetached ) CLOSE_HANDLE(Hnd);
189 static int Join(
const Handle &H )
191 DWORD R = WaitForSingleObject((HANDLE)H,INFINITE);
193 if ( (R == WAIT_OBJECT_0) || (R == WAIT_ABANDONED) )
199 if ( R == WAIT_TIMEOUT )
return EAGAIN;
203 static int Kill(
const Handle &H )
204 {
return TerminateThread((HANDLE)H,0) ? 0 : EINVAL; }
206 static int Detach(
const Handle &H )
207 {
return (CLOSE_HANDLE(H)?0:EINVAL); }
211 static const UMutex &M_Create() {
static UMutex M;
return M; }
214 static THREAD_RET_T THREAD_CALL ThreadMainHandler( Instance *Param )
217 Thread_T Data(I.Data);
221 I.Owner->ThreadMain(Data);
232 : pFN(pH), Data(P), Owner(O) {}
235 typename UThreadC<Thread_T>::Thread_C_R Data;
251 typedef THREAD_HANDLE Handle;
252 typedef void ( *Handler)();
259 virtual void ThreadMain() = 0;
264 static void TestCancel()
269 return (
int)GetCurrentThreadId();
281 const Handler & Function,
282 Handle *
const & H = 0,
283 const bool & CreateDetached =
false,
284 const unsigned int & StackSize = 0,
285 const bool & CancelEnable =
false,
286 const bool & CancelAsync =
false
289 Handle Hnd(CREATE_THREAD(StackSize,ThreadMainHandler_S,Function));
291 if ( Hnd == CREATE_THREAD_FAILED )
293 if ( H ) *H = InvalidHandle;
294 return (
int)CREATE_THREAD_ERROR;
298 if ( CreateDetached ) CLOSE_HANDLE(Hnd);
303 Handle *
const & H = 0,
304 const bool & CreateDetached =
false,
305 const unsigned int & StackSize = 0,
306 const bool & CancelEnable =
false,
307 const bool & CancelAsync =
false
310 Handle Hnd(CREATE_THREAD(StackSize,ThreadMainHandler,
this));
312 if ( Hnd == CREATE_THREAD_FAILED )
314 if ( H ) *H = InvalidHandle;
315 return (
int)CREATE_THREAD_ERROR;
319 if ( CreateDetached ) CLOSE_HANDLE(Hnd);
325 unsigned long & ThreadId,
326 Handle *
const & H = 0,
327 const bool & CreateDetached =
false,
328 const unsigned int & StackSize = 0,
329 const bool & CancelEnable =
false,
330 const bool & CancelAsync =
false
335 *H = CREATE_THREAD2(StackSize,ThreadMainHandler,
this, (LPDWORD)&
id);
336 ThreadId = (
unsigned long)
id;
338 if ( *H == CREATE_THREAD_FAILED )
341 return (
int)CREATE_THREAD_ERROR;
344 if ( CreateDetached ) CLOSE_HANDLE(*H);
348 static int Join(
const Handle &H )
350 DWORD R = WaitForSingleObject((HANDLE)H,INFINITE);
352 if ( (R == WAIT_OBJECT_0) || (R == WAIT_ABANDONED) )
358 if ( R == WAIT_TIMEOUT )
return EAGAIN;
362 static int Kill(
const Handle &H )
363 {
return TerminateThread((HANDLE)H,0) ? 0 : EINVAL; }
365 static int Detach(
const Handle &H )
366 {
return (CLOSE_HANDLE(H)?0:EINVAL); }
370 static THREAD_RET_T THREAD_CALL ThreadMainHandler(
UThreadC<void> *Param )
377 static THREAD_RET_T THREAD_CALL ThreadMainHandler_S( Handler Param )