[RDBSS]
[reactos.git] / reactos / sdk / include / ddk / scavengr.h
1 #ifndef _SCAVENGR_H_
2 #define _SCAVENGR_H_
3
4 extern KMUTEX RxScavengerMutex;
5
6 #define RX_SCAVENGER_FINALIZATION_TIME_INTERVAL (10 * 1000 * 1000 * 10)
7
8 typedef struct _RX_SCAVENGER_ENTRY
9 {
10 LIST_ENTRY List;
11 UCHAR Type;
12 UCHAR Operation;
13 UCHAR State;
14 UCHAR Flags;
15 struct _RX_SCAVENGER_ENTRY *pContinuationEntry;
16 } RX_SCAVENGER_ENTRY, *PRX_SCAVENGER_ENTRY;
17
18 #define RxInitializeScavengerEntry(ScavengerEntry) \
19 (ScavengerEntry)->State = 0; \
20 (ScavengerEntry)->Flags = 0; \
21 (ScavengerEntry)->Type = 0; \
22 (ScavengerEntry)->Operation = 0; \
23 InitializeListHead(&(ScavengerEntry)->List); \
24 (ScavengerEntry)->pContinuationEntry = NULL
25
26 #define RxAcquireScavengerMutex() KeWaitForSingleObject(&RxScavengerMutex, Executive, KernelMode, FALSE, NULL)
27 #define RxReleaseScavengerMutex() KeReleaseMutex(&RxScavengerMutex, FALSE)
28
29 VOID
30 RxMarkFobxOnCleanup(
31 _In_ PFOBX pFobx,
32 _Out_ PBOOLEAN NeedPurge);
33
34 VOID
35 RxMarkFobxOnClose(
36 _In_ PFOBX Fobx);
37
38 typedef enum _RDBSS_SCAVENGER_STATE
39 {
40 RDBSS_SCAVENGER_INACTIVE,
41 RDBSS_SCAVENGER_DORMANT,
42 RDBSS_SCAVENGER_ACTIVE,
43 RDBSS_SCAVENGER_SUSPENDED
44 } RDBSS_SCAVENGER_STATE, *PRDBSS_SCAVENGER_STATE;
45
46 typedef struct _RDBSS_SCAVENGER
47 {
48 RDBSS_SCAVENGER_STATE State;
49 LONG MaximumNumberOfDormantFiles;
50 volatile LONG NumberOfDormantFiles;
51 LARGE_INTEGER TimeLimit;
52 ULONG SrvCallsToBeFinalized;
53 ULONG NetRootsToBeFinalized;
54 ULONG VNetRootsToBeFinalized;
55 ULONG FcbsToBeFinalized;
56 ULONG SrvOpensToBeFinalized;
57 ULONG FobxsToBeFinalized;
58 LIST_ENTRY SrvCallFinalizationList;
59 LIST_ENTRY NetRootFinalizationList;
60 LIST_ENTRY VNetRootFinalizationList;
61 LIST_ENTRY FcbFinalizationList;
62 LIST_ENTRY SrvOpenFinalizationList;
63 LIST_ENTRY FobxFinalizationList;
64 LIST_ENTRY ClosePendingFobxsList;
65 RX_WORK_ITEM WorkItem;
66 KEVENT SyncEvent;
67 KEVENT ScavengeEvent;
68 PETHREAD CurrentScavengerThread;
69 PNET_ROOT CurrentNetRootForClosePendingProcessing;
70 PFCB CurrentFcbForClosePendingProcessing;
71 KEVENT ClosePendingProcessingSyncEvent;
72 } RDBSS_SCAVENGER, *PRDBSS_SCAVENGER;
73
74 #define RxInitializeRdbssScavenger(Scavenger, ScavengerTimeLimit) \
75 (Scavenger)->State = RDBSS_SCAVENGER_INACTIVE; \
76 (Scavenger)->SrvCallsToBeFinalized = 0; \
77 (Scavenger)->NetRootsToBeFinalized = 0; \
78 (Scavenger)->VNetRootsToBeFinalized = 0; \
79 (Scavenger)->FcbsToBeFinalized = 0; \
80 (Scavenger)->SrvOpensToBeFinalized = 0; \
81 (Scavenger)->FobxsToBeFinalized = 0; \
82 (Scavenger)->NumberOfDormantFiles = 0; \
83 (Scavenger)->MaximumNumberOfDormantFiles = 50; \
84 (Scavenger)->CurrentFcbForClosePendingProcessing = NULL; \
85 (Scavenger)->CurrentNetRootForClosePendingProcessing = NULL; \
86 if ((ScavengerTimeLimit).QuadPart == 0) \
87 { \
88 (Scavenger)->TimeLimit.QuadPart = RX_SCAVENGER_FINALIZATION_TIME_INTERVAL; \
89 } \
90 else \
91 { \
92 (Scavenger)->TimeLimit.QuadPart = (ScavengerTimeLimit).QuadPart; \
93 } \
94 KeInitializeEvent(&((Scavenger)->SyncEvent), NotificationEvent, FALSE); \
95 KeInitializeEvent(&((Scavenger)->ScavengeEvent), SynchronizationEvent, TRUE); \
96 KeInitializeEvent(&((Scavenger)->ClosePendingProcessingSyncEvent), NotificationEvent, FALSE); \
97 InitializeListHead(&(Scavenger)->SrvCallFinalizationList); \
98 InitializeListHead(&(Scavenger)->NetRootFinalizationList); \
99 InitializeListHead(&(Scavenger)->VNetRootFinalizationList); \
100 InitializeListHead(&(Scavenger)->SrvOpenFinalizationList); \
101 InitializeListHead(&(Scavenger)->FcbFinalizationList); \
102 InitializeListHead(&(Scavenger)->FobxFinalizationList); \
103 InitializeListHead(&(Scavenger)->ClosePendingFobxsList)
104
105 typedef struct _PURGE_SYNCHRONIZATION_CONTEXT
106 {
107 LIST_ENTRY ContextsAwaitingPurgeCompletion;
108 BOOLEAN PurgeInProgress;
109 } PURGE_SYNCHRONIZATION_CONTEXT, *PPURGE_SYNCHRONIZATION_CONTEXT;
110
111 VOID
112 RxInitializePurgeSyncronizationContext(
113 _In_ PPURGE_SYNCHRONIZATION_CONTEXT PurgeSyncronizationContext);
114
115 BOOLEAN
116 RxScavengeRelatedFobxs(
117 _In_ PFCB Fcb);
118
119 VOID
120 RxpMarkInstanceForScavengedFinalization(
121 PVOID Instance);
122
123 VOID
124 RxpUndoScavengerFinalizationMarking(
125 _In_ PVOID Instance);
126
127 BOOLEAN
128 RxScavengeVNetRoots(
129 _In_ PRDBSS_DEVICE_OBJECT RxDeviceObject);
130
131 #if (_WIN32_WINNT >= 0x0600)
132 VOID
133 RxSynchronizeWithScavenger(
134 _In_ PRX_CONTEXT RxContext,
135 _In_ PFCB Fcb);
136 #else
137 VOID
138 RxSynchronizeWithScavenger(
139 _In_ PRX_CONTEXT RxContext);
140 #endif
141
142 #endif