From 46e27ab423ffb8cc3df4480edcf8e4b2bda38c4a Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Sat, 11 Dec 2004 19:20:19 +0000 Subject: [PATCH] msvcrt lock functions have been dewine-ifyed. svn path=/trunk/; revision=12022 --- reactos/lib/msvcrt/misc/lock.c | 135 +++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 reactos/lib/msvcrt/misc/lock.c diff --git a/reactos/lib/msvcrt/misc/lock.c b/reactos/lib/msvcrt/misc/lock.c new file mode 100644 index 00000000000..100cef02d54 --- /dev/null +++ b/reactos/lib/msvcrt/misc/lock.c @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2002, TransGaming Technologies Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "precomp.h" + +#define NDEBUG +#include +#include + +typedef struct +{ + BOOL bInit; + CRITICAL_SECTION crit; +} LOCKTABLEENTRY; + +static LOCKTABLEENTRY lock_table[ _TOTAL_LOCKS ]; + +static inline void msvcrt_mlock_set_entry_initialized( int locknum, BOOL initialized ) +{ + lock_table[ locknum ].bInit = initialized; +} + +static inline void msvcrt_initialize_mlock( int locknum ) +{ + InitializeCriticalSection( &(lock_table[ locknum ].crit) ); + msvcrt_mlock_set_entry_initialized( locknum, TRUE ); +} + +static inline void msvcrt_uninitialize_mlock( int locknum ) +{ + DeleteCriticalSection( &(lock_table[ locknum ].crit) ); + msvcrt_mlock_set_entry_initialized( locknum, FALSE ); +} + +/********************************************************************** + * msvcrt_init_mt_locks (internal) + * + * Initialize the table lock. All other locks will be initialized + * upon first use. + * + */ +void msvcrt_init_mt_locks(void) +{ + int i; + + DPRINT( "initializing mtlocks\n" ); + + /* Initialize the table */ + for( i=0; i < _TOTAL_LOCKS; i++ ) + { + msvcrt_mlock_set_entry_initialized( i, FALSE ); + } + + /* Initialize our lock table lock */ + msvcrt_initialize_mlock( _LOCKTAB_LOCK ); +} + +/********************************************************************** + * msvcrt_free_mt_locks (internal) + * + * Uninitialize all mt locks. Assume that neither _lock or _unlock will + * be called once we're calling this routine (ie _LOCKTAB_LOCK can be deleted) + * + */ +void msvcrt_free_mt_locks(void) +{ + int i; + + DPRINT(": uninitializing all mtlocks\n" ); + + /* Uninitialize the table */ + for( i=0; i < _TOTAL_LOCKS; i++ ) + { + if( lock_table[ i ].bInit == TRUE ) + { + msvcrt_uninitialize_mlock( i ); + } + } +} + + +/********************************************************************** + * _lock (MSVCRT.@) + */ +void _lock( int locknum ) +{ + DPRINT( "(%d)\n", locknum ); + + /* If the lock doesn't exist yet, create it */ + if( lock_table[ locknum ].bInit == FALSE ) + { + /* Lock while we're changing the lock table */ + _lock( _LOCKTAB_LOCK ); + + /* Check again if we've got a bit of a race on lock creation */ + if( lock_table[ locknum ].bInit == FALSE ) + { + DPRINT( ": creating lock #%d\n", locknum ); + msvcrt_initialize_mlock( locknum ); + } + + /* Unlock ourselves */ + _unlock( _LOCKTAB_LOCK ); + } + + EnterCriticalSection( &(lock_table[ locknum ].crit) ); +} + +/********************************************************************** + * _unlock (MSVCRT.@) + * + * NOTE: There is no error detection to make sure the lock exists and is acquired. + */ +void _unlock( int locknum ) +{ + DPRINT( "(%d)\n", locknum ); + + LeaveCriticalSection( &(lock_table[ locknum ].crit) ); +} +