[NTOSKRNL] Add the CcPinMappedDataCount counter
[reactos.git] / ntoskrnl / include / internal / cc.h
index 9679255..8a5fb73 100644 (file)
@@ -47,11 +47,25 @@ extern LIST_ENTRY CcDeferredWrites;
 extern KSPIN_LOCK CcDeferredWriteSpinLock;
 extern ULONG CcNumberWorkerThreads;
 extern LIST_ENTRY CcIdleWorkerThreadList;
+extern LIST_ENTRY CcExpressWorkQueue;
 extern LIST_ENTRY CcRegularWorkQueue;
 extern LIST_ENTRY CcPostTickWorkQueue;
 extern NPAGED_LOOKASIDE_LIST CcTwilightLookasideList;
 extern LARGE_INTEGER CcIdleDelay;
 
+//
+// Counters
+//
+extern ULONG CcLazyWritePages;
+extern ULONG CcLazyWriteIos;
+extern ULONG CcMapDataWait;
+extern ULONG CcMapDataNoWait;
+extern ULONG CcPinReadWait;
+extern ULONG CcPinReadNoWait;
+extern ULONG CcPinMappedDataCount;
+extern ULONG CcDataPages;
+extern ULONG CcDataFlushes;
+
 typedef struct _PF_SCENARIO_ID
 {
     WCHAR ScenName[30];
@@ -155,25 +169,36 @@ typedef struct _PFSN_PREFETCHER_GLOBALS
 
 typedef struct _ROS_SHARED_CACHE_MAP
 {
-    LIST_ENTRY CacheMapVacbListHead;
-    ULONG TimeStamp;
-    PFILE_OBJECT FileObject;
-    LARGE_INTEGER SectionSize;
+    CSHORT NodeTypeCode;
+    CSHORT NodeByteSize;
+    ULONG OpenCount;
     LARGE_INTEGER FileSize;
-    BOOLEAN PinAccess;
+    LIST_ENTRY BcbList;
+    LARGE_INTEGER SectionSize;
+    PFILE_OBJECT FileObject;
+    ULONG DirtyPages;
+    LIST_ENTRY SharedCacheMapLinks;
+    ULONG Flags;
     PCACHE_MANAGER_CALLBACKS Callbacks;
     PVOID LazyWriteContext;
     LIST_ENTRY PrivateList;
-    KSPIN_LOCK CacheMapLock;
-    ULONG OpenCount;
-    ULONG DirtyPages;
-    LIST_ENTRY SharedCacheMapLinks;
     ULONG DirtyPageThreshold;
+    KSPIN_LOCK BcbSpinLock;
+    PRIVATE_CACHE_MAP PrivateCacheMap;
+
+    /* ROS specific */
+    LIST_ENTRY CacheMapVacbListHead;
+    ULONG TimeStamp;
+    BOOLEAN PinAccess;
+    KSPIN_LOCK CacheMapLock;
 #if DBG
     BOOLEAN Trace; /* enable extra trace output for this cache map and it's VACBs */
 #endif
 } ROS_SHARED_CACHE_MAP, *PROS_SHARED_CACHE_MAP;
 
+#define READAHEAD_DISABLED 0x1
+#define WRITEBEHIND_DISABLED 0x2
+
 typedef struct _ROS_VACB
 {
     /* Base address of the region where the view's data is mapped. */
@@ -195,13 +220,8 @@ typedef struct _ROS_VACB
     LIST_ENTRY VacbLruListEntry;
     /* Offset in the file which this view maps. */
     LARGE_INTEGER FileOffset;
-    /* Mutex */
-    KMUTEX Mutex;
     /* Number of references. */
-    ULONG ReferenceCount;
-    /* How many times was it pinned? */
-    _Guarded_by_(Mutex)
-    LONG PinCount;
+    volatile ULONG ReferenceCount;
     /* Pointer to the shared cache map for the file which this view maps data for. */
     PROS_SHARED_CACHE_MAP SharedCacheMap;
     /* Pointer to the next VACB in a chain. */
@@ -214,8 +234,9 @@ typedef struct _INTERNAL_BCB
     PUBLIC_BCB PFCB;
     PROS_VACB Vacb;
     BOOLEAN Dirty;
-    BOOLEAN Pinned;
+    ULONG PinCount;
     CSHORT RefCount; /* (At offset 0x34 on WinNT4) */
+    LIST_ENTRY BcbEntry;
 } INTERNAL_BCB, *PINTERNAL_BCB;
 
 typedef struct _LAZY_WRITER
@@ -253,10 +274,19 @@ typedef struct _WORK_QUEUE_ENTRY
     unsigned char Function;
 } WORK_QUEUE_ENTRY, *PWORK_QUEUE_ENTRY;
 
