[4/11]hidclass.sys: Implement a report ring buffer

Thomas Faber thomas.faber at reactos.org
Mon Jun 22 06:01:52 CDT 2015


On 2015-06-22 03:24, Aric Stewart wrote:
> --- /dev/null
> +++ b/dlls/hidclass.sys/buffer.c

> +VOID RingBuffer_SetSize(struct __ReportRingBuffer *buffer, INT size)
> +{
> +    ReportRingBuffer *ring = (ReportRingBuffer*)buffer;

This cast+assignment in every function seems unnecessary.


> +    BYTE* new_buffer;
> +
> +    if (size < 2 || size > 256 || size == ring->size)
> +        return;
> +
> +    EnterCriticalSection(&ring->lock);
> +    RingBuffer_Flush(buffer);
> +    new_buffer = HeapAlloc(GetProcessHeap(), 0, ring->buffer_size * size);
> +    HeapFree(GetProcessHeap(), 0, ring->buffer);
> +    ring->buffer = new_buffer;

This is missing ring->size = size;


> +    LeaveCriticalSection(&ring->lock);
> +}

> +void RingBuffer_Write(struct __ReportRingBuffer *buffer, LPVOID data)
> +{
> +    ReportRingBuffer *ring = (ReportRingBuffer*)buffer;
> +    int i;
> +
> +    EnterCriticalSection(&ring->lock);
> +    memcpy(&ring->buffer[ring->end * ring->buffer_size], data, ring->buffer_size);
> +    ring->end++;
> +    if (ring->end == ring->size)
> +        ring->end = 0;
> +    if (ring->start == ring->end)
> +    {
> +        ring->start++;
> +        if (ring->start == ring->size)
> +            ring->start = 0;
> +    }
> +    for (i = 0; i < ring->pointer_count; i++)
> +        if (ring->pointers[i] == ring->end)
> +            ring->pointers[i] = ring->start;

This loop can go inside the if unless I'm missing something.


> +    LeaveCriticalSection(&ring->lock);
> +}


I'm missing RingBuffer_RemovePointer, but I suppose that would be unused
anyway while FsContext is broken.



More information about the wine-devel mailing list