1 /*-------------------------------------------------------------------------
2 * drawElements Thread Library
3 * ---------------------------
4 *
5 * Copyright 2014 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 *//*!
20 * \file
21 * \brief Win32 implementation of thread management.
22 *//*--------------------------------------------------------------------*/
23
24 #include "deThread.h"
25
26 #if (DE_OS == DE_OS_WIN32 || DE_OS == DE_OS_WINCE)
27
28 #include "deMemory.h"
29
30 #define VC_EXTRALEAN
31 #define WIN32_LEAN_AND_MEAN
32 #include <windows.h>
33
34 /* Thread handle equals deThread in this implementation. */
35 DE_STATIC_ASSERT(sizeof(deThread) >= sizeof(HANDLE));
36
37 typedef struct ThreadEntry_s
38 {
39 deThreadFunc func;
40 void* arg;
41 } ThreadEntry;
42
mapPriority(deThreadPriority priority)43 static int mapPriority (deThreadPriority priority)
44 {
45 switch (priority)
46 {
47 case DE_THREADPRIORITY_LOWEST: return THREAD_PRIORITY_IDLE;
48 case DE_THREADPRIORITY_LOW: return THREAD_PRIORITY_LOWEST;
49 case DE_THREADPRIORITY_NORMAL: return THREAD_PRIORITY_NORMAL;
50 case DE_THREADPRIORITY_HIGH: return THREAD_PRIORITY_ABOVE_NORMAL;
51 case DE_THREADPRIORITY_HIGHEST: return THREAD_PRIORITY_HIGHEST;
52 default: DE_ASSERT(DE_FALSE);
53 }
54 return 0;
55 }
56
startThread(LPVOID entryPtr)57 static DWORD __stdcall startThread (LPVOID entryPtr)
58 {
59 ThreadEntry* entry = (ThreadEntry*)entryPtr;
60 deThreadFunc func = entry->func;
61 void* arg = entry->arg;
62
63 deFree(entry);
64
65 func(arg);
66
67 return 0;
68 }
69
deThread_create(deThreadFunc func,void * arg,const deThreadAttributes * attributes)70 deThread deThread_create (deThreadFunc func, void* arg, const deThreadAttributes* attributes)
71 {
72 ThreadEntry* entry = (ThreadEntry*)deMalloc(sizeof(ThreadEntry));
73 HANDLE thread = 0;
74
75 if (!entry)
76 return 0;
77
78 entry->func = func;
79 entry->arg = arg;
80
81 thread = CreateThread(DE_NULL, 0, startThread, entry, 0, DE_NULL);
82 if (!thread)
83 {
84 deFree(entry);
85 return 0;
86 }
87
88 if (attributes)
89 SetThreadPriority(thread, mapPriority(attributes->priority));
90
91 return (deThread)thread;
92 }
93
deThread_join(deThread thread)94 deBool deThread_join (deThread thread)
95 {
96 HANDLE handle = (HANDLE)thread;
97 WaitForSingleObject(handle, INFINITE);
98
99 return DE_TRUE;
100 }
101
deThread_destroy(deThread thread)102 void deThread_destroy (deThread thread)
103 {
104 HANDLE handle = (HANDLE)thread;
105 CloseHandle(handle);
106 }
107
deSleep(deUint32 milliseconds)108 void deSleep (deUint32 milliseconds)
109 {
110 Sleep((DWORD)milliseconds);
111 }
112
deYield(void)113 void deYield (void)
114 {
115 SwitchToThread();
116 }
117
118 #endif /* DE_OS */
119