diff options
Diffstat (limited to 'src/engine/external/glfw/lib/thread.c')
| -rw-r--r-- | src/engine/external/glfw/lib/thread.c | 340 |
1 files changed, 340 insertions, 0 deletions
diff --git a/src/engine/external/glfw/lib/thread.c b/src/engine/external/glfw/lib/thread.c new file mode 100644 index 00000000..8094332c --- /dev/null +++ b/src/engine/external/glfw/lib/thread.c @@ -0,0 +1,340 @@ +//======================================================================== +// GLFW - An OpenGL framework +// File: thread.c +// Platform: Any +// API version: 2.6 +// WWW: http://glfw.sourceforge.net +//------------------------------------------------------------------------ +// Copyright (c) 2002-2006 Camilla Berglund +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== + +#include "internal.h" + + + +//************************************************************************ +//**** GLFW internal functions **** +//************************************************************************ + +//======================================================================== +// _glfwGetThreadPointer() - Find pointer to thread with a matching ID +//======================================================================== + +_GLFWthread * _glfwGetThreadPointer( int ID ) +{ + _GLFWthread *t; + + for( t = &_glfwThrd.First; t != NULL; t = t->Next ) + { + if( t->ID == ID ) + { + break; + } + } + + return t; +} + + +//======================================================================== +// _glfwAppendThread() - Append thread to thread list +//======================================================================== + +void _glfwAppendThread( _GLFWthread * t ) +{ + _GLFWthread *t_tmp; + + t_tmp = &_glfwThrd.First; + while( t_tmp->Next != NULL ) + { + t_tmp = t_tmp->Next; + } + t_tmp->Next = t; + t->Previous = t_tmp; + t->Next = NULL; +} + + +//======================================================================== +// _glfwRemoveThread() - Remove thread from thread list +//======================================================================== + +void _glfwRemoveThread( _GLFWthread * t ) +{ + if( t->Previous != NULL ) + { + t->Previous->Next = t->Next; + } + if( t->Next != NULL ) + { + t->Next->Previous = t->Previous; + } + free( (void *) t ); +} + + + +//************************************************************************ +//**** GLFW user functions **** +//************************************************************************ + +//======================================================================== +// glfwCreateThread() - Create a new thread +//======================================================================== + +GLFWAPI GLFWthread GLFWAPIENTRY glfwCreateThread( GLFWthreadfun fun, + void *arg ) +{ + // Is GLFW initialized? + if( !_glfwInitialized ) + { + return -1; + } + + // Return the GLFW thread ID + return _glfwPlatformCreateThread( fun, arg ); +} + + +//======================================================================== +// glfwDestroyThread() - Kill a thread. NOTE: THIS IS A VERY DANGEROUS +// OPERATION, AND SHOULD NOT BE USED EXCEPT IN EXTREME SITUATIONS! +//======================================================================== + +GLFWAPI void GLFWAPIENTRY glfwDestroyThread( GLFWthread ID ) +{ + // Is GLFW initialized? + if( !_glfwInitialized ) + { + return; + } + + // Is it a valid thread? (killing the main thread is not allowed) + if( ID < 1 ) + { + return; + } + + _glfwPlatformDestroyThread( ID ); +} + + +//======================================================================== +// glfwWaitThread() - Wait for a thread to die +//======================================================================== + +GLFWAPI int GLFWAPIENTRY glfwWaitThread( GLFWthread ID, int waitmode ) +{ + // Is GLFW initialized? + if( !_glfwInitialized ) + { + return GL_TRUE; + } + + // Is it a valid thread? (waiting for the main thread is not allowed) + if( ID < 1 ) + { + return GL_TRUE; + } + + return _glfwPlatformWaitThread( ID, waitmode ); +} + + +//======================================================================== +// glfwGetThreadID() - Return the thread ID for the current thread +//======================================================================== + +GLFWAPI GLFWthread GLFWAPIENTRY glfwGetThreadID( void ) +{ + // Is GLFW initialized? + if( !_glfwInitialized ) + { + return 0; + } + + return _glfwPlatformGetThreadID(); +} + + +//======================================================================== +// glfwCreateMutex() - Create a mutual exclusion object +//======================================================================== + +GLFWAPI GLFWmutex GLFWAPIENTRY glfwCreateMutex( void ) +{ + // Is GLFW initialized? + if( !_glfwInitialized ) + { + return (GLFWmutex) 0; + } + + return _glfwPlatformCreateMutex(); +} + + +//======================================================================== +// glfwDestroyMutex() - Destroy a mutual exclusion object +//======================================================================== + +GLFWAPI void GLFWAPIENTRY glfwDestroyMutex( GLFWmutex mutex ) +{ + // Initialized & valid mutex (no real way of assuring this)? + if( !_glfwInitialized || !mutex ) + { + return; + } + + _glfwPlatformDestroyMutex( mutex ); +} + + +//======================================================================== +// glfwLockMutex() - Request access to a mutex +//======================================================================== + +GLFWAPI void GLFWAPIENTRY glfwLockMutex( GLFWmutex mutex ) +{ + // Initialized & valid mutex (no real way of assuring this)? + if( !_glfwInitialized && !mutex ) + { + return; + } + + _glfwPlatformLockMutex( mutex ); +} + + +//======================================================================== +// glfwUnlockMutex() - Release a mutex +//======================================================================== + +GLFWAPI void GLFWAPIENTRY glfwUnlockMutex( GLFWmutex mutex ) +{ + // Initialized & valid mutex (no real way of assuring this)? + if( !_glfwInitialized && !mutex ) + { + return; + } + + _glfwPlatformUnlockMutex( mutex ); +} + + +//======================================================================== +// glfwCreateCond() - Create a new condition variable object +//======================================================================== + +GLFWAPI GLFWcond GLFWAPIENTRY glfwCreateCond( void ) +{ + // Is GLFW initialized? + if( !_glfwInitialized ) + { + return (GLFWcond) 0; + } + + return _glfwPlatformCreateCond(); +} + + +//======================================================================== +// glfwDestroyCond() - Destroy a condition variable object +//======================================================================== + +GLFWAPI void GLFWAPIENTRY glfwDestroyCond( GLFWcond cond ) +{ + // Initialized & valid condition variable? + if( !_glfwInitialized || !cond ) + { + return; + } + + _glfwPlatformDestroyCond( cond ); +} + + +//======================================================================== +// glfwWaitCond() - Wait for a condition to be raised +//======================================================================== + +GLFWAPI void GLFWAPIENTRY glfwWaitCond( GLFWcond cond, GLFWmutex mutex, + double timeout ) +{ + // Initialized & valid condition variable and mutex? + if( !_glfwInitialized || !cond || !mutex ) + { + return; + } + + _glfwPlatformWaitCond( cond, mutex, timeout ); +} + + +//======================================================================== +// glfwSignalCond() - Signal a condition to one waiting thread +//======================================================================== + +GLFWAPI void GLFWAPIENTRY glfwSignalCond( GLFWcond cond ) +{ + // Initialized & valid condition variable? + if( !_glfwInitialized || !cond ) + { + return; + } + + _glfwPlatformSignalCond( cond ); +} + + +//======================================================================== +// glfwBroadcastCond() - Broadcast a condition to all waiting threads +//======================================================================== + +GLFWAPI void GLFWAPIENTRY glfwBroadcastCond( GLFWcond cond ) +{ + // Initialized & valid condition variable? + if( !_glfwInitialized || !cond ) + { + return; + } + + _glfwPlatformBroadcastCond( cond ); +} + + +//======================================================================== +// glfwGetNumberOfProcessors() - Return the number of processors in the +// system. This information can be useful for determining the optimal +// number of threads to use for performing a certain task. +//======================================================================== + +GLFWAPI int GLFWAPIENTRY glfwGetNumberOfProcessors( void ) +{ + // Is GLFW initialized? + if( !_glfwInitialized ) + { + return 0; + } + + return _glfwPlatformGetNumberOfProcessors(); +} |