[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