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.
|
|
/*++
Copyright (C) Microsoft Corporation, 1993 - 1998
Module Name:
queue.c
Abstract:
Creates a simple Queue that works in Kernel Mode.
Author:
Robbie Harris (Hewlett-Packard) 22-May-1998
Environment:
Kernel mode
Revision History :
--*/ #include "pch.h"
void Queue_Create(Queue *pQueue, int size) { if( !pQueue ) { DD(NULL,DDE,"Queue_Create: Queue is Bad"); return; }
if (pQueue->theArray) { Queue_Delete(pQueue); } pQueue->theArray = (UCHAR *)ExAllocatePool(NonPagedPool, size); pQueue->max = size; pQueue->head = pQueue->tail = 0; }
BOOLEAN Queue_Delete(Queue *pQueue) { if( !pQueue ) { return FALSE; }
if( pQueue->theArray ) { ExFreePool(pQueue->theArray); pQueue->theArray = NULL; } pQueue->head = 0; pQueue->tail = 0; pQueue->max = 0; return TRUE; }
BOOLEAN Queue_Dequeue(Queue *pQueue, PUCHAR data) { // Validity of pQueue is checked in Queue_IsEmpty proc.
if( Queue_IsEmpty( pQueue ) ) { DD(NULL,DDE,"Queue_Dequeue: Queue is Empty"); return FALSE; }
*data = pQueue->theArray[pQueue->head++]; return TRUE; }
BOOLEAN Queue_Enqueue(Queue *pQueue, UCHAR data) { // Validity of pQueue is checked in Queue_IsFull proc.
if( Queue_IsFull( pQueue ) ) { DD(NULL,DDE,"Queue_Enqueue: Queue is full. Data is lost"); return FALSE; } else { pQueue->theArray[pQueue->tail++] = data; }
return TRUE; }
// Return TRUE if we were able to free some space in the Queue
BOOLEAN Queue_GarbageCollect(Queue *pQueue) { int iListSize; int i;
if (!pQueue) { DD(NULL,DDE,"Queue_GarbageCollect: Queue is Bad"); return FALSE; }
iListSize = pQueue->tail - pQueue->head;
// Check to see if there is any free entries
if (pQueue->head == 0 && pQueue->tail == pQueue->max) return FALSE; for (i = 0; i < iListSize; i++) { pQueue->theArray[i] = pQueue->theArray[pQueue->head+i]; }
pQueue->head = 0; pQueue->tail = iListSize;
return TRUE; }
//============================================================================
// NAME: HPKQueue::IsEmpty()
//
// PARAMETERS: None
//
// RETURNS: True is Queue is empty or doesn't exist. Otherwise False.
//
//============================================================================
BOOLEAN Queue_IsEmpty(Queue *pQueue) { if (!pQueue) { DD(NULL,DDE,"Queue_IsEmpty: Queue is Bad"); return TRUE; }
if (pQueue->theArray) { return (BOOLEAN)(pQueue->head == pQueue->tail); } DD(NULL,DDE,"Queue_IsEmpty: Queue->theArray is Bad"); return TRUE; }
//============================================================================
// NAME: HPKQueue::IsFull()
//
// PARAMETERS: None
//
// RETURNS: True is Queue is full or doesn't exist. Otherwise False.
//
//============================================================================
BOOLEAN Queue_IsFull(Queue *pQueue) { if( !pQueue ) { DD(NULL,DDE,"Queue_IsFull: Queue is Bad"); return TRUE; }
if( pQueue->theArray ) { if( pQueue->tail == pQueue->max ) { return !Queue_GarbageCollect(pQueue); } else { return FALSE; } } DD(NULL,DDE,"Queue_IsFull: Queue->theArray is Bad"); return TRUE; }
|