4 extern KMUTEX RxScavengerMutex
;
6 #define RX_SCAVENGER_FINALIZATION_TIME_INTERVAL (10 * 1000 * 1000 * 10)
8 typedef struct _RX_SCAVENGER_ENTRY
15 struct _RX_SCAVENGER_ENTRY
*pContinuationEntry
;
16 } RX_SCAVENGER_ENTRY
, *PRX_SCAVENGER_ENTRY
;
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
26 #define RxAcquireScavengerMutex() KeWaitForSingleObject(&RxScavengerMutex, Executive, KernelMode, FALSE, NULL)
27 #define RxReleaseScavengerMutex() KeReleaseMutex(&RxScavengerMutex, FALSE)
32 _Out_ PBOOLEAN NeedPurge
);
41 PRX_CONTEXT RxContext
,
42 BOOLEAN AttemptFinalization
,
45 #define DONT_ATTEMPT_FINALIZE_ON_PURGE FALSE
46 #define ATTEMPT_FINALIZE_ON_PURGE TRUE
48 typedef enum _RDBSS_SCAVENGER_STATE
50 RDBSS_SCAVENGER_INACTIVE
,
51 RDBSS_SCAVENGER_DORMANT
,
52 RDBSS_SCAVENGER_ACTIVE
,
53 RDBSS_SCAVENGER_SUSPENDED
54 } RDBSS_SCAVENGER_STATE
, *PRDBSS_SCAVENGER_STATE
;
56 typedef struct _RDBSS_SCAVENGER
58 RDBSS_SCAVENGER_STATE State
;
59 LONG MaximumNumberOfDormantFiles
;
60 volatile LONG NumberOfDormantFiles
;
61 LARGE_INTEGER TimeLimit
;
62 ULONG SrvCallsToBeFinalized
;
63 ULONG NetRootsToBeFinalized
;
64 ULONG VNetRootsToBeFinalized
;
65 ULONG FcbsToBeFinalized
;
66 ULONG SrvOpensToBeFinalized
;
67 ULONG FobxsToBeFinalized
;
68 LIST_ENTRY SrvCallFinalizationList
;
69 LIST_ENTRY NetRootFinalizationList
;
70 LIST_ENTRY VNetRootFinalizationList
;
71 LIST_ENTRY FcbFinalizationList
;
72 LIST_ENTRY SrvOpenFinalizationList
;
73 LIST_ENTRY FobxFinalizationList
;
74 LIST_ENTRY ClosePendingFobxsList
;
75 RX_WORK_ITEM WorkItem
;
78 PETHREAD CurrentScavengerThread
;
79 PNET_ROOT CurrentNetRootForClosePendingProcessing
;
80 PFCB CurrentFcbForClosePendingProcessing
;
81 KEVENT ClosePendingProcessingSyncEvent
;
82 } RDBSS_SCAVENGER
, *PRDBSS_SCAVENGER
;
84 #define RxInitializeRdbssScavenger(Scavenger, ScavengerTimeLimit) \
85 (Scavenger)->State = RDBSS_SCAVENGER_INACTIVE; \
86 (Scavenger)->SrvCallsToBeFinalized = 0; \
87 (Scavenger)->NetRootsToBeFinalized = 0; \
88 (Scavenger)->VNetRootsToBeFinalized = 0; \
89 (Scavenger)->FcbsToBeFinalized = 0; \
90 (Scavenger)->SrvOpensToBeFinalized = 0; \
91 (Scavenger)->FobxsToBeFinalized = 0; \
92 (Scavenger)->NumberOfDormantFiles = 0; \
93 (Scavenger)->MaximumNumberOfDormantFiles = 50; \
94 (Scavenger)->CurrentFcbForClosePendingProcessing = NULL; \
95 (Scavenger)->CurrentNetRootForClosePendingProcessing = NULL; \
96 if ((ScavengerTimeLimit).QuadPart == 0) \
98 (Scavenger)->TimeLimit.QuadPart = RX_SCAVENGER_FINALIZATION_TIME_INTERVAL; \
102 (Scavenger)->TimeLimit.QuadPart = (ScavengerTimeLimit).QuadPart; \
104 KeInitializeEvent(&((Scavenger)->SyncEvent), NotificationEvent, FALSE); \
105 KeInitializeEvent(&((Scavenger)->ScavengeEvent), SynchronizationEvent, TRUE); \
106 KeInitializeEvent(&((Scavenger)->ClosePendingProcessingSyncEvent), NotificationEvent, FALSE); \
107 InitializeListHead(&(Scavenger)->SrvCallFinalizationList); \
108 InitializeListHead(&(Scavenger)->NetRootFinalizationList); \
109 InitializeListHead(&(Scavenger)->VNetRootFinalizationList); \
110 InitializeListHead(&(Scavenger)->SrvOpenFinalizationList); \
111 InitializeListHead(&(Scavenger)->FcbFinalizationList); \
112 InitializeListHead(&(Scavenger)->FobxFinalizationList); \
113 InitializeListHead(&(Scavenger)->ClosePendingFobxsList)
115 typedef struct _PURGE_SYNCHRONIZATION_CONTEXT
117 LIST_ENTRY ContextsAwaitingPurgeCompletion
;
118 BOOLEAN PurgeInProgress
;
119 } PURGE_SYNCHRONIZATION_CONTEXT
, *PPURGE_SYNCHRONIZATION_CONTEXT
;
122 RxInitializePurgeSyncronizationContext(
123 _In_ PPURGE_SYNCHRONIZATION_CONTEXT PurgeSyncronizationContext
);
126 RxScavengeRelatedFobxs(
130 RxScavengeFobxsForNetRoot(
133 BOOLEAN SynchronizeWithScavenger
);
136 RxpMarkInstanceForScavengedFinalization(
140 RxpUndoScavengerFinalizationMarking(
141 _In_ PVOID Instance
);
145 _In_ PRDBSS_DEVICE_OBJECT RxDeviceObject
);
147 #if (_WIN32_WINNT >= 0x0600)
149 RxSynchronizeWithScavenger(
150 _In_ PRX_CONTEXT RxContext
,
154 RxSynchronizeWithScavenger(
155 _In_ PRX_CONTEXT RxContext
);