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-
3632void virtio_buffer_init (virtio_buffer_t * ring )
3733{
3834 ring -> write = 0 ;
3935 ring -> read = 0 ;
40- ring -> read_tmp = 0 ;
4136}
4237
4338uint16_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-
7967uint16_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
0 commit comments