mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 00:25:41 +00:00
- Implement KsCreateAllocator, KsRegisterWorker, KsUnregisterWorker, KsRegisterCountedWorker, KsDecrementCountedWorker, KsIncrementCountedWorker, KsQueueWorkItem
svn path=/trunk/; revision=38115
This commit is contained in:
parent
4c0f9b5052
commit
7f7f904854
3 changed files with 146 additions and 24 deletions
|
@ -20,14 +20,13 @@ KsCreateAllocator(
|
|||
}
|
||||
|
||||
/*
|
||||
@unimplemented
|
||||
@implemented
|
||||
*/
|
||||
KSDDKAPI NTSTATUS NTAPI
|
||||
KsCreateDefaultAllocator(
|
||||
IN PIRP Irp)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
return KsCreateDefaultAllocatorEx(Irp, NULL, NULL, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -54,7 +53,14 @@ KsCreateDefaultAllocatorEx(
|
|||
IN PFNKSINITIALIZEALLOCATOR InitializeAllocator OPTIONAL,
|
||||
IN PFNKSDELETEALLOCATOR DeleteAllocator OPTIONAL)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
NTSTATUS Status;
|
||||
PKSALLOCATOR_FRAMING AllocatorFraming;
|
||||
|
||||
Status = KsValidateAllocatorCreateRequest(Irp, &AllocatorFraming);
|
||||
if (!NT_SUCCESS(Status))
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
|
||||
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
<include base="ks">../include</include>
|
||||
<importlibrary definition="ks.spec" />
|
||||
<library>ntoskrnl</library>
|
||||
<library>hal</library>
|
||||
<define name="BUILDING_KS" />
|
||||
<define name="_NTDDK_" />
|
||||
<define name="_COMDDK_" />
|
||||
|
|
|
@ -6,30 +6,87 @@
|
|||
#include <debug.h>
|
||||
#include <ks.h>
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
KEVENT Event;
|
||||
KSPIN_LOCK Lock;
|
||||
WORK_QUEUE_TYPE Type;
|
||||
LONG Counter;
|
||||
PWORK_QUEUE_ITEM WorkItem;
|
||||
ULONG WorkItemActive;
|
||||
ULONG DeleteInProgress;
|
||||
}KS_WORKER;
|
||||
|
||||
/*
|
||||
@unimplemented
|
||||
@implemented
|
||||
*/
|
||||
KSDDKAPI NTSTATUS NTAPI
|
||||
KSDDKAPI
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
KsRegisterWorker(
|
||||
IN WORK_QUEUE_TYPE WorkQueueType,
|
||||
OUT PKSWORKER* Worker)
|
||||
{
|
||||
KS_WORKER * KsWorker;
|
||||
UNIMPLEMENTED;
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
|
||||
if (WorkQueueType != CriticalWorkQueue &&
|
||||
WorkQueueType != DelayedWorkQueue &&
|
||||
WorkQueueType != HyperCriticalWorkQueue)
|
||||
{
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
KsWorker = ExAllocatePoolWithTag(NonPagedPool, sizeof(KS_WORKER), 0);
|
||||
if (!KsWorker)
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
|
||||
KsWorker->Type = WorkQueueType;
|
||||
KsWorker->Counter = 0;
|
||||
KsWorker->WorkItemActive = 0;
|
||||
KsWorker->WorkItem = NULL;
|
||||
KsWorker->DeleteInProgress = TRUE;
|
||||
KeInitializeSpinLock(&KsWorker->Lock);
|
||||
KeInitializeEvent(&KsWorker->Event, NotificationEvent, FALSE);
|
||||
|
||||
*Worker = KsWorker;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
@unimplemented
|
||||
@implemented
|
||||
*/
|
||||
KSDDKAPI VOID NTAPI
|
||||
KsUnregisterWorker(
|
||||
IN PKSWORKER Worker)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
KS_WORKER * KsWorker;
|
||||
KIRQL OldIrql;
|
||||
ULONG bWait = FALSE;
|
||||
|
||||
if (!Worker)
|
||||
return;
|
||||
|
||||
KsWorker = (KS_WORKER *)Worker;
|
||||
|
||||
KsWorker->DeleteInProgress = TRUE;
|
||||
|
||||
if (KsWorker->WorkItemActive)
|
||||
{
|
||||
KeReleaseSpinLock(&KsWorker->Lock, OldIrql);
|
||||
KeWaitForSingleObject(&KsWorker->Event, Executive, KernelMode, FALSE, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
KeReleaseSpinLock(&KsWorker->Lock, OldIrql);
|
||||
}
|
||||
|
||||
ExFreePoolWithTag(KsWorker, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
@unimplemented
|
||||
@implemented
|
||||
*/
|
||||
KSDDKAPI NTSTATUS NTAPI
|
||||
KsRegisterCountedWorker(
|
||||
|
@ -37,40 +94,98 @@ KsRegisterCountedWorker(
|
|||
IN PWORK_QUEUE_ITEM CountedWorkItem,
|
||||
OUT PKSWORKER* Worker)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
NTSTATUS Status;
|
||||
KS_WORKER * KsWorker;
|
||||
|
||||
Status = KsRegisterWorker(WorkQueueType, Worker);
|
||||
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
KsWorker = (KS_WORKER *)Worker;
|
||||
KsWorker->WorkItem = CountedWorkItem;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/*
|
||||
@unimplemented
|
||||
@implemented
|
||||
*/
|
||||
KSDDKAPI ULONG NTAPI
|
||||
KSDDKAPI
|
||||
ULONG
|
||||
NTAPI
|
||||
KsDecrementCountedWorker(
|
||||
IN PKSWORKER Worker)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return 0;
|
||||
KS_WORKER * KsWorker;
|
||||
LONG Counter;
|
||||
|
||||
if (!Worker)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
|
||||
KsWorker = (KS_WORKER *)Worker;
|
||||
Counter = InterlockedDecrement(&KsWorker->Counter);
|
||||
|
||||
if (KsWorker->DeleteInProgress)
|
||||
{
|
||||
/* signal that we are done */
|
||||
KeSetEvent(&KsWorker->Event, 0, 0);
|
||||
}
|
||||
|
||||
return Counter;
|
||||
}
|
||||
|
||||
/*
|
||||
@unimplemented
|
||||
@implemented
|
||||
*/
|
||||
KSDDKAPI ULONG NTAPI
|
||||
KSDDKAPI
|
||||
ULONG
|
||||
NTAPI
|
||||
KsIncrementCountedWorker(
|
||||
IN PKSWORKER Worker)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return 0;
|
||||
KS_WORKER * KsWorker;
|
||||
LONG Counter;
|
||||
|
||||
if (!Worker)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
|
||||
KsWorker = (KS_WORKER *)Worker;
|
||||
|
||||
Counter = InterlockedIncrement(&KsWorker->Counter);
|
||||
if (Counter == 1)
|
||||
{
|
||||
KsQueueWorkItem(Worker, KsWorker->WorkItem);
|
||||
}
|
||||
return Counter;
|
||||
}
|
||||
|
||||
/*
|
||||
@unimplemented
|
||||
@implemented
|
||||
*/
|
||||
KSDDKAPI NTSTATUS NTAPI
|
||||
KSDDKAPI
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
KsQueueWorkItem(
|
||||
IN PKSWORKER Worker,
|
||||
IN PWORK_QUEUE_ITEM WorkItem)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
KS_WORKER * KsWorker;
|
||||
KIRQL OldIrql;
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
|
||||
if (!Worker || !WorkItem)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
|
||||
KsWorker = (KS_WORKER *)Worker;
|
||||
KeAcquireSpinLock(&KsWorker->Lock, &OldIrql);
|
||||
|
||||
if (!KsWorker->DeleteInProgress)
|
||||
{
|
||||
ExQueueWorkItem(WorkItem, KsWorker->Type);
|
||||
Status = STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
KeReleaseSpinLock(&KsWorker->Lock, OldIrql);
|
||||
return Status;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue