mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-23 17:03:12 -05:00
sys: util: FSP_SYNCHRONOUS_WORK_ITEM
This commit is contained in:
parent
4a33885b01
commit
db1dc6fc91
@ -274,6 +274,18 @@ VOID FspFreeExternal(PVOID Pointer)
|
|||||||
/* utility: GUIDs */
|
/* utility: GUIDs */
|
||||||
NTSTATUS FspCreateGuid(GUID *Guid);
|
NTSTATUS FspCreateGuid(GUID *Guid);
|
||||||
|
|
||||||
|
/* utility: synchronous work queue */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
KEVENT Event;
|
||||||
|
PWORKER_THREAD_ROUTINE Routine;
|
||||||
|
PVOID Context;
|
||||||
|
WORK_QUEUE_ITEM WorkQueueItem;
|
||||||
|
} FSP_SYNCHRONOUS_WORK_ITEM;
|
||||||
|
VOID FspInitializeSynchronousWorkItem(FSP_SYNCHRONOUS_WORK_ITEM *SynchronousWorkItem,
|
||||||
|
PWORKER_THREAD_ROUTINE Routine, PVOID Context);
|
||||||
|
VOID FspExecuteSynchronousWorkItem(FSP_SYNCHRONOUS_WORK_ITEM *SynchronousWorkItem);
|
||||||
|
|
||||||
/* utility: delayed work queue */
|
/* utility: delayed work queue */
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -7,6 +7,10 @@
|
|||||||
#include <sys/driver.h>
|
#include <sys/driver.h>
|
||||||
|
|
||||||
NTSTATUS FspCreateGuid(GUID *Guid);
|
NTSTATUS FspCreateGuid(GUID *Guid);
|
||||||
|
VOID FspInitializeSynchronousWorkItem(FSP_SYNCHRONOUS_WORK_ITEM *SynchronousWorkItem,
|
||||||
|
PWORKER_THREAD_ROUTINE Routine, PVOID Context);
|
||||||
|
VOID FspExecuteSynchronousWorkItem(FSP_SYNCHRONOUS_WORK_ITEM *SynchronousWorkItem);
|
||||||
|
static WORKER_THREAD_ROUTINE FspExecuteSynchronousWorkItemRoutine;
|
||||||
VOID FspInitializeDelayedWorkItem(FSP_DELAYED_WORK_ITEM *DelayedWorkItem,
|
VOID FspInitializeDelayedWorkItem(FSP_DELAYED_WORK_ITEM *DelayedWorkItem,
|
||||||
PWORKER_THREAD_ROUTINE Routine, PVOID Context);
|
PWORKER_THREAD_ROUTINE Routine, PVOID Context);
|
||||||
VOID FspQueueDelayedWorkItem(FSP_DELAYED_WORK_ITEM *DelayedWorkItem, LARGE_INTEGER Delay);
|
VOID FspQueueDelayedWorkItem(FSP_DELAYED_WORK_ITEM *DelayedWorkItem, LARGE_INTEGER Delay);
|
||||||
@ -14,6 +18,9 @@ static KDEFERRED_ROUTINE FspQueueDelayedWorkItemDPC;
|
|||||||
|
|
||||||
#ifdef ALLOC_PRAGMA
|
#ifdef ALLOC_PRAGMA
|
||||||
#pragma alloc_text(PAGE, FspCreateGuid)
|
#pragma alloc_text(PAGE, FspCreateGuid)
|
||||||
|
#pragma alloc_text(PAGE, FspInitializeSynchronousWorkItem)
|
||||||
|
#pragma alloc_text(PAGE, FspExecuteSynchronousWorkItem)
|
||||||
|
#pragma alloc_text(PAGE, FspExecuteSynchronousWorkItemRoutine)
|
||||||
#pragma alloc_text(PAGE, FspInitializeDelayedWorkItem)
|
#pragma alloc_text(PAGE, FspInitializeDelayedWorkItem)
|
||||||
#pragma alloc_text(PAGE, FspQueueDelayedWorkItem)
|
#pragma alloc_text(PAGE, FspQueueDelayedWorkItem)
|
||||||
#endif
|
#endif
|
||||||
@ -33,6 +40,36 @@ NTSTATUS FspCreateGuid(GUID *Guid)
|
|||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VOID FspInitializeSynchronousWorkItem(FSP_SYNCHRONOUS_WORK_ITEM *SynchronousWorkItem,
|
||||||
|
PWORKER_THREAD_ROUTINE Routine, PVOID Context)
|
||||||
|
{
|
||||||
|
PAGED_CODE();
|
||||||
|
|
||||||
|
KeInitializeEvent(&SynchronousWorkItem->Event, NotificationEvent, FALSE);
|
||||||
|
SynchronousWorkItem->Routine = Routine;
|
||||||
|
SynchronousWorkItem->Context = Context;
|
||||||
|
ExInitializeWorkItem(&SynchronousWorkItem->WorkQueueItem,
|
||||||
|
FspExecuteSynchronousWorkItemRoutine, SynchronousWorkItem);
|
||||||
|
}
|
||||||
|
VOID FspExecuteSynchronousWorkItem(FSP_SYNCHRONOUS_WORK_ITEM *SynchronousWorkItem)
|
||||||
|
{
|
||||||
|
PAGED_CODE();
|
||||||
|
|
||||||
|
ExQueueWorkItem(&SynchronousWorkItem->WorkQueueItem, DelayedWorkQueue);
|
||||||
|
|
||||||
|
NTSTATUS Result;
|
||||||
|
Result = KeWaitForSingleObject(&SynchronousWorkItem->Event, Executive, KernelMode, FALSE, 0);
|
||||||
|
ASSERT(STATUS_SUCCESS == Result);
|
||||||
|
}
|
||||||
|
static VOID FspExecuteSynchronousWorkItemRoutine(PVOID Context)
|
||||||
|
{
|
||||||
|
PAGED_CODE();
|
||||||
|
|
||||||
|
FSP_SYNCHRONOUS_WORK_ITEM *SynchronousWorkItem = Context;
|
||||||
|
SynchronousWorkItem->Routine(SynchronousWorkItem->Context);
|
||||||
|
KeSetEvent(&SynchronousWorkItem->Event, 1, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
VOID FspInitializeDelayedWorkItem(FSP_DELAYED_WORK_ITEM *DelayedWorkItem,
|
VOID FspInitializeDelayedWorkItem(FSP_DELAYED_WORK_ITEM *DelayedWorkItem,
|
||||||
PWORKER_THREAD_ROUTINE Routine, PVOID Context)
|
PWORKER_THREAD_ROUTINE Routine, PVOID Context)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user