Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygencircularbuffer.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: Serial port driver 00004 * FILE: drivers/dd/serial/circularbuffer.c 00005 * PURPOSE: Operations on a circular buffer 00006 * 00007 * PROGRAMMERS: Hervé Poussineau (hpoussin@reactos.org) 00008 */ 00009 00010 #include "serial.h" 00011 00012 NTSTATUS 00013 InitializeCircularBuffer( 00014 IN PCIRCULAR_BUFFER pBuffer, 00015 IN ULONG BufferSize) 00016 { 00017 TRACE_(SERIAL, "InitializeCircularBuffer(pBuffer %p, BufferSize %lu)\n", pBuffer, BufferSize); 00018 ASSERT(pBuffer); 00019 pBuffer->Buffer = (PUCHAR)ExAllocatePoolWithTag(NonPagedPool, BufferSize * sizeof(UCHAR), SERIAL_TAG); 00020 if (!pBuffer->Buffer) 00021 return STATUS_INSUFFICIENT_RESOURCES; 00022 pBuffer->Length = BufferSize; 00023 pBuffer->ReadPosition = pBuffer->WritePosition = 0; 00024 return STATUS_SUCCESS; 00025 } 00026 00027 NTSTATUS 00028 FreeCircularBuffer( 00029 IN PCIRCULAR_BUFFER pBuffer) 00030 { 00031 TRACE_(SERIAL, "FreeCircularBuffer(pBuffer %p)\n", pBuffer); 00032 ASSERT(pBuffer); 00033 if (pBuffer->Buffer != NULL) 00034 ExFreePoolWithTag(pBuffer->Buffer, SERIAL_TAG); 00035 return STATUS_SUCCESS; 00036 } 00037 00038 BOOLEAN 00039 IsCircularBufferEmpty( 00040 IN PCIRCULAR_BUFFER pBuffer) 00041 { 00042 TRACE_(SERIAL, "IsCircularBufferEmpty(pBuffer %p)\n", pBuffer); 00043 ASSERT(pBuffer); 00044 return (pBuffer->ReadPosition == pBuffer->WritePosition); 00045 } 00046 00047 ULONG 00048 GetNumberOfElementsInCircularBuffer( 00049 IN PCIRCULAR_BUFFER pBuffer) 00050 { 00051 TRACE_(SERIAL, "GetNumberOfElementsInCircularBuffer(pBuffer %p)\n", pBuffer); 00052 ASSERT(pBuffer); 00053 return (pBuffer->WritePosition + pBuffer->Length - pBuffer->ReadPosition) % pBuffer->Length; 00054 } 00055 00056 NTSTATUS 00057 PushCircularBufferEntry( 00058 IN PCIRCULAR_BUFFER pBuffer, 00059 IN UCHAR Entry) 00060 { 00061 ULONG NextPosition; 00062 TRACE_(SERIAL, "PushCircularBufferEntry(pBuffer %p, Entry 0x%x)\n", pBuffer, Entry); 00063 ASSERT(pBuffer); 00064 ASSERT(pBuffer->Length); 00065 NextPosition = (pBuffer->WritePosition + 1) % pBuffer->Length; 00066 if (NextPosition == pBuffer->ReadPosition) 00067 return STATUS_BUFFER_TOO_SMALL; 00068 pBuffer->Buffer[pBuffer->WritePosition] = Entry; 00069 pBuffer->WritePosition = NextPosition; 00070 return STATUS_SUCCESS; 00071 } 00072 00073 NTSTATUS 00074 PopCircularBufferEntry( 00075 IN PCIRCULAR_BUFFER pBuffer, 00076 OUT PUCHAR Entry) 00077 { 00078 TRACE_(SERIAL, "PopCircularBufferEntry(pBuffer %p)\n", pBuffer); 00079 ASSERT(pBuffer); 00080 ASSERT(pBuffer->Length); 00081 if (IsCircularBufferEmpty(pBuffer)) 00082 return STATUS_ARRAY_BOUNDS_EXCEEDED; 00083 *Entry = pBuffer->Buffer[pBuffer->ReadPosition]; 00084 pBuffer->ReadPosition = (pBuffer->ReadPosition + 1) % pBuffer->Length; 00085 return STATUS_SUCCESS; 00086 } 00087 00088 NTSTATUS 00089 IncreaseCircularBufferSize( 00090 IN PCIRCULAR_BUFFER pBuffer, 00091 IN ULONG NewBufferSize) 00092 { 00093 PUCHAR NewBuffer; 00094 00095 TRACE_(SERIAL, "IncreaseCircularBufferSize(pBuffer %p, NewBufferSize %lu)\n", pBuffer, NewBufferSize); 00096 ASSERT(pBuffer); 00097 ASSERT(pBuffer->Length); 00098 if (pBuffer->Length > NewBufferSize) 00099 return STATUS_INVALID_PARAMETER; 00100 else if (pBuffer->Length == NewBufferSize) 00101 return STATUS_SUCCESS; 00102 00103 NewBuffer = (PUCHAR)ExAllocatePoolWithTag(NonPagedPool, NewBufferSize * sizeof(UCHAR), SERIAL_TAG); 00104 if (!NewBuffer) 00105 return STATUS_INSUFFICIENT_RESOURCES; 00106 RtlCopyMemory(NewBuffer, pBuffer->Buffer, pBuffer->Length * sizeof(UCHAR)); 00107 ExFreePoolWithTag(pBuffer->Buffer, SERIAL_TAG); 00108 pBuffer->Buffer = NewBuffer; 00109 pBuffer->Length = NewBufferSize; 00110 return STATUS_SUCCESS; 00111 } Generated on Fri May 25 2012 04:26:32 for ReactOS by
1.7.6.1
|