Skip to content

Commit 6dbfc1b

Browse files
committed
virtio_buffer: rework to get ride of read_tmp
Note: I stick to Arduino official definition: https://www.arduino.cc/reference/en/language/functions/communication/serial/peek/ "That is, successive calls to peek() will return the same character, as will the next call to read()."
1 parent 671d675 commit 6dbfc1b

File tree

2 files changed

+12
-27
lines changed

2 files changed

+12
-27
lines changed

cores/arduino/stm32/virtio/virtio_buffer.c

Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,10 @@
2929

3030
#define BUFFER_END (VIRTIO_BUFFER_SIZE - 1)
3131

32-
static uint16_t read_tmp(virtio_buffer_t *ring, uint8_t *dst, uint16_t size);
33-
static void read_commit(virtio_buffer_t *ring);
34-
static void read_rollback(virtio_buffer_t *ring);
35-
3632
void virtio_buffer_init(virtio_buffer_t *ring)
3733
{
3834
ring->write = 0;
3935
ring->read = 0;
40-
ring->read_tmp = 0;
4136
}
4237

4338
uint16_t virtio_buffer_read_available(virtio_buffer_t *ring)
@@ -51,35 +46,27 @@ uint16_t virtio_buffer_read_available(virtio_buffer_t *ring)
5146
return write - ring->read;
5247
}
5348

54-
static uint16_t read_tmp(virtio_buffer_t *ring, uint8_t *dst, uint16_t size)
49+
static uint16_t read(virtio_buffer_t *ring, uint8_t *dst, uint16_t size, bool peek)
5550
{
5651
// This will make the function safe when write operations are done in interrupts
5752
volatile uint16_t write = ring->write;
58-
uint16_t end = (write >= ring->read_tmp) ? write : BUFFER_END + 1;
53+
uint16_t end = (write >= ring->read) ? write : BUFFER_END + 1;
54+
55+
size = min(end - ring->read, size);
56+
memcpy(dst, ring->buffer + ring->read, size);
57+
if (!peek) {
58+
ring->read += size;
5959

60-
size = min(end - ring->read_tmp, size);
61-
memcpy(dst, ring->buffer + ring->read_tmp, size);
62-
ring->read_tmp += size;
63-
if (ring->read_tmp > BUFFER_END) {
64-
ring->read_tmp = 0;
60+
if (ring->read > BUFFER_END) {
61+
ring->read = 0;
62+
}
6563
}
6664
return size;
6765
}
6866

69-
static void read_commit(virtio_buffer_t *ring)
70-
{
71-
ring->read = ring->read_tmp;
72-
}
73-
74-
static void read_rollback(virtio_buffer_t *ring)
75-
{
76-
ring->read_tmp = ring->read;
77-
}
78-
7967
uint16_t virtio_buffer_read(virtio_buffer_t *ring, uint8_t *dst, uint16_t size)
8068
{
81-
uint16_t recv_size = read_tmp(ring, dst, size);
82-
read_commit(ring);
69+
uint16_t recv_size = read(ring, dst, size, false);
8370
return recv_size;
8471
}
8572

@@ -91,9 +78,8 @@ uint16_t virtio_buffer_peek(virtio_buffer_t *ring, uint8_t *dst, uint16_t size)
9178
size = min(size, virtio_buffer_read_available(ring));
9279
uint16_t recv_size = 0;
9380
while (recv_size < size) {
94-
recv_size += read_tmp(ring, dst + recv_size, size - recv_size);
81+
recv_size += read(ring, dst + recv_size, size - recv_size, true);
9582
}
96-
read_rollback(ring);
9783
return recv_size;
9884
}
9985

cores/arduino/stm32/virtio/virtio_buffer.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ typedef struct {
3636
uint8_t buffer[VIRTIO_BUFFER_SIZE];
3737
volatile uint16_t write;
3838
volatile uint16_t read;
39-
volatile uint16_t read_tmp;
4039
} virtio_buffer_t;
4140

4241
void virtio_buffer_init(virtio_buffer_t *ring);

0 commit comments

Comments
 (0)