Author: ion
Date: Fri Jul  8 21:19:38 2011
New Revision: 52576

URL: http://svn.reactos.org/svn/reactos?rev=52576&view=rev
Log:
[NTDLL]: Simplify LdrLockLoaderLock, fix its prototype, add an ASSERT, move 
cookie generation into its own inline.

Modified:
    trunk/reactos/dll/ntdll/ldr/ldrapi.c

Modified: trunk/reactos/dll/ntdll/ldr/ldrapi.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/ntdll/ldr/ldrapi.c?rev=52576&r1=52575&r2=52576&view=diff
==============================================================================
--- trunk/reactos/dll/ntdll/ldr/ldrapi.c [iso-8859-1] (original)
+++ trunk/reactos/dll/ntdll/ldr/ldrapi.c [iso-8859-1] Fri Jul  8 21:19:38 2011
@@ -21,6 +21,15 @@
 
 /* FUNCTIONS *****************************************************************/
 
+ULONG_PTR
+FORCEINLINE
+LdrpMakeCookie(VOID)
+{
+    /* Generate a cookie */
+    return (((ULONG_PTR)NtCurrentTeb()->RealClientId.UniqueThread & 0xFFF) << 
16) |
+                        _InterlockedIncrement(&LdrpLoaderLockAcquisitonCount);
+}
+
 /*
  * @implemented
  */
@@ -99,17 +108,16 @@
 NTSTATUS
 NTAPI
 LdrLockLoaderLock(IN ULONG Flags,
-                  OUT PULONG Result OPTIONAL,
-                  OUT PULONG Cookie OPTIONAL)
-{
-    LONG OldCount;
+                  OUT PULONG Disposition OPTIONAL,
+                  OUT PULONG_PTR Cookie OPTIONAL)
+{
     NTSTATUS Status = STATUS_SUCCESS;
     BOOLEAN InInit = LdrpInLdrInit;
 
-    DPRINT("LdrLockLoaderLock(%x %p %p)\n", Flags, Result, Cookie);
+    DPRINT("LdrLockLoaderLock(%x %p %p)\n", Flags, Disposition, Cookie);
 
     /* Zero out the outputs */
-    if (Result) *Result = 0;
+    if (Disposition) *Disposition = LDR_LOCK_LOADER_LOCK_DISPOSITION_INVALID;
     if (Cookie) *Cookie = 0;
 
     /* Validate the flags */
@@ -140,9 +148,12 @@
         /* A normal failure */
         return STATUS_INVALID_PARAMETER_3;
     }
+    
+    /* Do or Do Not. There is no Try */
+    ASSERT((Disposition != NULL) || !(Flags & 
LDR_LOCK_LOADER_LOCK_FLAG_TRY_ONLY));
 
     /* If the flag is set, make sure we have a valid pointer to use */
-    if ((Flags & LDR_LOCK_LOADER_LOCK_FLAG_TRY_ONLY) && !(Result))
+    if ((Flags & LDR_LOCK_LOADER_LOCK_FLAG_TRY_ONLY) && !(Disposition))
     {
         /* No pointer to return the data to */
         if (Flags & LDR_LOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS)
@@ -168,13 +179,13 @@
             if (!RtlTryEnterCriticalSection(&LdrpLoaderLock))
             {
                 /* It's locked */
-                *Result = LDR_LOCK_LOADER_LOCK_DISPOSITION_LOCK_NOT_ACQUIRED;
-                goto Quickie;
+                *Disposition = 
LDR_LOCK_LOADER_LOCK_DISPOSITION_LOCK_NOT_ACQUIRED;
             }
             else
             {
                 /* It worked */
-                *Result = LDR_LOCK_LOADER_LOCK_DISPOSITION_LOCK_ACQUIRED;
+                *Disposition = LDR_LOCK_LOADER_LOCK_DISPOSITION_LOCK_ACQUIRED;
+                *Cookie = LdrpMakeCookie();
             }
         }
         else
@@ -183,14 +194,9 @@
             RtlEnterCriticalSection(&LdrpLoaderLock);
 
             /* See if result was requested */
-            if (Result) *Result = 
LDR_LOCK_LOADER_LOCK_DISPOSITION_LOCK_ACQUIRED;
-        }
-
-        /* Increase the acquisition count */
-        OldCount = _InterlockedIncrement(&LdrpLoaderLockAcquisitonCount);
-
-        /* Generate a cookie */
-        *Cookie = (((ULONG)NtCurrentTeb()->RealClientId.UniqueThread & 0xFFF) 
<< 16) | OldCount;
+            if (Disposition) *Disposition = 
LDR_LOCK_LOADER_LOCK_DISPOSITION_LOCK_ACQUIRED;
+            *Cookie = LdrpMakeCookie();
+        }
     }
     else
     {
@@ -204,13 +210,13 @@
                 if (!RtlTryEnterCriticalSection(&LdrpLoaderLock))
                 {
                     /* It's locked */
-                    *Result = 
LDR_LOCK_LOADER_LOCK_DISPOSITION_LOCK_NOT_ACQUIRED;
-                    _SEH2_YIELD(return STATUS_SUCCESS);
+                    *Disposition = 
LDR_LOCK_LOADER_LOCK_DISPOSITION_LOCK_NOT_ACQUIRED;
                 }
                 else
                 {
                     /* It worked */
-                    *Result = LDR_LOCK_LOADER_LOCK_DISPOSITION_LOCK_ACQUIRED;
+                    *Disposition = 
LDR_LOCK_LOADER_LOCK_DISPOSITION_LOCK_ACQUIRED;
+                    *Cookie = LdrpMakeCookie();
                 }
             }
             else
@@ -219,14 +225,9 @@
                 RtlEnterCriticalSection(&LdrpLoaderLock);
 
                 /* See if result was requested */
-                if (Result) *Result = 
LDR_LOCK_LOADER_LOCK_DISPOSITION_LOCK_ACQUIRED;
-            }
-
-            /* Increase the acquisition count */
-            OldCount = _InterlockedIncrement(&LdrpLoaderLockAcquisitonCount);
-
-            /* Generate a cookie */
-            *Cookie = (((ULONG)NtCurrentTeb()->RealClientId.UniqueThread & 
0xFFF) << 16) | OldCount;
+                if (Disposition) *Disposition = 
LDR_LOCK_LOADER_LOCK_DISPOSITION_LOCK_ACQUIRED;
+                *Cookie = LdrpMakeCookie();
+            }
         }
         _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
         {
@@ -236,7 +237,7 @@
         _SEH2_END;
     }
 
-Quickie:
+    /* Return status */
     return Status;
 }
 


Reply via email to