Commit in reactos/lib/msvcrt/misc on MAIN
lock.c+135added 1.1
msvcrt lock functions have been dewine-ifyed.

reactos/lib/msvcrt/misc
lock.c added at 1.1
diff -N lock.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lock.c	11 Dec 2004 19:20:19 -0000	1.1
@@ -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 <msvcrt/msvcrtdbg.h>
+#include <msvcrt/internal/mtdll.h>
+
+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) );
+}
+
CVSspam 0.2.8