[NTOS:EX] Use InterlockedExchangeAdd64 instead of InterlockedCompareExchange64 loop...
[reactos.git] / ntoskrnl / ex / uuid.c
index 8c8270a..8af4776 100644 (file)
@@ -26,7 +26,7 @@
 #define SECS_15_OCT_1582_TO_1601  ((17 + 30 + 31 + 365 * 18 + 5) * SECSPERDAY)
 #define TICKS_15_OCT_1582_TO_1601 ((ULONGLONG)SECS_15_OCT_1582_TO_1601 * TICKSPERSEC)
 
-/* 10000 in 100-ns model = 0,1 microsecond */
+/* 10000 in 100-ns model = 0.1 microsecond */
 #define TIME_FRAME 10000
 
 #if defined (ALLOC_PRAGMA)
@@ -45,7 +45,7 @@ BOOLEAN ExpUuidSequenceNumberNotSaved = FALSE;
 UUID_CACHED_VALUES_STRUCT ExpUuidCachedValues = {0ULL, 0xFFFFFFFF, 0, 0, { 0x80, 0x6E, 0x6F, 0x6E, 0x69, 0x63}};
 BOOLEAN ExpUuidCacheValid = FALSE;
 ULONG ExpLuidIncrement = 1;
-LARGE_INTEGER ExpLuid = {.LowPart = 0x3e9, .HighPart = 0x0};
+LARGE_INTEGER ExpLuid = {{0x3e9, 0x0}};
 
 /* FUNCTIONS ****************************************************************/
 
@@ -247,7 +247,7 @@ ExpAllocateUuids(PULARGE_INTEGER Time,
         return STATUS_RETRY;
     }
 
-    /* If time diff > 0,1ms, squash it to reduce it to keep our clock resolution */
+    /* If time diff > 0.1ms, squash it to reduce it to keep our clock resolution */
     if (TimeDiff.HighPart > 0 || TimeDiff.QuadPart > TICKS_PER_CLOCK_TICK * TIME_FRAME)
     {
         TimeDiff.QuadPart = TICKS_PER_CLOCK_TICK * TIME_FRAME;
@@ -339,27 +339,9 @@ VOID
 NTAPI
 ExAllocateLocallyUniqueId(OUT LUID *LocallyUniqueId)
 {
-    LARGE_INTEGER PrevLuid;
-    LONGLONG NewLuid, CompLuid;
-
     /* Atomically increment the luid */
-    PrevLuid.QuadPart = ExpLuid.QuadPart;
-    for (NewLuid = ExpLuid.QuadPart + ExpLuidIncrement; ;
-         NewLuid = PrevLuid.QuadPart + ExpLuidIncrement)
-    {
-        CompLuid = InterlockedCompareExchange64(&ExpLuid.QuadPart,
-                                                NewLuid,
-                                                PrevLuid.QuadPart);
-        if (CompLuid == PrevLuid.QuadPart)
-        {
-            break;
-        }
-
-        PrevLuid.QuadPart = CompLuid;
-    }
-
-    LocallyUniqueId->LowPart = PrevLuid.LowPart;
-    LocallyUniqueId->HighPart = PrevLuid.HighPart;
+    *(LONG64*)LocallyUniqueId = InterlockedExchangeAdd64(&ExpLuid.QuadPart,
+                                                         ExpLuidIncrement);
 }