ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

circularbuffer.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.