+typedef enum _WORK_QUEUE_FUNCTIONS
+{
+    ReadAhead = 1,
+    WriteBehind = 2,
+    LazyWrite = 3,
+    SetDone = 4,
+} WORK_QUEUE_FUNCTIONS, *PWORK_QUEUE_FUNCTIONS;
+
 extern LAZY_WRITER LazyWriter;
 
 #define NODE_TYPE_DEFERRED_WRITE 0x02FC
 #define NODE_TYPE_PRIVATE_MAP    0x02FE
+#define NODE_TYPE_SHARED_MAP     0x02FF
 
 VOID
 NTAPI
@@ -430,28 +460,18 @@ CcScheduleLazyWriteScan(BOOLEAN NoDelay);
 VOID
 CcPostDeferredWrites(VOID);
 
-FORCEINLINE
-NTSTATUS
-CcRosAcquireVacbLock(
-    _Inout_ PROS_VACB Vacb,
-    _In_ PLARGE_INTEGER Timeout)
-{
-    NTSTATUS Status;
-    Status = KeWaitForSingleObject(&Vacb->Mutex,
-                                   Executive,
-                                   KernelMode,
-                                   FALSE,
-                                   Timeout);
-    return Status;
-}
+VOID
+CcPostWorkQueue(
+    IN PWORK_QUEUE_ENTRY WorkItem,
+    IN PLIST_ENTRY WorkQueue);
 
-FORCEINLINE
 VOID
-CcRosReleaseVacbLock(
-    _Inout_ PROS_VACB Vacb)
-{
-    KeReleaseMutex(&Vacb->Mutex, FALSE);
-}
+CcPerformReadAhead(
+    IN PFILE_OBJECT FileObject);
+
+NTSTATUS
+CcRosInternalFreeVacb(
+    IN PROS_VACB Vacb);
 
 FORCEINLINE
 BOOLEAN
@@ -479,3 +499,45 @@ IsPointInRange(
 }
 
 #define CcBugCheck(A, B, C) KeBugCheckEx(CACHE_MANAGER, BugCheckFileId | ((ULONG)(__LINE__)), A, B, C)
+
+#if DBG
+#define CcRosVacbIncRefCount(vacb) CcRosVacbIncRefCount_(vacb,__FILE__,__LINE__)
+#define CcRosVacbDecRefCount(vacb) CcRosVacbDecRefCount_(vacb,__FILE__,__LINE__)
+#define CcRosVacbGetRefCount(vacb) CcRosVacbGetRefCount_(vacb,__FILE__,__LINE__)
+
+ULONG
+CcRosVacbIncRefCount_(
+    PROS_VACB vacb,
+    PCSTR file,
+    INT line);
+
+ULONG
+CcRosVacbDecRefCount_(
+    PROS_VACB vacb,
+    PCSTR file,
+    INT line);
+
+ULONG
+CcRosVacbGetRefCount_(
+    PROS_VACB vacb,
+    PCSTR file,
+    INT line);
+
+#else
+#define CcRosVacbIncRefCount(vacb) InterlockedIncrement((PLONG)&(vacb)->ReferenceCount)
+FORCEINLINE
+ULONG
+CcRosVacbDecRefCount(
+    PROS_VACB vacb)
+{
+    ULONG Refs;
+
+    Refs = InterlockedDecrement((PLONG)&vacb->ReferenceCount);
+    if (Refs == 0)
+    {
+        CcRosInternalFreeVacb(vacb);
+    }
+    return Refs;
+}
+#define CcRosVacbGetRefCount(vacb) InterlockedCompareExchange((PLONG)&(vacb)->ReferenceCount, 0, 0)
+#endif