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(¤t->Bcb->BcbLock, oldIrql);
@@ -260,8 +329,8 @@
}
ExAcquireFastMutex(&ViewLock);
KeAcquireSpinLock(¤t->Bcb->BcbLock, &oldIrql);
- current->ReferenceCount--;
- current->PageOut = FALSE;
+ CcRosCacheSegmentDecRefCount(current);
+ current->PageOut = FALSE;
KeReleaseSpinLock(¤t->Bcb->BcbLock, oldIrql);
current_entry = ¤t->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(¤t->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(¤t->Lock);
- current->ReferenceCount--;
+ CcRosCacheSegmentDecRefCount(current);
KeReleaseSpinLock(&Bcb->BcbLock, oldIrql);
}
@@ -953,6 +1043,9 @@
}
InsertHeadList(&FreeList, ¤t->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