mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 06:12:59 +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
|
KSDDKAPI NTSTATUS NTAPI
|
||||||
KsCreateDefaultAllocator(
|
KsCreateDefaultAllocator(
|
||||||
IN PIRP Irp)
|
IN PIRP Irp)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
return KsCreateDefaultAllocatorEx(Irp, NULL, NULL, NULL, NULL, NULL);
|
||||||
return STATUS_UNSUCCESSFUL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -54,7 +53,14 @@ KsCreateDefaultAllocatorEx(
|
||||||
IN PFNKSINITIALIZEALLOCATOR InitializeAllocator OPTIONAL,
|
IN PFNKSINITIALIZEALLOCATOR InitializeAllocator OPTIONAL,
|
||||||
IN PFNKSDELETEALLOCATOR DeleteAllocator 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;
|
return STATUS_UNSUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
<include base="ks">../include</include>
|
<include base="ks">../include</include>
|
||||||
<importlibrary definition="ks.spec" />
|
<importlibrary definition="ks.spec" />
|
||||||
<library>ntoskrnl</library>
|
<library>ntoskrnl</library>
|
||||||
|
<library>hal</library>
|
||||||
<define name="BUILDING_KS" />
|
<define name="BUILDING_KS" />
|
||||||
<define name="_NTDDK_" />
|
<define name="_NTDDK_" />
|
||||||
<define name="_COMDDK_" />
|
<define name="_COMDDK_" />
|
||||||
|
|
|
@ -6,30 +6,87 @@
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
#include <ks.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(
|
KsRegisterWorker(
|
||||||
IN WORK_QUEUE_TYPE WorkQueueType,
|
IN WORK_QUEUE_TYPE WorkQueueType,
|
||||||
OUT PKSWORKER* Worker)
|
OUT PKSWORKER* Worker)
|
||||||
{
|
{
|
||||||
|
KS_WORKER * KsWorker;
|
||||||
UNIMPLEMENTED;
|
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
|
KSDDKAPI VOID NTAPI
|
||||||
KsUnregisterWorker(
|
KsUnregisterWorker(
|
||||||
IN PKSWORKER Worker)
|
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
|
KSDDKAPI NTSTATUS NTAPI
|
||||||
KsRegisterCountedWorker(
|
KsRegisterCountedWorker(
|
||||||
|
@ -37,40 +94,98 @@ KsRegisterCountedWorker(
|
||||||
IN PWORK_QUEUE_ITEM CountedWorkItem,
|
IN PWORK_QUEUE_ITEM CountedWorkItem,
|
||||||
OUT PKSWORKER* Worker)
|
OUT PKSWORKER* Worker)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
NTSTATUS Status;
|
||||||
return STATUS_UNSUCCESSFUL;
|
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(
|
KsDecrementCountedWorker(
|
||||||
IN PKSWORKER Worker)
|
IN PKSWORKER Worker)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
KS_WORKER * KsWorker;
|
||||||
return 0;
|
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(
|
KsIncrementCountedWorker(
|
||||||
IN PKSWORKER Worker)
|
IN PKSWORKER Worker)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
KS_WORKER * KsWorker;
|
||||||
return 0;
|
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(
|
KsQueueWorkItem(
|
||||||
IN PKSWORKER Worker,
|
IN PKSWORKER Worker,
|
||||||
IN PWORK_QUEUE_ITEM WorkItem)
|
IN PWORK_QUEUE_ITEM WorkItem)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
KS_WORKER * KsWorker;
|
||||||
return STATUS_UNSUCCESSFUL;
|
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