Add more Critical Section Debug Data and fix two bugs.
Modified: trunk/reactos/lib/ntdll/ldr/startup.c
Modified: trunk/reactos/lib/ntdll/rtl/critical.c

Modified: trunk/reactos/lib/ntdll/ldr/startup.c
--- trunk/reactos/lib/ntdll/ldr/startup.c	2005-01-04 01:49:08 UTC (rev 12773)
+++ trunk/reactos/lib/ntdll/ldr/startup.c	2005-01-04 01:51:16 UTC (rev 12774)
@@ -279,10 +279,7 @@
        RtlResetRtlTranslations (&NlsTable);
 
        NTHeaders = (PIMAGE_NT_HEADERS)(ImageBase + PEDosHeader->e_lfanew);
-
-       /* Initialize Critical Section Data */
-       RtlpInitDeferedCriticalSection();
-       
+      
        /* create process heap */
        RtlInitializeHeapManager();
        Peb->ProcessHeap = RtlCreateHeap(HEAP_GROWABLE,
@@ -296,7 +293,10 @@
            DPRINT1("Failed to create process heap\n");
            ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
          }
-      
+
+       /* Initialize Critical Section Data */
+       RtlpInitDeferedCriticalSection();
+             
        /* initalize peb lock support */
        RtlInitializeCriticalSection (&PebLock);
        Peb->FastPebLock = &PebLock;

Modified: trunk/reactos/lib/ntdll/rtl/critical.c
--- trunk/reactos/lib/ntdll/rtl/critical.c	2005-01-04 01:49:08 UTC (rev 12773)
+++ trunk/reactos/lib/ntdll/rtl/critical.c	2005-01-04 01:51:16 UTC (rev 12774)
@@ -16,7 +16,7 @@
 #include <ntdll/rtl.h>
 #include <ntos/synch.h>
 
-//#define NDEBUG
+#define NDEBUG
 #include <ntdll/ntdll.h>
 
 /* FUNCTIONS *****************************************************************/
@@ -24,6 +24,8 @@
 static RTL_CRITICAL_SECTION RtlCriticalSectionLock;
 static LIST_ENTRY RtlCriticalSectionList;
 static BOOLEAN RtlpCritSectInitialized = FALSE;
+//static RTL_CRITICAL_SECTION_DEBUG RtlpStaticDebugInfo[64];
+//static PRTL_CRITICAL_SECTION_DEBUG RtlpDebugInfoFreeList;
 
 /*++
  * RtlDeleteCriticalSection 
@@ -209,6 +211,7 @@
     PVOID Heap;
     
     /* First things first, set up the Object */
+    DPRINT("Initializing Critical Section: %x\n", CriticalSection);
     CriticalSection->LockCount = -1;
     CriticalSection->RecursionCount = 0;
     CriticalSection->OwningThread = 0;
@@ -222,6 +225,7 @@
     if ((Heap = RtlGetProcessHeap())) {
 
         CritcalSectionDebugData = RtlAllocateHeap(Heap, 0, sizeof(RTL_CRITICAL_SECTION_DEBUG));
+        DPRINT("Allocated Critical Section Debug Data: %x\n", CritcalSectionDebugData);
         CritcalSectionDebugData->Type = RTL_CRITSECT_TYPE;
         CritcalSectionDebugData->ContentionCount = 0;
         CritcalSectionDebugData->EntryCount = 0;
@@ -235,6 +239,10 @@
          */
         if ((CriticalSection != &RtlCriticalSectionLock) && (RtlpCritSectInitialized)) {
             
+            DPRINT("Securely Inserting into ProcessLocks: %x, %x\n", 
+                   &CritcalSectionDebugData->ProcessLocksList,
+                   CriticalSection);
+            
             /* Protect List */
             RtlEnterCriticalSection(&RtlCriticalSectionLock);
 
@@ -246,12 +254,17 @@
         
         } else {
 
+            DPRINT("Inserting into ProcessLocks: %x, %x\n", 
+                   &CritcalSectionDebugData->ProcessLocksList,
+                   CriticalSection);
+            
             /* Add it directly */
             InsertTailList(&RtlCriticalSectionList, &CritcalSectionDebugData->ProcessLocksList);
         }
         
     } else {
 
+        DPRINT1("No Debug Data was allocated for: %x\n", CriticalSection);
         /* This shouldn't happen... */
         CritcalSectionDebugData = NULL;
     }
@@ -372,7 +385,9 @@
     BOOLEAN LastChance = FALSE;
     LARGE_INTEGER Timeout;
     
-    Timeout = RtlConvertLongToLargeInteger(150000);
+    /* Wait 2.5 minutes */
+    Timeout.QuadPart = 150000L * (ULONGLONG)10000;
+    Timeout.QuadPart = -Timeout.QuadPart;
     /* ^^ HACK HACK HACK. Good way:
     Timeout = &NtCurrentPeb()->CriticalSectionTimeout   */
     
@@ -382,14 +397,16 @@
     }
     
     /* Increase the Debug Entry count */
-    CriticalSection->DebugInfo->EntryCount++;
+    DPRINT("Waiting on Critical Section: %x\n", CriticalSection);
+    if (CriticalSection->DebugInfo) CriticalSection->DebugInfo->EntryCount++;
     
     for (;;) {
     
         /* Increase the number of times we've had contention */
-        CriticalSection->DebugInfo->ContentionCount++;
+        if (CriticalSection->DebugInfo) CriticalSection->DebugInfo->ContentionCount++;
         
         /* Wait on the Event */
+        DPRINT("Waiting on Event: %x\n", CriticalSection->LockSemaphore);
         Status = NtWaitForSingleObject(CriticalSection->LockSemaphore,
                                        FALSE,
                                        &Timeout);
@@ -400,6 +417,8 @@
             /* Is this the 2nd time we've timed out? */
             if (LastChance) {
                 
+                DPRINT1("Deadlock: %x\n", CriticalSection);
+                
                 /* Yes it is, we are raising an exception */
                 ExceptionRecord.ExceptionCode    = STATUS_POSSIBLE_DEADLOCK;
                 ExceptionRecord.ExceptionFlags   = 0;
@@ -451,11 +470,13 @@
     }
     
     /* Signal the Event */
+    DPRINT("Signaling CS Event\n");
     Status = NtSetEvent(CriticalSection->LockSemaphore, NULL);
             
     if (!NT_SUCCESS(Status)) {
         
         /* We've failed */
+        DPRINT1("Signaling Failed\n");
         RtlRaiseStatus(Status);
     }
 }
@@ -487,7 +508,7 @@
     /* Chevk if we have an event */
     if (!hEvent) {
         
-        DPRINT ("Creating Event\n");
+        DPRINT("Creating Event\n");
         /* No, so create it */
         if (!NT_SUCCESS(Status = NtCreateEvent(&hNewEvent,
                                                EVENT_ALL_ACCESS,