BCB tracing implementation
Modified: trunk/reactos/ntoskrnl/cc/view.c
Modified: trunk/reactos/ntoskrnl/ntoskrnl.def

Modified: trunk/reactos/ntoskrnl/cc/view.c
--- trunk/reactos/ntoskrnl/cc/view.c	2005-08-13 13:13:05 UTC (rev 17366)
+++ trunk/reactos/ntoskrnl/cc/view.c	2005-08-13 13:16:16 UTC (rev 17367)
@@ -81,12 +81,81 @@
 #error Unknown compiler for alloca intrinsic stack allocation "function"
 #endif
 
+#if defined(DBG) || defined(KDBG)
+static void CcRosCacheSegmentIncRefCount ( PCACHE_SEGMENT cs )
+{
+	++cs->ReferenceCount;
+	if ( cs->Bcb->Trace )
+	{
+		DPRINT1("CacheSegment %p ++RefCount=%d, Dirty %d, PageOut %d\n",
+			cs, cs->ReferenceCount, cs->Dirty, cs->PageOut );
+	}
+}
+static void CcRosCacheSegmentDecRefCount ( PCACHE_SEGMENT cs )
+{
+	--cs->ReferenceCount;
+	if ( cs->Bcb->Trace )
+	{
+		DPRINT1("CacheSegment %p --RefCount=%d, Dirty %d, PageOut %d\n",
+			cs, cs->ReferenceCount, cs->Dirty, cs->PageOut );
+	}
+}
+#else
+#define CcRosCacheSegmentIncRefCount(cs) (++((cs)->ReferenceCount))
+#define CcRosCacheSegmentDecRefCount(cs) (--((cs)->ReferenceCount))
+#endif
 
 NTSTATUS
 CcRosInternalFreeCacheSegment(PCACHE_SEGMENT CacheSeg);
 
 /* FUNCTIONS *****************************************************************/
 
+VOID
+STDCALL
+CcRosTraceCacheMap (
+	PBCB Bcb,
+	BOOLEAN Trace )
+{
+#if defined(DBG) || defined(KDBG)
+	KIRQL oldirql;
+	PLIST_ENTRY current_entry;
+	PCACHE_SEGMENT current;
+
+	if ( !Bcb )
+		return;
+
+	Bcb->Trace = Trace;
+
+	if ( Trace )
+	{
+		DPRINT1("Enabling Tracing for CacheMap 0x%p:\n", Bcb );
+
+		ExAcquireFastMutex(&ViewLock);
+		KeAcquireSpinLock(&Bcb->BcbLock, &oldirql);
+
+		current_entry = Bcb->BcbSegmentListHead.Flink;
+		while (current_entry != &Bcb->BcbSegmentListHead)
+		{
+			current = CONTAINING_RECORD(current_entry, CACHE_SEGMENT, BcbSegmentListEntry);
+			current_entry = current_entry->Flink;
+
+			DPRINT1("  CacheSegment 0x%p enabled, RefCount %d, Dirty %d, PageOut %d\n",
+				current, current->ReferenceCount, current->Dirty, current->PageOut );
+		}
+		KeReleaseSpinLock(&Bcb->BcbLock, oldirql);
+		ExReleaseFastMutex(&ViewLock);
+	}
+	else
+	{
+		DPRINT1("Disabling Tracing for CacheMap 0x%p:\n", Bcb );
+	}
+
+#else
+	Bcb = Bcb;
+	Trace = Trace;
+#endif
+}
+
 NTSTATUS
 CcRosFlushCacheSegment(PCACHE_SEGMENT CacheSegment)
 {
@@ -100,7 +169,7 @@
       CacheSegment->Dirty = FALSE;
       RemoveEntryList(&CacheSegment->DirtySegmentListEntry);
       DirtyPageCount -= CacheSegment->Bcb->CacheSegmentSize / PAGE_SIZE;
-      CacheSegment->ReferenceCount--;
+      CcRosCacheSegmentDecRefCount ( CacheSegment );
       KeReleaseSpinLock(&CacheSegment->Bcb->BcbLock, oldIrql);
       ExReleaseFastMutex(&ViewLock);
     }
@@ -243,7 +312,7 @@
 	     ULONG i;
 	     NTSTATUS Status;
 
-             current->ReferenceCount++;
+         CcRosCacheSegmentIncRefCount(current);
 	     last = current;
 	     current->PageOut = TRUE;
              KeReleaseSpinLock(&current->Bcb->BcbLock, oldIrql);
@@ -260,8 +329,8 @@
 	       }
              ExAcquireFastMutex(&ViewLock);
              KeAcquireSpinLock(&current->Bcb->BcbLock, &oldIrql);
-	     current->ReferenceCount--;
-	     current->PageOut = FALSE;
+             CcRosCacheSegmentDecRefCount(current);
+             current->PageOut = FALSE;
              KeReleaseSpinLock(&current->Bcb->BcbLock, oldIrql);
              current_entry = &current->CacheSegmentLRUListEntry;
 	     continue;
@@ -315,14 +384,14 @@
      CacheSeg->MappedCount++;
   }
   KeAcquireSpinLock(&Bcb->BcbLock, &oldIrql);
