doubango/tinySAK/winrt/ThreadEmulation.h
175b478c
 // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
 // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
 // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
 // PARTICULAR PURPOSE.
 //
 // Copyright (c) Microsoft Corporation. All rights reserved.
 //
 //
 // Emulates a subset of the Win32 threading API as a layer on top of WinRT threadpools.
 //
 // Supported features:
 //
 //    - CreateThread (returns a standard Win32 handle which can be waited on, then closed)
 //    - CREATE_SUSPENDED and ResumeThread
 //    - Partial support for SetThreadPriority (see below)
 //    - Sleep
 //    - Thread local storage (TlsAlloc, TlsFree, TlsGetValue, TlsSetValue)
 //
 // Differences from Win32:
 //
 //    - If using TLS other than from this CreateThread emulation, call TlsShutdown before thread/task exit
 //    - No ExitThread or TerminateThread (just return from the thread function to exit)
 //    - No SuspendThread, so ResumeThread is only useful in combination with CREATE_SUSPENDED
 //    - SetThreadPriority is only available while a thread is in CREATE_SUSPENDED state
 //    - SetThreadPriority only supports three priority levels (negative, zero, or positive)
 //    - No thread identifier APIs (GetThreadId, GetCurrentThreadId, OpenThread)
 //    - No affinity APIs
 //    - No GetExitCodeThread
 //    - Failure cases return error codes but do not always call SetLastError
 
 #pragma once
 
 #include <windows.h>
 
 namespace ThreadEmulation
 {
     #ifndef CREATE_SUSPENDED
     #define CREATE_SUSPENDED 0x00000004
     #endif
 
     HANDLE WINAPI CreateThread(_In_opt_ LPSECURITY_ATTRIBUTES unusedThreadAttributes, _In_ SIZE_T unusedStackSize, _In_ LPTHREAD_START_ROUTINE lpStartAddress, _In_opt_ LPVOID lpParameter, _In_ DWORD dwCreationFlags, _Out_opt_ LPDWORD unusedThreadId);
     DWORD WINAPI ResumeThread(_In_ HANDLE hThread);
     BOOL WINAPI SetThreadPriority(_In_ HANDLE hThread, _In_ int nPriority);
     
     VOID WINAPI Sleep(_In_ DWORD dwMilliseconds);
 
     DWORD WINAPI TlsAlloc();
     BOOL WINAPI TlsFree(_In_ DWORD dwTlsIndex);
     LPVOID WINAPI TlsGetValue(_In_ DWORD dwTlsIndex);
     BOOL WINAPI TlsSetValue(_In_ DWORD dwTlsIndex, _In_opt_ LPVOID lpTlsValue);
     
     void WINAPI TlsShutdown();
 }