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.
- data/README +1 -0
- data/README.API +73 -0
- data/Rakefile +120 -0
- data/examples/boing.rb +519 -0
- data/examples/gears.rb +327 -0
- data/examples/keytest.rb +117 -0
- data/examples/listmodes.rb +20 -0
- data/examples/mipmaps.rb +104 -0
- data/examples/mipmaps.tga +0 -0
- data/examples/particles.rb +837 -0
- data/examples/pong3d.rb +741 -0
- data/examples/pong3d_field.tga +0 -0
- data/examples/pong3d_instr.tga +0 -0
- data/examples/pong3d_menu.tga +0 -0
- data/examples/pong3d_title.tga +0 -0
- data/examples/pong3d_winner1.tga +0 -0
- data/examples/pong3d_winner2.tga +0 -0
- data/examples/splitview.rb +432 -0
- data/examples/triangle.rb +89 -0
- data/examples/wave.rb +294 -0
- data/ext/glfw/glfw.c +1094 -0
- data/ext/glfw/mkrf_conf.rb +70 -0
- data/glfw-src/Makefile +220 -0
- data/glfw-src/compile.ami +61 -0
- data/glfw-src/compile.bat +217 -0
- data/glfw-src/compile.sh +607 -0
- data/glfw-src/docs/Makefile +57 -0
- data/glfw-src/docs/Reference.pdf +0 -0
- data/glfw-src/docs/UsersGuide.pdf +0 -0
- data/glfw-src/docs/cleanup.bat +22 -0
- data/glfw-src/docs/glfwdoc.sty +80 -0
- data/glfw-src/docs/glfwrm.tex +3034 -0
- data/glfw-src/docs/glfwug.tex +2024 -0
- data/glfw-src/docs/readme.txt +80 -0
- data/glfw-src/examples/Makefile.amigaos.gcc +70 -0
- data/glfw-src/examples/Makefile.amigaos.vbcc +70 -0
- data/glfw-src/examples/Makefile.dos.djgpp +71 -0
- data/glfw-src/examples/Makefile.macosx.gcc +96 -0
- data/glfw-src/examples/Makefile.win32.bcc +75 -0
- data/glfw-src/examples/Makefile.win32.cross-mgw +79 -0
- data/glfw-src/examples/Makefile.win32.cygwin +79 -0
- data/glfw-src/examples/Makefile.win32.lcc +74 -0
- data/glfw-src/examples/Makefile.win32.mgw +75 -0
- data/glfw-src/examples/Makefile.win32.msvc +74 -0
- data/glfw-src/examples/Makefile.win32.ow +74 -0
- data/glfw-src/examples/Makefile.win32.pellesc +74 -0
- data/glfw-src/examples/Makefile.x11.in +54 -0
- data/glfw-src/examples/boing.c +606 -0
- data/glfw-src/examples/bundle.sh +46 -0
- data/glfw-src/examples/gears.c +382 -0
- data/glfw-src/examples/keytest.c +264 -0
- data/glfw-src/examples/listmodes.c +48 -0
- data/glfw-src/examples/mipmaps.c +126 -0
- data/glfw-src/examples/mipmaps.tga +0 -0
- data/glfw-src/examples/mtbench.c +301 -0
- data/glfw-src/examples/mthello.c +48 -0
- data/glfw-src/examples/particles.c +1148 -0
- data/glfw-src/examples/pong3d.c +839 -0
- data/glfw-src/examples/pong3d_field.tga +0 -0
- data/glfw-src/examples/pong3d_instr.tga +0 -0
- data/glfw-src/examples/pong3d_menu.tga +0 -0
- data/glfw-src/examples/pong3d_title.tga +0 -0
- data/glfw-src/examples/pong3d_winner1.tga +0 -0
- data/glfw-src/examples/pong3d_winner2.tga +0 -0
- data/glfw-src/examples/splitview.c +506 -0
- data/glfw-src/examples/triangle.c +108 -0
- data/glfw-src/examples/wave.c +397 -0
- data/glfw-src/images/opengl.gif +0 -0
- data/glfw-src/images/osicert.gif +0 -0
- data/glfw-src/include/GL/glfw.h +486 -0
- data/glfw-src/lib/amigaos/Makefile.amigaos.gcc +128 -0
- data/glfw-src/lib/amigaos/Makefile.amigaos.vbcc +128 -0
- data/glfw-src/lib/amigaos/SDI_compiler.h +94 -0
- data/glfw-src/lib/amigaos/amigaos_enable.c +51 -0
- data/glfw-src/lib/amigaos/amigaos_fullscreen.c +319 -0
- data/glfw-src/lib/amigaos/amigaos_glext.c +61 -0
- data/glfw-src/lib/amigaos/amigaos_init.c +284 -0
- data/glfw-src/lib/amigaos/amigaos_joystick.c +359 -0
- data/glfw-src/lib/amigaos/amigaos_thread.c +494 -0
- data/glfw-src/lib/amigaos/amigaos_time.c +206 -0
- data/glfw-src/lib/amigaos/amigaos_window.c +830 -0
- data/glfw-src/lib/amigaos/platform.h +337 -0
- data/glfw-src/lib/dos/Makefile.dos.djgpp +146 -0
- data/glfw-src/lib/dos/dos_enable.c +51 -0
- data/glfw-src/lib/dos/dos_events.c +173 -0
- data/glfw-src/lib/dos/dos_fullscreen.c +101 -0
- data/glfw-src/lib/dos/dos_glext.c +59 -0
- data/glfw-src/lib/dos/dos_init.c +105 -0
- data/glfw-src/lib/dos/dos_irq.s +246 -0
- data/glfw-src/lib/dos/dos_joystick.c +94 -0
- data/glfw-src/lib/dos/dos_keyboard.c +694 -0
- data/glfw-src/lib/dos/dos_mouse.c +337 -0
- data/glfw-src/lib/dos/dos_thread.c +267 -0
- data/glfw-src/lib/dos/dos_time.c +309 -0
- data/glfw-src/lib/dos/dos_window.c +563 -0
- data/glfw-src/lib/dos/platform.h +341 -0
- data/glfw-src/lib/enable.c +295 -0
- data/glfw-src/lib/fullscreen.c +95 -0
- data/glfw-src/lib/glext.c +201 -0
- data/glfw-src/lib/image.c +629 -0
- data/glfw-src/lib/init.c +108 -0
- data/glfw-src/lib/input.c +280 -0
- data/glfw-src/lib/internal.h +210 -0
- data/glfw-src/lib/joystick.c +101 -0
- data/glfw-src/lib/macosx/Makefile.macosx.gcc +172 -0
- data/glfw-src/lib/macosx/Makefile.macosx.gcc.universal +166 -0
- data/glfw-src/lib/macosx/libglfw.pc.in +11 -0
- data/glfw-src/lib/macosx/macosx_enable.c +42 -0
- data/glfw-src/lib/macosx/macosx_fullscreen.c +126 -0
- data/glfw-src/lib/macosx/macosx_glext.c +52 -0
- data/glfw-src/lib/macosx/macosx_init.c +194 -0
- data/glfw-src/lib/macosx/macosx_joystick.c +50 -0
- data/glfw-src/lib/macosx/macosx_thread.c +414 -0
- data/glfw-src/lib/macosx/macosx_time.c +112 -0
- data/glfw-src/lib/macosx/macosx_window.c +1279 -0
- data/glfw-src/lib/macosx/platform.h +349 -0
- data/glfw-src/lib/stream.c +194 -0
- data/glfw-src/lib/tga.c +405 -0
- data/glfw-src/lib/thread.c +340 -0
- data/glfw-src/lib/time.c +83 -0
- data/glfw-src/lib/win32/Makefile.win32.bcc +265 -0
- data/glfw-src/lib/win32/Makefile.win32.cross-mgw +274 -0
- data/glfw-src/lib/win32/Makefile.win32.cygwin +279 -0
- data/glfw-src/lib/win32/Makefile.win32.lcc +246 -0
- data/glfw-src/lib/win32/Makefile.win32.mgw +243 -0
- data/glfw-src/lib/win32/Makefile.win32.msvc +242 -0
- data/glfw-src/lib/win32/Makefile.win32.ow +242 -0
- data/glfw-src/lib/win32/Makefile.win32.pellesc +242 -0
- data/glfw-src/lib/win32/glfwdll.def +67 -0
- data/glfw-src/lib/win32/glfwdll_mgw1.def +67 -0
- data/glfw-src/lib/win32/glfwdll_mgw2.def +67 -0
- data/glfw-src/lib/win32/glfwdll_pellesc.def +65 -0
- data/glfw-src/lib/win32/libglfw.pc.in +11 -0
- data/glfw-src/lib/win32/platform.h +474 -0
- data/glfw-src/lib/win32/win32_dllmain.c +60 -0
- data/glfw-src/lib/win32/win32_enable.c +155 -0
- data/glfw-src/lib/win32/win32_fullscreen.c +317 -0
- data/glfw-src/lib/win32/win32_glext.c +85 -0
- data/glfw-src/lib/win32/win32_init.c +356 -0
- data/glfw-src/lib/win32/win32_joystick.c +234 -0
- data/glfw-src/lib/win32/win32_thread.c +511 -0
- data/glfw-src/lib/win32/win32_time.c +146 -0
- data/glfw-src/lib/win32/win32_window.c +1714 -0
- data/glfw-src/lib/window.c +727 -0
- data/glfw-src/lib/x11/Makefile.x11.in +243 -0
- data/glfw-src/lib/x11/platform.h +415 -0
- data/glfw-src/lib/x11/x11_enable.c +51 -0
- data/glfw-src/lib/x11/x11_fullscreen.c +524 -0
- data/glfw-src/lib/x11/x11_glext.c +69 -0
- data/glfw-src/lib/x11/x11_init.c +275 -0
- data/glfw-src/lib/x11/x11_joystick.c +371 -0
- data/glfw-src/lib/x11/x11_keysym2unicode.c +902 -0
- data/glfw-src/lib/x11/x11_thread.c +507 -0
- data/glfw-src/lib/x11/x11_time.c +154 -0
- data/glfw-src/lib/x11/x11_window.c +1746 -0
- data/glfw-src/license.txt +21 -0
- data/glfw-src/readme.html +927 -0
- data/glfw-src/support/d/examples/Makefile +59 -0
- data/glfw-src/support/d/examples/boing.d +610 -0
- data/glfw-src/support/d/examples/gears.d +379 -0
- data/glfw-src/support/d/examples/keytest.d +272 -0
- data/glfw-src/support/d/examples/listmodes.d +48 -0
- data/glfw-src/support/d/examples/mipmaps.d +126 -0
- data/glfw-src/support/d/examples/mtbench.d +304 -0
- data/glfw-src/support/d/examples/mthello.d +54 -0
- data/glfw-src/support/d/examples/particles.d +1150 -0
- data/glfw-src/support/d/examples/pong3d.d +840 -0
- data/glfw-src/support/d/examples/splitview.d +486 -0
- data/glfw-src/support/d/examples/triangle.d +108 -0
- data/glfw-src/support/d/examples/wave.d +400 -0
- data/glfw-src/support/d/imports/gl.d +4539 -0
- data/glfw-src/support/d/imports/glfw.d +349 -0
- data/glfw-src/support/d/imports/glu.d +328 -0
- data/glfw-src/support/d/lib/glfwdll.def +64 -0
- data/glfw-src/support/d/lib/glu32.def +56 -0
- data/glfw-src/support/d/lib/makefile +12 -0
- data/glfw-src/support/d/lib/opengl32.def +372 -0
- data/glfw-src/support/d/readme.html +83 -0
- data/glfw-src/support/delphi/examples/Triangle.dpr +105 -0
- data/glfw-src/support/delphi/lib/glfw.pas +437 -0
- data/glfw-src/support/delphi/readme.html +97 -0
- data/glfw-src/support/lua/examples/gears.lua +383 -0
- data/glfw-src/support/lua/examples/test1.lua +68 -0
- data/glfw-src/support/lua/readme.html +128 -0
- data/glfw-src/support/lua/src/luaglfw.c +1179 -0
- data/glfw-src/support/lua/src/luaglfw.h +48 -0
- data/glfw-src/support/lua/src/runlua.c +82 -0
- data/glfw-src/support/masm/examples/fpc.mac +47 -0
- data/glfw-src/support/masm/examples/makeit.bat +66 -0
- data/glfw-src/support/masm/examples/triangle.asm +232 -0
- data/glfw-src/support/masm/include/glfw.inc +326 -0
- data/glfw-src/support/masm/include/glu32.inc +55 -0
- data/glfw-src/support/masm/include/opengl32.inc +372 -0
- data/glfw-src/support/masm/lib/glfwdll.lib +0 -0
- data/glfw-src/support/masm/readme.html +170 -0
- data/glfw-src/support/msvc80/GLFW.sln +26 -0
- data/glfw-src/support/msvc80/GLFW.vcproj +257 -0
- data/glfw-src/support/msvc80/GLFWDLL.vcproj +287 -0
- data/glfw-src/support/visualbasic/bindings/glfw.bas +320 -0
- data/glfw-src/support/visualbasic/bindings/glu32.bas +284 -0
- data/glfw-src/support/visualbasic/bindings/opengl32.bas +999 -0
- data/glfw-src/support/visualbasic/examples/Triangle.bas +101 -0
- data/glfw-src/support/visualbasic/readme.html +164 -0
- data/website/index.html +84 -0
- data/website/style.css +110 -0
- 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
|
+
}
|