ruby-glfw 0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. data/README +1 -0
  2. data/README.API +73 -0
  3. data/Rakefile +120 -0
  4. data/examples/boing.rb +519 -0
  5. data/examples/gears.rb +327 -0
  6. data/examples/keytest.rb +117 -0
  7. data/examples/listmodes.rb +20 -0
  8. data/examples/mipmaps.rb +104 -0
  9. data/examples/mipmaps.tga +0 -0
  10. data/examples/particles.rb +837 -0
  11. data/examples/pong3d.rb +741 -0
  12. data/examples/pong3d_field.tga +0 -0
  13. data/examples/pong3d_instr.tga +0 -0
  14. data/examples/pong3d_menu.tga +0 -0
  15. data/examples/pong3d_title.tga +0 -0
  16. data/examples/pong3d_winner1.tga +0 -0
  17. data/examples/pong3d_winner2.tga +0 -0
  18. data/examples/splitview.rb +432 -0
  19. data/examples/triangle.rb +89 -0
  20. data/examples/wave.rb +294 -0
  21. data/ext/glfw/glfw.c +1094 -0
  22. data/ext/glfw/mkrf_conf.rb +70 -0
  23. data/glfw-src/Makefile +220 -0
  24. data/glfw-src/compile.ami +61 -0
  25. data/glfw-src/compile.bat +217 -0
  26. data/glfw-src/compile.sh +607 -0
  27. data/glfw-src/docs/Makefile +57 -0
  28. data/glfw-src/docs/Reference.pdf +0 -0
  29. data/glfw-src/docs/UsersGuide.pdf +0 -0
  30. data/glfw-src/docs/cleanup.bat +22 -0
  31. data/glfw-src/docs/glfwdoc.sty +80 -0
  32. data/glfw-src/docs/glfwrm.tex +3034 -0
  33. data/glfw-src/docs/glfwug.tex +2024 -0
  34. data/glfw-src/docs/readme.txt +80 -0
  35. data/glfw-src/examples/Makefile.amigaos.gcc +70 -0
  36. data/glfw-src/examples/Makefile.amigaos.vbcc +70 -0
  37. data/glfw-src/examples/Makefile.dos.djgpp +71 -0
  38. data/glfw-src/examples/Makefile.macosx.gcc +96 -0
  39. data/glfw-src/examples/Makefile.win32.bcc +75 -0
  40. data/glfw-src/examples/Makefile.win32.cross-mgw +79 -0
  41. data/glfw-src/examples/Makefile.win32.cygwin +79 -0
  42. data/glfw-src/examples/Makefile.win32.lcc +74 -0
  43. data/glfw-src/examples/Makefile.win32.mgw +75 -0
  44. data/glfw-src/examples/Makefile.win32.msvc +74 -0
  45. data/glfw-src/examples/Makefile.win32.ow +74 -0
  46. data/glfw-src/examples/Makefile.win32.pellesc +74 -0
  47. data/glfw-src/examples/Makefile.x11.in +54 -0
  48. data/glfw-src/examples/boing.c +606 -0
  49. data/glfw-src/examples/bundle.sh +46 -0
  50. data/glfw-src/examples/gears.c +382 -0
  51. data/glfw-src/examples/keytest.c +264 -0
  52. data/glfw-src/examples/listmodes.c +48 -0
  53. data/glfw-src/examples/mipmaps.c +126 -0
  54. data/glfw-src/examples/mipmaps.tga +0 -0
  55. data/glfw-src/examples/mtbench.c +301 -0
  56. data/glfw-src/examples/mthello.c +48 -0
  57. data/glfw-src/examples/particles.c +1148 -0
  58. data/glfw-src/examples/pong3d.c +839 -0
  59. data/glfw-src/examples/pong3d_field.tga +0 -0
  60. data/glfw-src/examples/pong3d_instr.tga +0 -0
  61. data/glfw-src/examples/pong3d_menu.tga +0 -0
  62. data/glfw-src/examples/pong3d_title.tga +0 -0
  63. data/glfw-src/examples/pong3d_winner1.tga +0 -0
  64. data/glfw-src/examples/pong3d_winner2.tga +0 -0
  65. data/glfw-src/examples/splitview.c +506 -0
  66. data/glfw-src/examples/triangle.c +108 -0
  67. data/glfw-src/examples/wave.c +397 -0
  68. data/glfw-src/images/opengl.gif +0 -0
  69. data/glfw-src/images/osicert.gif +0 -0
  70. data/glfw-src/include/GL/glfw.h +486 -0
  71. data/glfw-src/lib/amigaos/Makefile.amigaos.gcc +128 -0
  72. data/glfw-src/lib/amigaos/Makefile.amigaos.vbcc +128 -0
  73. data/glfw-src/lib/amigaos/SDI_compiler.h +94 -0
  74. data/glfw-src/lib/amigaos/amigaos_enable.c +51 -0
  75. data/glfw-src/lib/amigaos/amigaos_fullscreen.c +319 -0
  76. data/glfw-src/lib/amigaos/amigaos_glext.c +61 -0
  77. data/glfw-src/lib/amigaos/amigaos_init.c +284 -0
  78. data/glfw-src/lib/amigaos/amigaos_joystick.c +359 -0
  79. data/glfw-src/lib/amigaos/amigaos_thread.c +494 -0
  80. data/glfw-src/lib/amigaos/amigaos_time.c +206 -0
  81. data/glfw-src/lib/amigaos/amigaos_window.c +830 -0
  82. data/glfw-src/lib/amigaos/platform.h +337 -0
  83. data/glfw-src/lib/dos/Makefile.dos.djgpp +146 -0
  84. data/glfw-src/lib/dos/dos_enable.c +51 -0
  85. data/glfw-src/lib/dos/dos_events.c +173 -0
  86. data/glfw-src/lib/dos/dos_fullscreen.c +101 -0
  87. data/glfw-src/lib/dos/dos_glext.c +59 -0
  88. data/glfw-src/lib/dos/dos_init.c +105 -0
  89. data/glfw-src/lib/dos/dos_irq.s +246 -0
  90. data/glfw-src/lib/dos/dos_joystick.c +94 -0
  91. data/glfw-src/lib/dos/dos_keyboard.c +694 -0
  92. data/glfw-src/lib/dos/dos_mouse.c +337 -0
  93. data/glfw-src/lib/dos/dos_thread.c +267 -0
  94. data/glfw-src/lib/dos/dos_time.c +309 -0
  95. data/glfw-src/lib/dos/dos_window.c +563 -0
  96. data/glfw-src/lib/dos/platform.h +341 -0
  97. data/glfw-src/lib/enable.c +295 -0
  98. data/glfw-src/lib/fullscreen.c +95 -0
  99. data/glfw-src/lib/glext.c +201 -0
  100. data/glfw-src/lib/image.c +629 -0
  101. data/glfw-src/lib/init.c +108 -0
  102. data/glfw-src/lib/input.c +280 -0
  103. data/glfw-src/lib/internal.h +210 -0
  104. data/glfw-src/lib/joystick.c +101 -0
  105. data/glfw-src/lib/macosx/Makefile.macosx.gcc +172 -0
  106. data/glfw-src/lib/macosx/Makefile.macosx.gcc.universal +166 -0
  107. data/glfw-src/lib/macosx/libglfw.pc.in +11 -0
  108. data/glfw-src/lib/macosx/macosx_enable.c +42 -0
  109. data/glfw-src/lib/macosx/macosx_fullscreen.c +126 -0
  110. data/glfw-src/lib/macosx/macosx_glext.c +52 -0
  111. data/glfw-src/lib/macosx/macosx_init.c +194 -0
  112. data/glfw-src/lib/macosx/macosx_joystick.c +50 -0
  113. data/glfw-src/lib/macosx/macosx_thread.c +414 -0
  114. data/glfw-src/lib/macosx/macosx_time.c +112 -0
  115. data/glfw-src/lib/macosx/macosx_window.c +1279 -0
  116. data/glfw-src/lib/macosx/platform.h +349 -0
  117. data/glfw-src/lib/stream.c +194 -0
  118. data/glfw-src/lib/tga.c +405 -0
  119. data/glfw-src/lib/thread.c +340 -0
  120. data/glfw-src/lib/time.c +83 -0
  121. data/glfw-src/lib/win32/Makefile.win32.bcc +265 -0
  122. data/glfw-src/lib/win32/Makefile.win32.cross-mgw +274 -0
  123. data/glfw-src/lib/win32/Makefile.win32.cygwin +279 -0
  124. data/glfw-src/lib/win32/Makefile.win32.lcc +246 -0
  125. data/glfw-src/lib/win32/Makefile.win32.mgw +243 -0
  126. data/glfw-src/lib/win32/Makefile.win32.msvc +242 -0
  127. data/glfw-src/lib/win32/Makefile.win32.ow +242 -0
  128. data/glfw-src/lib/win32/Makefile.win32.pellesc +242 -0
  129. data/glfw-src/lib/win32/glfwdll.def +67 -0
  130. data/glfw-src/lib/win32/glfwdll_mgw1.def +67 -0
  131. data/glfw-src/lib/win32/glfwdll_mgw2.def +67 -0
  132. data/glfw-src/lib/win32/glfwdll_pellesc.def +65 -0
  133. data/glfw-src/lib/win32/libglfw.pc.in +11 -0
  134. data/glfw-src/lib/win32/platform.h +474 -0
  135. data/glfw-src/lib/win32/win32_dllmain.c +60 -0
  136. data/glfw-src/lib/win32/win32_enable.c +155 -0
  137. data/glfw-src/lib/win32/win32_fullscreen.c +317 -0
  138. data/glfw-src/lib/win32/win32_glext.c +85 -0
  139. data/glfw-src/lib/win32/win32_init.c +356 -0
  140. data/glfw-src/lib/win32/win32_joystick.c +234 -0
  141. data/glfw-src/lib/win32/win32_thread.c +511 -0
  142. data/glfw-src/lib/win32/win32_time.c +146 -0
  143. data/glfw-src/lib/win32/win32_window.c +1714 -0
  144. data/glfw-src/lib/window.c +727 -0
  145. data/glfw-src/lib/x11/Makefile.x11.in +243 -0
  146. data/glfw-src/lib/x11/platform.h +415 -0
  147. data/glfw-src/lib/x11/x11_enable.c +51 -0
  148. data/glfw-src/lib/x11/x11_fullscreen.c +524 -0
  149. data/glfw-src/lib/x11/x11_glext.c +69 -0
  150. data/glfw-src/lib/x11/x11_init.c +275 -0
  151. data/glfw-src/lib/x11/x11_joystick.c +371 -0
  152. data/glfw-src/lib/x11/x11_keysym2unicode.c +902 -0
  153. data/glfw-src/lib/x11/x11_thread.c +507 -0
  154. data/glfw-src/lib/x11/x11_time.c +154 -0
  155. data/glfw-src/lib/x11/x11_window.c +1746 -0
  156. data/glfw-src/license.txt +21 -0
  157. data/glfw-src/readme.html +927 -0
  158. data/glfw-src/support/d/examples/Makefile +59 -0
  159. data/glfw-src/support/d/examples/boing.d +610 -0
  160. data/glfw-src/support/d/examples/gears.d +379 -0
  161. data/glfw-src/support/d/examples/keytest.d +272 -0
  162. data/glfw-src/support/d/examples/listmodes.d +48 -0
  163. data/glfw-src/support/d/examples/mipmaps.d +126 -0
  164. data/glfw-src/support/d/examples/mtbench.d +304 -0
  165. data/glfw-src/support/d/examples/mthello.d +54 -0
  166. data/glfw-src/support/d/examples/particles.d +1150 -0
  167. data/glfw-src/support/d/examples/pong3d.d +840 -0
  168. data/glfw-src/support/d/examples/splitview.d +486 -0
  169. data/glfw-src/support/d/examples/triangle.d +108 -0
  170. data/glfw-src/support/d/examples/wave.d +400 -0
  171. data/glfw-src/support/d/imports/gl.d +4539 -0
  172. data/glfw-src/support/d/imports/glfw.d +349 -0
  173. data/glfw-src/support/d/imports/glu.d +328 -0
  174. data/glfw-src/support/d/lib/glfwdll.def +64 -0
  175. data/glfw-src/support/d/lib/glu32.def +56 -0
  176. data/glfw-src/support/d/lib/makefile +12 -0
  177. data/glfw-src/support/d/lib/opengl32.def +372 -0
  178. data/glfw-src/support/d/readme.html +83 -0
  179. data/glfw-src/support/delphi/examples/Triangle.dpr +105 -0
  180. data/glfw-src/support/delphi/lib/glfw.pas +437 -0
  181. data/glfw-src/support/delphi/readme.html +97 -0
  182. data/glfw-src/support/lua/examples/gears.lua +383 -0
  183. data/glfw-src/support/lua/examples/test1.lua +68 -0
  184. data/glfw-src/support/lua/readme.html +128 -0
  185. data/glfw-src/support/lua/src/luaglfw.c +1179 -0
  186. data/glfw-src/support/lua/src/luaglfw.h +48 -0
  187. data/glfw-src/support/lua/src/runlua.c +82 -0
  188. data/glfw-src/support/masm/examples/fpc.mac +47 -0
  189. data/glfw-src/support/masm/examples/makeit.bat +66 -0
  190. data/glfw-src/support/masm/examples/triangle.asm +232 -0
  191. data/glfw-src/support/masm/include/glfw.inc +326 -0
  192. data/glfw-src/support/masm/include/glu32.inc +55 -0
  193. data/glfw-src/support/masm/include/opengl32.inc +372 -0
  194. data/glfw-src/support/masm/lib/glfwdll.lib +0 -0
  195. data/glfw-src/support/masm/readme.html +170 -0
  196. data/glfw-src/support/msvc80/GLFW.sln +26 -0
  197. data/glfw-src/support/msvc80/GLFW.vcproj +257 -0
  198. data/glfw-src/support/msvc80/GLFWDLL.vcproj +287 -0
  199. data/glfw-src/support/visualbasic/bindings/glfw.bas +320 -0
  200. data/glfw-src/support/visualbasic/bindings/glu32.bas +284 -0
  201. data/glfw-src/support/visualbasic/bindings/opengl32.bas +999 -0
  202. data/glfw-src/support/visualbasic/examples/Triangle.bas +101 -0
  203. data/glfw-src/support/visualbasic/readme.html +164 -0
  204. data/website/index.html +84 -0
  205. data/website/style.css +110 -0
  206. metadata +301 -0
