[4/11]hidclass.sys: Implement a report ring buffer
--- dlls/hidclass.sys/Makefile.in | 1 + dlls/hidclass.sys/buffer.c | 166 ++++++++++++++++++++++++++++++++++++++++++ dlls/hidclass.sys/hid.h | 13 ++++ 3 files changed, 180 insertions(+) create mode 100644 dlls/hidclass.sys/buffer.c
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.
participants (2)
-
Aric Stewart -
Thomas Faber