mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
202 lines
3.2 KiB
202 lines
3.2 KiB
/*++
|
|
|
|
Copyright (c) 1998-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
pipeline.h
|
|
|
|
Abstract:
|
|
|
|
This module contains public declarations for the pipeline package.
|
|
|
|
Author:
|
|
|
|
Keith Moore (keithmo) 10-Jun-1998
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
|
|
#ifndef _PIPELINE_H_
|
|
#define _PIPELINE_H_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
//
|
|
// A simple lock used to serialize access to a pipeline queue. Use
|
|
// UlInterlockedCompareExchange() to see if you can acquire it.
|
|
//
|
|
|
|
typedef LONG UL_PIPELINE_QUEUE_LOCK;
|
|
|
|
#define L_LOCKED 0
|
|
#define L_UNLOCKED 1
|
|
|
|
|
|
//
|
|
// An ordinal used to identify a specific queue within a pipeline.
|
|
//
|
|
|
|
typedef SHORT UL_PIPELINE_QUEUE_ORDINAL, *PUL_PIPELINE_QUEUE_ORDINAL;
|
|
|
|
|
|
//
|
|
// A queueable work item.
|
|
//
|
|
|
|
typedef struct _UL_PIPELINE_WORK_ITEM // WorkItem
|
|
{
|
|
//
|
|
// Links onto the pipeline queue's work queue.
|
|
//
|
|
|
|
LIST_ENTRY WorkQueueEntry;
|
|
|
|
} UL_PIPELINE_WORK_ITEM, *PUL_PIPELINE_WORK_ITEM;
|
|
|
|
|
|
//
|
|
// Pointer to a queue handler. The handler is invoked for each queued
|
|
// work item.
|
|
//
|
|
|
|
typedef
|
|
VOID
|
|
(NTAPI * PFN_UL_PIPELINE_HANDLER)(
|
|
IN PUL_PIPELINE_WORK_ITEM WorkItem
|
|
);
|
|
|
|
|
|
//
|
|
// A pipeline queue. Note that two queues will fit into a single cache line.
|
|
//
|
|
|
|
typedef struct _UL_PIPELINE_QUEUE // Queue
|
|
{
|
|
//
|
|
// The list of enqueued work items.
|
|
//
|
|
|
|
LIST_ENTRY WorkQueueHead;
|
|
|
|
//
|
|
// The lock protecting this queue.
|
|
//
|
|
|
|
UL_PIPELINE_QUEUE_LOCK QueueLock;
|
|
|
|
//
|
|
// Pointer to the handler for this queue.
|
|
//
|
|
|
|
PFN_UL_PIPELINE_HANDLER pHandler;
|
|
|
|
} UL_PIPELINE_QUEUE, *PUL_PIPELINE_QUEUE;
|
|
|
|
|
|
//
|
|
// A pipeline.
|
|
//
|
|
|
|
typedef struct _UL_PIPELINE // Pipeline
|
|
{
|
|
//
|
|
// The spinlock protecting this pipeline.
|
|
//
|
|
|
|
UL_SPIN_LOCK PipelineLock;
|
|
|
|
//
|
|
// The number of threads currently servicing queue requests.
|
|
//
|
|
|
|
SHORT ThreadsRunning;
|
|
|
|
//
|
|
// The number of queues with non-empty work queue lists.
|
|
//
|
|
|
|
SHORT QueuesWithWork;
|
|
|
|
//
|
|
// The maximum number of threads allowed to run simultaneously
|
|
// for this pipeline.
|
|
//
|
|
|
|
SHORT MaximumThreadsRunning;
|
|
|
|
//
|
|
// The number of queues in this pipeline.
|
|
//
|
|
|
|
SHORT QueueCount;
|
|
|
|
//
|
|
// Shutdown flag.
|
|
//
|
|
|
|
BOOLEAN ShutdownFlag;
|
|
BOOLEAN Spares[3];
|
|
|
|
//
|
|
// An event object signalled whenever there's work to be done. We take
|
|
// great pains to ensure this event is never signalled frivolously.
|
|
//
|
|
|
|
KEVENT WorkAvailableEvent;
|
|
|
|
//
|
|
// The actual queues go here.
|
|
//
|
|
|
|
UL_PIPELINE_QUEUE Queues[ANYSIZE_ARRAY];
|
|
|
|
//
|
|
// Additional opaque (pipeline package-specific) data may go here,
|
|
// but don't count on it.
|
|
//
|
|
|
|
} UL_PIPELINE, *PUL_PIPELINE;
|
|
|
|
|
|
//
|
|
// Public functions.
|
|
//
|
|
|
|
NTSTATUS
|
|
UlCreatePipeline(
|
|
OUT PUL_PIPELINE * ppPipeline,
|
|
IN SHORT QueueCount,
|
|
IN SHORT ThreadsPerCpu
|
|
);
|
|
|
|
VOID
|
|
UlInitializeQueuePipeline(
|
|
IN PUL_PIPELINE pPipeline,
|
|
IN UL_PIPELINE_QUEUE_ORDINAL QueueOrdinal,
|
|
IN PFN_UL_PIPELINE_HANDLER pHandler
|
|
);
|
|
|
|
NTSTATUS
|
|
UlDestroyPipeline(
|
|
IN PUL_PIPELINE pPipeline
|
|
);
|
|
|
|
VOID
|
|
UlQueueWorkPipeline(
|
|
IN PUL_PIPELINE pPipeline,
|
|
IN UL_PIPELINE_QUEUE_ORDINAL QueueOrdinal,
|
|
IN PUL_PIPELINE_WORK_ITEM pWorkItem
|
|
);
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}; // extern "C"
|
|
#endif
|
|
|
|
#endif // _PIPELINE_H_
|