-  CacheSeg->ReferenceCount--;
+  CcRosCacheSegmentDecRefCount(CacheSeg);
   if (Mapped && CacheSeg->MappedCount == 1)
   {
-      CacheSeg->ReferenceCount++;
+      CcRosCacheSegmentIncRefCount(CacheSeg);
   }
   if (!WasDirty && CacheSeg->Dirty)
   {
-      CacheSeg->ReferenceCount++;
+      CcRosCacheSegmentIncRefCount(CacheSeg);
   }
   KeReleaseSpinLock(&Bcb->BcbLock, oldIrql);
   ExReleaseFastMutex(&ViewLock);
@@ -351,7 +420,7 @@
       if (current->FileOffset <= FileOffset &&
 	  (current->FileOffset + Bcb->CacheSegmentSize) > FileOffset)
 	{
-	  current->ReferenceCount++;
+      CcRosCacheSegmentIncRefCount(current);
 	  KeReleaseSpinLock(&Bcb->BcbLock, oldIrql);
           ExAcquireFastMutex(&current->Lock);
 	  return(current);
@@ -387,7 +456,7 @@
   else
   {
      KeAcquireSpinLock(&Bcb->BcbLock, &oldIrql);
-     CacheSeg->ReferenceCount--;
+     CcRosCacheSegmentDecRefCount(CacheSeg);
      KeReleaseSpinLock(&Bcb->BcbLock, oldIrql);
   }
 
@@ -430,14 +499,14 @@
   }
 
   KeAcquireSpinLock(&Bcb->BcbLock, &oldIrql);
-  CacheSeg->ReferenceCount--;
+  CcRosCacheSegmentDecRefCount(CacheSeg);
   if (!WasDirty && NowDirty)
   {
-     CacheSeg->ReferenceCount++;
+     CcRosCacheSegmentIncRefCount(CacheSeg);
   }
   if (CacheSeg->MappedCount == 0)
   {
-     CacheSeg->ReferenceCount--;
+     CcRosCacheSegmentDecRefCount(CacheSeg);
   }
   KeReleaseSpinLock(&Bcb->BcbLock, oldIrql);
 
@@ -480,6 +549,12 @@
   current->PageOut = FALSE;
   current->FileOffset = ROUND_DOWN(FileOffset, Bcb->CacheSegmentSize);
   current->Bcb = Bcb;
+#if defined(DBG) || defined(KDBG)
+  if ( Bcb->Trace )
+  {
+    DPRINT1("CacheMap 0x%p: new Cache Segment: 0x%p\n", Bcb, current );
+  }
+#endif
   current->MappedCount = 0;
   current->DirtySegmentListEntry.Flink = NULL;
   current->DirtySegmentListEntry.Blink = NULL;
@@ -504,8 +579,17 @@
      if (current->FileOffset <= FileOffset &&
       	(current->FileOffset + Bcb->CacheSegmentSize) > FileOffset)
      {
-	current->ReferenceCount++;
+	CcRosCacheSegmentIncRefCount(current);
 	KeReleaseSpinLock(&Bcb->BcbLock, oldIrql);
+#if defined(DBG) || defined(KDBG)
+	if ( Bcb->Trace )
+	{
+		DPRINT1("CacheMap 0x%p: deleting newly created Cache Segment 0x%p ( found existing one 0x%p )\n",
+			Bcb,
+			(*CacheSeg),
+			current );
+	}
+#endif
 	ExReleaseFastMutex(&(*CacheSeg)->Lock);
 	ExReleaseFastMutex(&ViewLock);
 	ExFreeToNPagedLookasideList(&CacheSegLookasideList, *CacheSeg);
@@ -761,6 +845,12 @@
   KIRQL oldIrql;
 #endif
   DPRINT("Freeing cache segment 0x%p\n", CacheSeg);
+#if defined(DBG) || defined(KDBG)
+	if ( CacheSeg->Bcb->Trace )
+	{
+		DPRINT1("CacheMap 0x%p: deleting Cache Segment: 0x%p\n", CacheSeg->Bcb, CacheSeg );
+	}
+#endif
 #ifdef CACHE_BITMAP
   RegionSize = CacheSeg->Bcb->CacheSegmentSize / PAGE_SIZE;
 
@@ -878,7 +968,7 @@
 	    }
             KeAcquireSpinLock(&Bcb->BcbLock, &oldIrql);
 	    ExReleaseFastMutex(&current->Lock);
-	    current->ReferenceCount--;
+            CcRosCacheSegmentDecRefCount(current);
 	    KeReleaseSpinLock(&Bcb->BcbLock, oldIrql);
 	 }
 
@@ -953,6 +1043,9 @@
 	 }
          InsertHeadList(&FreeList, &current->BcbSegmentListEntry);
       }
+#if defined(DBG) || defined(KDBG)
+      Bcb->Trace = FALSE;
+#endif
       KeReleaseSpinLock(&Bcb->BcbLock, oldIrql);
 
       ExReleaseFastMutex(&ViewLock);

Modified: trunk/reactos/ntoskrnl/ntoskrnl.def
--- trunk/reactos/ntoskrnl/ntoskrnl.def	2005-08-13 13:13:05 UTC (rev 17366)
+++ trunk/reactos/ntoskrnl/ntoskrnl.def	2005-08-13 13:16:16 UTC (rev 17367)
@@ -7,6 +7,7 @@
 EXPORTS
 CcRosInitializeFileCache@8
 CcRosReleaseFileCache@4
+CcRosTraceCacheMap@8
 CcCanIWrite@16
 CcCopyRead@24
 CcCopyWrite@20