Adding WinRT threading support.

This commit is contained in:
Mike Popoloski
2014-11-14 08:15:54 -05:00
parent 7a4e5892bf
commit 86291105e6
3 changed files with 33 additions and 7 deletions

View File

@@ -30,6 +30,7 @@
|| BX_PLATFORM_QNX \
|| BX_PLATFORM_RPI \
|| BX_PLATFORM_WINDOWS \
|| BX_PLATFORM_WINRT \
? 1 : 0)
#endif // BX_CONFIG_CRT_FILE_READER_WRITER
@@ -38,7 +39,7 @@
#endif // BX_CONFIG_SEMAPHORE_PTHREAD
#ifndef BX_CONFIG_SUPPORTS_THREADING
# define BX_CONFIG_SUPPORTS_THREADING !(BX_PLATFORM_EMSCRIPTEN || BX_PLATFORM_WINRT)
# define BX_CONFIG_SUPPORTS_THREADING !(BX_PLATFORM_EMSCRIPTEN)
#endif // BX_CONFIG_SUPPORTS_THREADING
#endif // BX_CONFIG_H_HEADER_GUARD

View File

@@ -202,7 +202,11 @@ namespace bx
public:
Semaphore()
{
#if BX_PLATFORM_WINRT
m_handle = CreateSemaphoreEx(NULL, 0, LONG_MAX, NULL, 0, SEMAPHORE_ALL_ACCESS);
#else
m_handle = CreateSemaphore(NULL, 0, LONG_MAX, NULL);
#endif
BX_CHECK(NULL != m_handle, "Failed to create Semaphore!");
}
@@ -219,7 +223,11 @@ namespace bx
bool wait(int32_t _msecs = -1) const
{
DWORD milliseconds = (0 > _msecs) ? INFINITE : _msecs;
return WAIT_OBJECT_0 == WaitForSingleObject(m_handle, milliseconds);
#if BX_PLATFORM_WINRT
return WAIT_OBJECT_0 == WaitForSingleObjectEx(m_handle, milliseconds, FALSE);
#else
return WAIT_OBJECT_0 == WaitForSingleObject(m_handle, milliseconds);
#endif
}
private:

View File

@@ -8,7 +8,11 @@
#if BX_PLATFORM_POSIX
# include <pthread.h>
#endif // BX_PLATFORM_POSIX
#elif BX_PLATFORM_WINRT
using namespace Platform;
using namespace Windows::Foundation;
using namespace Windows::System::Threading;
#endif
#include "sem.h"
@@ -27,7 +31,7 @@ namespace bx
public:
Thread()
#if BX_PLATFORM_WINDOWS|BX_PLATFORM_XBOX360
#if BX_PLATFORM_WINDOWS|BX_PLATFORM_XBOX360|BX_PLATFORM_WINRT
: m_handle(INVALID_HANDLE_VALUE)
#elif BX_PLATFORM_POSIX
: m_handle(0)
@@ -65,6 +69,15 @@ namespace bx
, 0
, NULL
);
#elif BX_PLATFORM_WINRT
m_handle = CreateEventEx(nullptr, nullptr, CREATE_EVENT_MANUAL_RESET, EVENT_ALL_ACCESS);
auto workItemHandler = ref new WorkItemHandler([=](IAsyncAction^)
{
m_exitCode = threadFunc(this);
SetEvent(m_handle);
}, CallbackContext::Any);
ThreadPool::RunAsync(workItemHandler, WorkItemPriority::Normal, WorkItemOptions::TimeSliced);
#elif BX_PLATFORM_POSIX
int result;
BX_UNUSED(result);
@@ -99,6 +112,10 @@ namespace bx
GetExitCodeThread(m_handle, (DWORD*)&m_exitCode);
CloseHandle(m_handle);
m_handle = INVALID_HANDLE_VALUE;
#elif BX_PLATFORM_WINRT
WaitForSingleObjectEx(m_handle, INFINITE, FALSE);
CloseHandle(m_handle);
m_handle = INVALID_HANDLE_VALUE;
#elif BX_PLATFORM_POSIX
union
{
@@ -129,7 +146,7 @@ namespace bx
return m_fn(m_userData);
}
#if BX_PLATFORM_WINDOWS|BX_PLATFORM_XBOX360
#if BX_PLATFORM_WINDOWS|BX_PLATFORM_XBOX360|BX_PLATFORM_WINRT
static DWORD WINAPI threadFunc(LPVOID _arg)
{
Thread* thread = (Thread*)_arg;
@@ -150,7 +167,7 @@ namespace bx
}
#endif // BX_PLATFORM_
#if BX_PLATFORM_WINDOWS|BX_PLATFORM_XBOX360
#if BX_PLATFORM_WINDOWS|BX_PLATFORM_XBOX360|BX_PLATFORM_WINRT
HANDLE m_handle;
#elif BX_PLATFORM_POSIX
pthread_t m_handle;
@@ -194,7 +211,7 @@ namespace bx
uint32_t m_id;
};
#else
#elif !(BX_PLATFORM_WINRT)
class TlsData
{