• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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