mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-23 08:53:01 -05:00
sys: request work item refactoring
This commit is contained in:
parent
9d176643c3
commit
5a83c68f56
@ -699,6 +699,9 @@ enum
|
|||||||
#define FspIopCompleteIrp(I, R) FspIopCompleteIrpEx(I, R, TRUE)
|
#define FspIopCompleteIrp(I, R) FspIopCompleteIrpEx(I, R, TRUE)
|
||||||
#define REQ_ALIGN_SIZE 16
|
#define REQ_ALIGN_SIZE 16
|
||||||
typedef VOID FSP_IOP_REQUEST_FINI(FSP_FSCTL_TRANSACT_REQ *Request, PVOID Context[4]);
|
typedef VOID FSP_IOP_REQUEST_FINI(FSP_FSCTL_TRANSACT_REQ *Request, PVOID Context[4]);
|
||||||
|
typedef NTSTATUS FSP_IOP_REQUEST_WORK(
|
||||||
|
PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp,
|
||||||
|
BOOLEAN CanWait);
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
FSP_IOP_REQUEST_FINI *RequestFini;
|
FSP_IOP_REQUEST_FINI *RequestFini;
|
||||||
@ -745,11 +748,8 @@ enum
|
|||||||
{
|
{
|
||||||
FspWqRequestWorkRoutine = 3,
|
FspWqRequestWorkRoutine = 3,
|
||||||
};
|
};
|
||||||
typedef NTSTATUS FSP_WQ_REQUEST_WORK(
|
|
||||||
PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp,
|
|
||||||
BOOLEAN CanWait);
|
|
||||||
NTSTATUS FspWqCreateAndPostIrpWorkItem(PIRP Irp,
|
NTSTATUS FspWqCreateAndPostIrpWorkItem(PIRP Irp,
|
||||||
FSP_WQ_REQUEST_WORK *WorkRoutine, FSP_IOP_REQUEST_FINI *RequestFini,
|
FSP_IOP_REQUEST_WORK *WorkRoutine, FSP_IOP_REQUEST_FINI *RequestFini,
|
||||||
BOOLEAN CreateAndPost);
|
BOOLEAN CreateAndPost);
|
||||||
VOID FspWqPostIrpWorkItem(PIRP Irp);
|
VOID FspWqPostIrpWorkItem(PIRP Irp);
|
||||||
#define FspWqCreateIrpWorkItem(I, RW, RF)\
|
#define FspWqCreateIrpWorkItem(I, RW, RF)\
|
||||||
|
30
src/sys/wq.c
30
src/sys/wq.c
@ -20,12 +20,12 @@
|
|||||||
static VOID FspWqWorkRoutine(PVOID Context);
|
static VOID FspWqWorkRoutine(PVOID Context);
|
||||||
|
|
||||||
NTSTATUS FspWqCreateAndPostIrpWorkItem(PIRP Irp,
|
NTSTATUS FspWqCreateAndPostIrpWorkItem(PIRP Irp,
|
||||||
FSP_WQ_REQUEST_WORK *WorkRoutine, FSP_IOP_REQUEST_FINI *RequestFini,
|
FSP_IOP_REQUEST_WORK *WorkRoutine, FSP_IOP_REQUEST_FINI *RequestFini,
|
||||||
BOOLEAN CreateAndPost)
|
BOOLEAN CreateAndPost)
|
||||||
{
|
{
|
||||||
FSP_FSCTL_TRANSACT_REQ *RequestWorkItem = FspIrpRequest(Irp);
|
FSP_FSCTL_TRANSACT_REQ *Request = FspIrpRequest(Irp);
|
||||||
|
|
||||||
if (0 == RequestWorkItem)
|
if (0 == Request)
|
||||||
{
|
{
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
||||||
@ -43,15 +43,15 @@ NTSTATUS FspWqCreateAndPostIrpWorkItem(PIRP Irp,
|
|||||||
}
|
}
|
||||||
|
|
||||||
Result = FspIopCreateRequestWorkItem(Irp, sizeof(WORK_QUEUE_ITEM),
|
Result = FspIopCreateRequestWorkItem(Irp, sizeof(WORK_QUEUE_ITEM),
|
||||||
RequestFini, &RequestWorkItem);
|
RequestFini, &Request);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
return Result;
|
return Result;
|
||||||
|
|
||||||
ASSERT(sizeof(FSP_WQ_REQUEST_WORK *) == sizeof(PVOID));
|
ASSERT(sizeof(FSP_IOP_REQUEST_WORK *) == sizeof(PVOID));
|
||||||
|
|
||||||
FspIopRequestContext(RequestWorkItem, FspWqRequestWorkRoutine) =
|
FspIopRequestContext(Request, FspWqRequestWorkRoutine) =
|
||||||
(PVOID)(UINT_PTR)WorkRoutine;
|
(PVOID)(UINT_PTR)WorkRoutine;
|
||||||
ExInitializeWorkItem((PWORK_QUEUE_ITEM)&RequestWorkItem->Buffer, FspWqWorkRoutine, Irp);
|
ExInitializeWorkItem((PWORK_QUEUE_ITEM)&Request->Buffer, FspWqWorkRoutine, Irp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!CreateAndPost)
|
if (!CreateAndPost)
|
||||||
@ -63,14 +63,14 @@ NTSTATUS FspWqCreateAndPostIrpWorkItem(PIRP Irp,
|
|||||||
|
|
||||||
VOID FspWqPostIrpWorkItem(PIRP Irp)
|
VOID FspWqPostIrpWorkItem(PIRP Irp)
|
||||||
{
|
{
|
||||||
FSP_FSCTL_TRANSACT_REQ *RequestWorkItem = FspIrpRequest(Irp);
|
FSP_FSCTL_TRANSACT_REQ *Request = FspIrpRequest(Irp);
|
||||||
|
|
||||||
ASSERT(RequestWorkItem->Kind == FspFsctlTransactReservedKind);
|
ASSERT(Request->Kind == FspFsctlTransactReservedKind);
|
||||||
ASSERT(RequestWorkItem->Size == sizeof *RequestWorkItem + sizeof(WORK_QUEUE_ITEM));
|
ASSERT(Request->Size == sizeof *Request + sizeof(WORK_QUEUE_ITEM));
|
||||||
ASSERT(RequestWorkItem->Hint == (UINT_PTR)Irp);
|
ASSERT(Request->Hint == (UINT_PTR)Irp);
|
||||||
|
|
||||||
IoMarkIrpPending(Irp);
|
IoMarkIrpPending(Irp);
|
||||||
ExQueueWorkItem((PWORK_QUEUE_ITEM)&RequestWorkItem->Buffer, CriticalWorkQueue);
|
ExQueueWorkItem((PWORK_QUEUE_ITEM)&Request->Buffer, CriticalWorkQueue);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VOID FspWqWorkRoutine(PVOID Context)
|
static VOID FspWqWorkRoutine(PVOID Context)
|
||||||
@ -78,9 +78,9 @@ static VOID FspWqWorkRoutine(PVOID Context)
|
|||||||
PIRP Irp = Context;
|
PIRP Irp = Context;
|
||||||
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
||||||
PDEVICE_OBJECT DeviceObject = IrpSp->DeviceObject;
|
PDEVICE_OBJECT DeviceObject = IrpSp->DeviceObject;
|
||||||
FSP_FSCTL_TRANSACT_REQ *RequestWorkItem = FspIrpRequest(Irp);
|
FSP_FSCTL_TRANSACT_REQ *Request = FspIrpRequest(Irp);
|
||||||
FSP_WQ_REQUEST_WORK *WorkRoutine = (FSP_WQ_REQUEST_WORK *)(UINT_PTR)
|
FSP_IOP_REQUEST_WORK *WorkRoutine = (FSP_IOP_REQUEST_WORK *)(UINT_PTR)
|
||||||
FspIopRequestContext(RequestWorkItem, FspWqRequestWorkRoutine);
|
FspIopRequestContext(Request, FspWqRequestWorkRoutine);
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
|
|
||||||
IoSetTopLevelIrp(Irp);
|
IoSetTopLevelIrp(Irp);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user