@@ -0,0 +1,511 @@
1
+ //========================================================================
2
+ // GLFW - An OpenGL framework
3
+ // File: win32_thread.c
4
+ // Platform: Windows
5
+ // API version: 2.6
6
+ // WWW: http://glfw.sourceforge.net
7
+ //------------------------------------------------------------------------
8
+ // Copyright (c) 2002-2006 Camilla Berglund
9
+ //
10
+ // This software is provided 'as-is', without any express or implied
11
+ // warranty. In no event will the authors be held liable for any damages
12
+ // arising from the use of this software.
13
+ //
14
+ // Permission is granted to anyone to use this software for any purpose,
15
+ // including commercial applications, and to alter it and redistribute it
16
+ // freely, subject to the following restrictions:
17
+ //
18
+ // 1. The origin of this software must not be misrepresented; you must not
19
+ // claim that you wrote the original software. If you use this software
20
+ // in a product, an acknowledgment in the product documentation would
21
+ // be appreciated but is not required.
22
+ //
23
+ // 2. Altered source versions must be plainly marked as such, and must not
24
+ // be misrepresented as being the original software.
25
+ //
26
+ // 3. This notice may not be removed or altered from any source
27
+ // distribution.
28
+ //
29
+ //========================================================================
30
+
31
+ #include "internal.h"
32
+
33
+
34
+ //************************************************************************
35
+ // This is an implementation of POSIX "compatible" condition variables for
36
+ // Win32, as described by Douglas C. Schmidt and Irfan Pyarali:
37
+ // http://www.cs.wustl.edu/~schmidt/win32-cv-1.html
38
+ //************************************************************************
39
+
40
+ enum {
41
+ _GLFW_COND_SIGNAL = 0,
42
+ _GLFW_COND_BROADCAST = 1
43
+ };
44
+
45
+ typedef struct {
46
+ // Signal and broadcast event HANDLEs
47
+ HANDLE events[ 2 ];
48
+
49
+ // Count of the number of waiters
50
+ unsigned int waiters_count;
51
+
52
+ // Serialize access to <waiters_count>
53
+ CRITICAL_SECTION waiters_count_lock;
54
+ } _GLFWcond;
55
+
56
+
57
+
58
+ //************************************************************************
59
+ //**** GLFW internal functions ****
60
+ //************************************************************************
61
+
62
+ //========================================================================
63
+ // _glfwNewThread() - This is simply a "wrapper" for calling the user
64
+ // thread function.
65
+ //========================================================================
66
+
67
+ DWORD WINAPI _glfwNewThread( LPVOID lpParam )
68
+ {
69
+ GLFWthreadfun threadfun;
70
+ _GLFWthread *t;
71
+
72
+ // Get pointer to thread information for current thread
73
+ t = _glfwGetThreadPointer( _glfwPlatformGetThreadID() );
74
+ if( t == NULL )
75
+ {
76
+ return 0;
77
+ }
78
+
79
+ // Get user thread function pointer
80
+ threadfun = t->Function;
81
+
82
+ // Call the user thread function
83
+ threadfun( (void *) lpParam );
84
+
85
+ // Remove thread from thread list
86
+ ENTER_THREAD_CRITICAL_SECTION
87
+ _glfwRemoveThread( t );
88
+ LEAVE_THREAD_CRITICAL_SECTION
89
+
90
+ // When the thread function returns, the thread will die...
91
+ return 0;
92
+ }
93
+
94
+
95
+
96
+ //************************************************************************
97
+ //**** GLFW user functions ****
98
+ //************************************************************************
99
+
100
+ //========================================================================
101
+ // _glfwPlatformCreateThread() - Create a new thread
102
+ //========================================================================
103
+
104
+ GLFWthread _glfwPlatformCreateThread( GLFWthreadfun fun, void *arg )
105
+ {
106
+ GLFWthread ID;
107
+ _GLFWthread *t, *t_tmp;
108
+ HANDLE hThread;
109
+ DWORD dwThreadId;
110
+
111
+ // Enter critical section
112
+ ENTER_THREAD_CRITICAL_SECTION
113
+
114
+ // Create a new thread information memory area
115
+ t = (_GLFWthread *) malloc( sizeof(_GLFWthread) );
116
+ if( t == NULL )
117
+ {
118
+ // Leave critical section
119
+ LEAVE_THREAD_CRITICAL_SECTION
120
+ return -1;
121
+ }
122
+
123
+ // Get a new unique thread id
124
+ ID = _glfwThrd.NextID ++;
125
+
126
+ // Store thread information in the thread list
127
+ t->Function = fun;
128
+ t->ID = ID;
129
+
130
+ // Create thread
131
+ hThread = CreateThread(
132
+ NULL, // Default security attributes
133
+ 0, // Default stack size (1 MB)
134
+ _glfwNewThread, // Thread function (a wrapper function)
135
+ (LPVOID)arg, // Argument to thread is the user argument
136
+ 0, // Default creation flags
137
+ &dwThreadId // Returned thread identifier
138
+ );
139
+
140
+ // Did the thread creation fail?
141
+ if( hThread == NULL )
142
+ {
143
+ free( (void *) t );
144
+ LEAVE_THREAD_CRITICAL_SECTION
145
+ return -1;
146
+ }
147
+
148
+ // Store more thread information in the thread list
149
+ t->Handle = hThread;
150
+ t->WinID = dwThreadId;
151
+
152
+ // Append thread to thread list
153
+ t_tmp = &_glfwThrd.First;
154
+ while( t_tmp->Next != NULL )
155
+ {
156
+ t_tmp = t_tmp->Next;
157
+ }
158
+ t_tmp->Next = t;
159
+ t->Previous = t_tmp;
160
+ t->Next = NULL;
161
+
162
+ // Leave critical section
163
+ LEAVE_THREAD_CRITICAL_SECTION
164
+
165
+ // Return the GLFW thread ID
166
+ return ID;
167
+ }
168
+
169
+
170
+ //========================================================================
171
+ // _glfwPlatformDestroyThread() - Kill a thread. NOTE: THIS IS A VERY
172
+ // DANGEROUS OPERATION, AND SHOULD NOT BE USED EXCEPT IN EXTREME
173
+ // SITUATIONS!
174
+ //========================================================================
175
+
176
+ void _glfwPlatformDestroyThread( GLFWthread ID )
177
+ {
178
+ _GLFWthread *t;
179
+
180
+ // Enter critical section
181
+ ENTER_THREAD_CRITICAL_SECTION
182
+
183
+ // Get thread information pointer
184
+ t = _glfwGetThreadPointer( ID );
185
+ if( t == NULL )
186
+ {
187
+ LEAVE_THREAD_CRITICAL_SECTION
188
+ return;
189
+ }
190
+
191
+ // Simply murder the process, no mercy!
192
+ if( TerminateThread( t->Handle, 0 ) )
193
+ {
194
+ // Close thread handle
195
+ CloseHandle( t->Handle );
196
+
197
+ // Remove thread from thread list
198
+ _glfwRemoveThread( t );
199
+ }
200
+
201
+ // Leave critical section
202
+ LEAVE_THREAD_CRITICAL_SECTION
203
+ }
204
+
205
+
206
+ //========================================================================
207
+ // _glfwPlatformWaitThread() - Wait for a thread to die
208
+ //========================================================================
209
+
210
+ int _glfwPlatformWaitThread( GLFWthread ID, int waitmode )
211
+ {
212
+ DWORD result;
213
+ HANDLE hThread;
214
+ _GLFWthread *t;
215
+
216
+ // Enter critical section
217
+ ENTER_THREAD_CRITICAL_SECTION
218
+
219
+ // Get thread information pointer
220
+ t = _glfwGetThreadPointer( ID );
221
+
222
+ // Is the thread already dead?
223
+ if( t == NULL )
224
+ {
225
+ LEAVE_THREAD_CRITICAL_SECTION
226
+ return GL_TRUE;
227
+ }
228
+
229
+ // Get thread handle
230
+ hThread = t->Handle;
231
+
232
+ // Leave critical section
233
+ LEAVE_THREAD_CRITICAL_SECTION
234
+
235
+ // Wait for thread to die
236
+ if( waitmode == GLFW_WAIT )
237
+ {
238
+ result = WaitForSingleObject( hThread, INFINITE );
239
+ }
240
+ else if( waitmode == GLFW_NOWAIT )
241
+ {
242
+ result = WaitForSingleObject( hThread, 0 );
243
+ }
244
+ else
245
+ {
246
+ return GL_FALSE;
247
+ }
248
+
249
+ // Did we have a time-out?
250
+ if( result == WAIT_TIMEOUT )
251
+ {
252
+ return GL_FALSE;
253
+ }
254
+ return GL_TRUE;
255
+ }
256
+
257
+
258
+ //========================================================================
259
+ // _glfwPlatformGetThreadID() - Return the thread ID for the current
260
+ // thread
261
+ //========================================================================
262
+
263
+ GLFWthread _glfwPlatformGetThreadID( void )
264
+ {
265
+ _GLFWthread *t;
266
+ GLFWthread ID = -1;
267
+ DWORD WinID;
268
+
269
+ // Get Windows thread ID
270
+ WinID = GetCurrentThreadId();
271
+
272
+ // Enter critical section (to avoid an inconsistent thread list)
273
+ ENTER_THREAD_CRITICAL_SECTION
274
+
275
+ // Loop through entire list of threads to find the matching Windows
276
+ // thread ID
277
+ for( t = &_glfwThrd.First; t != NULL; t = t->Next )
278
+ {
279
+ if( t->WinID == WinID )
280
+ {
281
+ ID = t->ID;
282
+ break;
283
+ }
284
+ }
285
+
286
+ // Leave critical section
287
+ LEAVE_THREAD_CRITICAL_SECTION
288
+
289
+ // Return the found GLFW thread identifier
290
+ return ID;
291
+ }
292
+
293
+
294
+ //========================================================================
295
+ // _glfwPlatformCreateMutex() - Create a mutual exclusion object
296
+ //========================================================================
297
+
298
+ GLFWmutex _glfwPlatformCreateMutex( void )
299
+ {
300
+ CRITICAL_SECTION *mutex;
301
+
302
+ // Allocate memory for mutex
303
+ mutex = (CRITICAL_SECTION *) malloc( sizeof(CRITICAL_SECTION) );
304
+ if( !mutex )
305
+ {
306
+ return NULL;
307
+ }
308
+
309
+ // Initialize mutex
310
+ InitializeCriticalSection( mutex );
311
+
312
+ // Cast to GLFWmutex and return
313
+ return (GLFWmutex) mutex;
314
+ }
315
+
316
+
317
+ //========================================================================
318
+ // glfwDestroyMutex() - Destroy a mutual exclusion object
319
+ //========================================================================
320
+
321
+ void _glfwPlatformDestroyMutex( GLFWmutex mutex )
322
+ {
323
+ // Destroy mutex
324
+ DeleteCriticalSection( (CRITICAL_SECTION *) mutex );
325
+ free( mutex );
326
+ }
327
+
328
+
329
+ //========================================================================
330
+ // _glfwPlatformLockMutex() - Request access to a mutex
331
+ //========================================================================
332
+
333
+ void _glfwPlatformLockMutex( GLFWmutex mutex )
334
+ {
335
+ // Wait for mutex to be released
336
+ EnterCriticalSection( (CRITICAL_SECTION *) mutex );
337
+ }
338
+
339
+
340
+ //========================================================================
341
+ // _glfwPlatformUnlockMutex() - Release a mutex
342
+ //========================================================================
343
+
344
+ void _glfwPlatformUnlockMutex( GLFWmutex mutex )
345
+ {
346
+ // Release mutex
347
+ LeaveCriticalSection( (CRITICAL_SECTION *) mutex );
348
+ }
349
+
350
+
351
+ //========================================================================
352
+ // _glfwPlatformCreateCond() - Create a new condition variable object
353
+ //========================================================================
354
+
355
+ GLFWcond _glfwPlatformCreateCond( void )
356
+ {
357
+ _GLFWcond *cond;
358
+
359
+ // Allocate memory for condition variable
360
+ cond = (_GLFWcond *) malloc( sizeof(_GLFWcond) );
361
+ if( !cond )
362
+ {
363
+ return NULL;
364
+ }
365
+
366
+ // Initialize condition variable
367
+ cond->waiters_count = 0;
368
+ cond->events[ _GLFW_COND_SIGNAL ] = CreateEvent( NULL, FALSE,
369
+ FALSE, NULL );
370
+ cond->events[ _GLFW_COND_BROADCAST ] = CreateEvent( NULL, TRUE,
371
+ FALSE, NULL );
372
+ InitializeCriticalSection( &cond->waiters_count_lock );
373
+
374
+ // Cast to GLFWcond and return
375
+ return (GLFWcond) cond;
376
+ }
377
+
378
+
379
+ //========================================================================
380
+ // _glfwPlatformDestroyCond() - Destroy a condition variable object
381
+ //========================================================================
382
+
383
+ void _glfwPlatformDestroyCond( GLFWcond cond )
384
+ {
385
+ // Close the condition variable handles
386
+ CloseHandle( ((_GLFWcond *)cond)->events[ _GLFW_COND_SIGNAL ] );
387
+ CloseHandle( ((_GLFWcond *)cond)->events[ _GLFW_COND_BROADCAST ] );
388
+
389
+ // Delete critical section
390
+ DeleteCriticalSection( &((_GLFWcond *)cond)->waiters_count_lock );
391
+
392
+ // Free memory for condition variable
393
+ free( (void *) cond );
394
+ }
395
+
396
+
397
+ //========================================================================
398
+ // _glfwPlatformWaitCond() - Wait for a condition to be raised
399
+ //========================================================================
400
+
401
+ void _glfwPlatformWaitCond( GLFWcond cond, GLFWmutex mutex,
402
+ double timeout )
403
+ {
404
+ _GLFWcond *cv = (_GLFWcond *) cond;
405
+ int result, last_waiter;
406
+ DWORD timeout_ms;
407
+
408
+ // Avoid race conditions
409
+ EnterCriticalSection( &cv->waiters_count_lock );
410
+ cv->waiters_count ++;
411
+ LeaveCriticalSection( &cv->waiters_count_lock );
412
+
413
+ // It's ok to release the mutex here since Win32 manual-reset events
414
+ // maintain state when used with SetEvent()
415
+ LeaveCriticalSection( (CRITICAL_SECTION *) mutex );
416
+
417
+ // Translate timeout into milliseconds
418
+ if( timeout >= GLFW_INFINITY )
419
+ {
420
+ timeout_ms = INFINITE;
421
+ }
422
+ else
423
+ {
424
+ timeout_ms = (DWORD) (1000.0 * timeout + 0.5);
425
+ if( timeout_ms <= 0 )
426
+ {
427
+ timeout_ms = 1;
428
+ }
429
+ }
430
+
431
+ // Wait for either event to become signaled due to glfwSignalCond or
432
+ // glfwBroadcastCond being called
433
+ result = WaitForMultipleObjects( 2, cv->events, FALSE, timeout_ms );
434
+
435
+ // Check if we are the last waiter
436
+ EnterCriticalSection( &cv->waiters_count_lock );
437
+ cv->waiters_count --;
438
+ last_waiter = (result == WAIT_OBJECT_0 + _GLFW_COND_BROADCAST) &&
439
+ (cv->waiters_count == 0);
440
+ LeaveCriticalSection( &cv->waiters_count_lock );
441
+
442
+ // Some thread called glfwBroadcastCond
443
+ if( last_waiter )
444
+ {
445
+ // We're the last waiter to be notified or to stop waiting, so
446
+ // reset the manual event
447
+ ResetEvent( cv->events[ _GLFW_COND_BROADCAST ] );
448
+ }
449
+
450
+ // Reacquire the mutex
451
+ EnterCriticalSection( (CRITICAL_SECTION *) mutex );
452
+ }
453
+
454
+
455
+ //========================================================================
456
+ // _glfwPlatformSignalCond() - Signal a condition to one waiting thread
457
+ //========================================================================
458
+
459
+ void _glfwPlatformSignalCond( GLFWcond cond )
460
+ {
461
+ _GLFWcond *cv = (_GLFWcond *) cond;
462
+ int have_waiters;
463
+
464
+ // Avoid race conditions
465
+ EnterCriticalSection( &cv->waiters_count_lock );
466
+ have_waiters = cv->waiters_count > 0;
467
+ LeaveCriticalSection( &cv->waiters_count_lock );
468
+
469
+ if( have_waiters )
470
+ {
471
+ SetEvent( cv->events[ _GLFW_COND_SIGNAL ] );
472
+ }
473
+ }
474
+
475
+
476
+ //========================================================================
477
+ // _glfwPlatformBroadcastCond() - Broadcast a condition to all waiting
478
+ // threads
479
+ //========================================================================
480
+
481
+ void _glfwPlatformBroadcastCond( GLFWcond cond )
482
+ {
483
+ _GLFWcond *cv = (_GLFWcond *) cond;
484
+ int have_waiters;
485
+
486
+ // Avoid race conditions
487
+ EnterCriticalSection( &cv->waiters_count_lock );
488
+ have_waiters = cv->waiters_count > 0;
489
+ LeaveCriticalSection( &cv->waiters_count_lock );
490
+
491
+ if( have_waiters )
492
+ {
493
+ SetEvent( cv->events[ _GLFW_COND_BROADCAST ] );
494
+ }
495
+ }
496
+
497
+
498
+ //========================================================================
499
+ // _glfwPlatformGetNumberOfProcessors() - Return the number of processors
500
+ // in the system.
501
+ //========================================================================
502
+
503
+ int _glfwPlatformGetNumberOfProcessors( void )
504
+ {
505
+ SYSTEM_INFO si;
506
+
507
+ // Get hardware system information
508
+ GetSystemInfo( &si );
509
+
510
+ return (int) si.dwNumberOfProcessors;
511
+ }