Source code of Windows XP (NT5)
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

/*++
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_