2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/cc/view.c
5 * PURPOSE: Cache manager
6 * PROGRAMMER: David Welch (welch@mcmail.com)
11 /* INCLUDES *****************************************************************/
13 #include <ddk/ntddk.h>
14 #include <ddk/ntifs.h>
15 #include <internal/mm.h>
18 #include <internal/debug.h>
20 /* TYPES *********************************************************************/
22 #define CACHE_SEGMENT_SIZE (0x1000)
24 typedef struct _CACHE_SEGMENT
27 PMEMORY_AREA MemoryArea
;
33 } CACHE_SEGMENT
, *PCACHE_SEGMENT
;
35 /* FUNCTIONS *****************************************************************/
37 NTSTATUS
CcRequestCachePage(PBCB Bcb
,
43 PLIST_ENTRY current_entry
;
44 PCACHE_SEGMENT current
;
46 DPRINT("CcRequestCachePage(Bcb %x, FileOffset %x)\n");
48 KeAcquireSpinLock(&Bcb
->BcbLock
, &oldirql
);
50 current_entry
= Bcb
->CacheSegmentListHead
.Flink
;
51 while (current_entry
!= &Bcb
->CacheSegmentListHead
)
53 current
= CONTAINING_RECORD(current_entry
, CACHE_SEGMENT
, ListEntry
);
54 if (current
->FileOffset
== PAGE_ROUND_DOWN(FileOffset
))
56 current
->ReferenceCount
++;
57 KeReleaseSpinLock(&Bcb
->BcbLock
, oldirql
);
58 KeWaitForSingleObject(¤t
->Lock
,
63 *UptoDate
= current
->Valid
;
64 BaseAddress
= current
->BaseAddress
;
65 return(STATUS_SUCCESS
);
67 current_entry
= current_entry
->Flink
;
70 current
= ExAllocatePool(NonPagedPool
, sizeof(CACHE_SEGMENT
));
71 current
->BaseAddress
= NULL
;
72 MmCreateMemoryArea(KernelMode
,
73 PsGetCurrentProcess(),
74 MEMORY_AREA_CACHE_SEGMENT
,
75 ¤t
->BaseAddress
,
78 ¤t
->MemoryArea
);
79 current
->Valid
= FALSE
;
80 current
->FileOffset
= PAGE_ROUND_DOWN(FileOffset
);
81 KeInitializeEvent(¤t
->Lock
, SynchronizationEvent
, TRUE
);
82 current
->ReferenceCount
= 1;
83 InsertTailList(&Bcb
->CacheSegmentListHead
, ¤t
->ListEntry
);
84 *UptoDate
= current
->Valid
;
85 *BaseAddress
= current
->BaseAddress
;
86 MmSetPage(PsGetCurrentProcess(),
91 KeReleaseSpinLock(&Bcb
->BcbLock
, oldirql
);
93 return(STATUS_SUCCESS
);
96 NTSTATUS
CcInitializeFileCache(PFILE_OBJECT FileObject
,
99 DPRINT("CcInitializeFileCache(FileObject %x)\n",FileObject
);
101 (*Bcb
) = ExAllocatePool(NonPagedPool
, sizeof(BCB
));
104 return(STATUS_UNSUCCESSFUL
);
107 (*Bcb
)->FileObject
= FileObject
;
108 InitializeListHead(&(*Bcb
)->CacheSegmentListHead
);
109 KeInitializeSpinLock(&(*Bcb
)->BcbLock
);
111 DPRINT("Finished CcInitializeFileCache() = %x\n", *Bcb
);
113 return(STATUS_SUCCESS
);