update for HEAD-2003091401
[reactos.git] / lib / ntdll / rtl / critical.c
index b3dcba2..3be0767 100644 (file)
@@ -18,6 +18,9 @@
 
 /* FUNCTIONS *****************************************************************/
 
+/*
+ * @implemented
+ */
 VOID STDCALL
 RtlDeleteCriticalSection(PCRITICAL_SECTION CriticalSection)
 {
@@ -25,11 +28,13 @@ RtlDeleteCriticalSection(PCRITICAL_SECTION CriticalSection)
    CriticalSection->Reserved = -1;
 }
 
+/*
+ * @implemented
+ */
 VOID STDCALL
 RtlEnterCriticalSection(PCRITICAL_SECTION CriticalSection)
 {
    HANDLE Thread = (HANDLE)NtCurrentTeb()->Cid.UniqueThread;
-   ULONG ret;
  
    if (InterlockedIncrement(&CriticalSection->LockCount))
      {
@@ -74,6 +79,9 @@ RtlEnterCriticalSection(PCRITICAL_SECTION CriticalSection)
 #endif
 }
 
+/*
+ * @implemented
+ */
 NTSTATUS STDCALL
 RtlInitializeCriticalSection(PCRITICAL_SECTION CriticalSection)
 {
@@ -92,6 +100,9 @@ RtlInitializeCriticalSection(PCRITICAL_SECTION CriticalSection)
    return Status;
 }
 
+/*
+ * @implemented
+ */
 VOID STDCALL
 RtlLeaveCriticalSection(PCRITICAL_SECTION CriticalSection)
 {
@@ -110,7 +121,7 @@ RtlLeaveCriticalSection(PCRITICAL_SECTION CriticalSection)
        return;
      }
    CriticalSection->OwningThread = 0;
-   if (InterlockedIncrement(&CriticalSection->LockCount) >= 0)
+   if (InterlockedDecrement(&CriticalSection->LockCount) >= 0)
      {
        NTSTATUS Status;
        
@@ -142,30 +153,28 @@ RtlLeaveCriticalSection(PCRITICAL_SECTION CriticalSection)
 #endif
 }
 
+/*
+ * @implemented
+ */
 BOOLEAN STDCALL
 RtlTryEnterCriticalSection(PCRITICAL_SECTION CriticalSection)
 {
    if (InterlockedCompareExchange((PVOID*)&CriticalSection->LockCount, 
-                                 (PVOID)1, (PVOID)0 ) == 0)
+                                 (PVOID)0, (PVOID)-1 ) == (PVOID)-1)
      {
        CriticalSection->OwningThread = 
          (HANDLE) NtCurrentTeb()->Cid.UniqueThread;
-       CriticalSection->RecursionCount++;
+       CriticalSection->RecursionCount = 1;
        return TRUE;
      }
    if (CriticalSection->OwningThread == 
        (HANDLE)NtCurrentTeb()->Cid.UniqueThread)
      {
+        InterlockedIncrement(&CriticalSection->LockCount);
        CriticalSection->RecursionCount++;
        return TRUE;
      }
    return FALSE;
 }
 
-
 /* EOF */
-
-
-
-
-