]> xenbits.xensource.com Git - people/pauldu/xenbus.git/commitdiff
Tighten up rangeset auditing and add separate counts for items and ranges
authorPaul Durrant <paul.durrant@citrix.com>
Wed, 28 May 2014 12:29:51 +0000 (13:29 +0100)
committerPaul Durrant <paul.durrant@citrix.com>
Wed, 28 May 2014 12:38:53 +0000 (13:38 +0100)
Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
src/xenbus/range_set.c

index 4aa95e640e814d93be125c1b89fb7cb235e1e933..c989f5225342a36e38d99c944900c59378875457 100644 (file)
@@ -51,7 +51,8 @@ struct _XENBUS_RANGE_SET {
     KSPIN_LOCK      Lock;
     LIST_ENTRY      List;
     PLIST_ENTRY     Cursor;
-    ULONGLONG       Count;
+    ULONG           RangeCount;
+    ULONGLONG       ItemCount;
     PRANGE          Spare;
 };
 
@@ -102,17 +103,21 @@ __RangeSetAudit(
 {
     if (__RangeSetIsEmpty(RangeSet)) {
         ASSERT3P(RangeSet->Cursor, ==, &RangeSet->List);
-        ASSERT3U(RangeSet->Count, ==, 0);
+        ASSERT3U(RangeSet->RangeCount, ==, 0);
+        ASSERT3U(RangeSet->ItemCount, ==, 0);
     } else {
         BOOLEAN     FoundCursor;
-        ULONGLONG   Count;
+        ULONG       RangeCount;
+        ULONGLONG   ItemCount;
         PLIST_ENTRY ListEntry;
 
         ASSERT3P(RangeSet->Cursor, !=, &RangeSet->List);
-        ASSERT3U(RangeSet->Count, !=, 0);
+        ASSERT3U(RangeSet->RangeCount, !=, 0);
+        ASSERT3U(RangeSet->ItemCount, !=, 0);
 
         FoundCursor = FALSE;
-        Count = 0;
+        RangeCount = 0;
+        ItemCount = 0;
 
         for (ListEntry = RangeSet->List.Flink;
              ListEntry != &RangeSet->List;
@@ -125,7 +130,8 @@ __RangeSetAudit(
             Range = CONTAINING_RECORD(ListEntry, RANGE, ListEntry);
 
             ASSERT3S(Range->Start, <=, Range->End);
-            Count += Range->End + 1 - Range->Start;
+            RangeCount++;
+            ItemCount += Range->End + 1 - Range->Start;
 
             if (ListEntry->Flink != &RangeSet->List) {
                 PRANGE Next;
@@ -136,7 +142,8 @@ __RangeSetAudit(
             }
         }
 
-        ASSERT3U(Count, ==, RangeSet->Count);
+        ASSERT3U(RangeCount, ==, RangeSet->RangeCount);
+        ASSERT3U(ItemCount, ==, RangeSet->ItemCount);
         ASSERT(FoundCursor);
     }
 }
@@ -160,6 +167,9 @@ __RangeSetRemove(
 
     RemoveEntryList(Cursor);
 
+    ASSERT(RangeSet->RangeCount != 0);
+    --RangeSet->RangeCount;
+
     if (RangeSet->Cursor == &RangeSet->List)
         RangeSet->Cursor = (After) ? RangeSet->List.Flink : RangeSet->List.Blink;
 
@@ -239,6 +249,10 @@ RangeSetPop(
 
     KeAcquireSpinLock(&RangeSet->Lock, &Irql);
 
+#if RANGE_SET_AUDIT
+    __RangeSetAudit(RangeSet);
+#endif
+
     status = STATUS_INSUFFICIENT_RESOURCES;
     if (__RangeSetIsEmpty(RangeSet))
         goto fail1;
@@ -249,7 +263,9 @@ RangeSetPop(
     Range = CONTAINING_RECORD(Cursor, RANGE, ListEntry);
 
     *Item = Range->Start++;
-    --RangeSet->Count;
+
+    ASSERT(RangeSet->ItemCount != 0);
+    --RangeSet->ItemCount;
 
     if (*Item == Range->End)    // Singleton
         __RangeSetRemove(RangeSet, TRUE);
@@ -323,6 +339,8 @@ __RangeSetAdd(
     else
         INSERT_BEFORE(Cursor, &Range->ListEntry);
 
+    RangeSet->RangeCount++;
+
     RangeSet->Cursor = &Range->ListEntry;
 
     __RangeSetMergeBackwards(RangeSet);
@@ -352,6 +370,10 @@ RangeSetGet(
 
     KeAcquireSpinLock(&RangeSet->Lock, &Irql);
 
+#if RANGE_SET_AUDIT
+    __RangeSetAudit(RangeSet);
+#endif
+
     Cursor = RangeSet->Cursor;
     ASSERT(Cursor != &RangeSet->List);
 
@@ -410,7 +432,8 @@ RangeSetGet(
     Range->End = Item - 1;
 
 done:
-    --RangeSet->Count;
+    ASSERT(RangeSet->ItemCount != 0);
+    --RangeSet->ItemCount;
 
 #if RANGE_SET_AUDIT
     __RangeSetAudit(RangeSet);
@@ -531,6 +554,10 @@ RangeSetPut(
 
     KeAcquireSpinLock(&RangeSet->Lock, &Irql);
 
+#if RANGE_SET_AUDIT
+    __RangeSetAudit(RangeSet);
+#endif
+
     Cursor = RangeSet->Cursor;
 
     if (__RangeSetIsEmpty(RangeSet)) {
@@ -551,7 +578,7 @@ RangeSetPut(
     if (!NT_SUCCESS(status))
         goto fail1;
 
-    RangeSet->Count += End + 1 - Start;
+    RangeSet->ItemCount += End + 1 - Start;
 
 #if RANGE_SET_AUDIT
     __RangeSetAudit(RangeSet);