implement CreateThread with boost::thread
I'm not sure why this wasn't done before. - Removes typedef of pthread_t on Windows, which fixes a native compile issue on mingw.
This commit is contained in:
parent
74d36d44f2
commit
61d8507140
2 changed files with 13 additions and 52 deletions
12
src/util.cpp
12
src/util.cpp
|
@ -1299,3 +1299,15 @@ void RenameThread(const char* name)
|
||||||
(void)name;
|
(void)name;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CreateThread(void(*pfn)(void*), void* parg)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
boost::thread(pfn, parg); // thread detaches when out of scope
|
||||||
|
} catch(boost::thread_resource_error &e) {
|
||||||
|
printf("Error creating thread: %s\n", e.what());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
53
src/util.h
53
src/util.h
|
@ -539,65 +539,14 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool CreateThread(void(*pfn)(void*), void* parg);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Note: It turns out we might have been able to use boost::thread
|
|
||||||
// by using TerminateThread(boost::thread.native_handle(), 0);
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
typedef HANDLE pthread_t;
|
|
||||||
|
|
||||||
inline pthread_t CreateThread(void(*pfn)(void*), void* parg, bool fWantHandle=false)
|
|
||||||
{
|
|
||||||
DWORD nUnused = 0;
|
|
||||||
HANDLE hthread =
|
|
||||||
CreateThread(
|
|
||||||
NULL, // default security
|
|
||||||
0, // inherit stack size from parent
|
|
||||||
(LPTHREAD_START_ROUTINE)pfn, // function pointer
|
|
||||||
parg, // argument
|
|
||||||
0, // creation option, start immediately
|
|
||||||
&nUnused); // thread identifier
|
|
||||||
if (hthread == NULL)
|
|
||||||
{
|
|
||||||
printf("Error: CreateThread() returned %d\n", GetLastError());
|
|
||||||
return (pthread_t)0;
|
|
||||||
}
|
|
||||||
if (!fWantHandle)
|
|
||||||
{
|
|
||||||
CloseHandle(hthread);
|
|
||||||
return (pthread_t)-1;
|
|
||||||
}
|
|
||||||
return hthread;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void SetThreadPriority(int nPriority)
|
inline void SetThreadPriority(int nPriority)
|
||||||
{
|
{
|
||||||
SetThreadPriority(GetCurrentThread(), nPriority);
|
SetThreadPriority(GetCurrentThread(), nPriority);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
inline pthread_t CreateThread(void(*pfn)(void*), void* parg, bool fWantHandle=false)
|
|
||||||
{
|
|
||||||
pthread_t hthread = 0;
|
|
||||||
int ret = pthread_create(&hthread, NULL, (void*(*)(void*))pfn, parg);
|
|
||||||
if (ret != 0)
|
|
||||||
{
|
|
||||||
printf("Error: pthread_create() returned %d\n", ret);
|
|
||||||
return (pthread_t)0;
|
|
||||||
}
|
|
||||||
if (!fWantHandle)
|
|
||||||
{
|
|
||||||
pthread_detach(hthread);
|
|
||||||
return (pthread_t)-1;
|
|
||||||
}
|
|
||||||
return hthread;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define THREAD_PRIORITY_LOWEST PRIO_MAX
|
#define THREAD_PRIORITY_LOWEST PRIO_MAX
|
||||||
#define THREAD_PRIORITY_BELOW_NORMAL 2
|
#define THREAD_PRIORITY_BELOW_NORMAL 2
|
||||||
|
|
Loading…
Reference in a new issue