From: Jack Lange Date: Mon, 8 Sep 2008 19:43:21 +0000 (+0000) Subject: *** empty log message *** X-Git-Tag: 1.0~46 X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=ae815401892685fd738836b47eccba2b437e277a;p=palacios.git *** empty log message *** --- diff --git a/palacios/include/geekos/ring_buffer.h b/palacios/include/geekos/ring_buffer.h index 51a01f1..1e8f4b5 100644 --- a/palacios/include/geekos/ring_buffer.h +++ b/palacios/include/geekos/ring_buffer.h @@ -23,6 +23,8 @@ void free_ring_buffer(struct ring_buffer * ring); int rb_read(struct ring_buffer * ring, char * dst, uint_t len); +int rb_peek(struct ring_buffer * ring, char * dst, uint_t len); +int rb_delete(struct ring_buffer * ring, uint_t len); int rb_write(struct ring_buffer * ring, char * src, uint_t len); int rb_data_len(struct ring_buffer * ring); int rb_capacity(struct ring_buffer * ring); diff --git a/palacios/src/geekos/ring_buffer.c b/palacios/src/geekos/ring_buffer.c index aa87458..de52ba6 100644 --- a/palacios/src/geekos/ring_buffer.c +++ b/palacios/src/geekos/ring_buffer.c @@ -88,11 +88,9 @@ int rb_read(struct ring_buffer * ring, char * dst, uint_t len) { int section_len = get_read_section_size(ring); memcpy(dst, get_read_ptr(ring), section_len); - ring->start = 0; - - memcpy(dst + section_len, get_read_ptr(ring), read_len - section_len); + memcpy(dst + section_len, ring->buf, read_len - section_len); - ring->start += read_len - section_len; + ring->start = read_len - section_len; } else { memcpy(dst, get_read_ptr(ring), read_len); @@ -105,6 +103,45 @@ int rb_read(struct ring_buffer * ring, char * dst, uint_t len) { } + + +int rb_peek(struct ring_buffer * ring, char * dst, uint_t len) { + int read_len = 0; + int ring_data_len = ring->current_len; + + read_len = (len > ring_data_len) ? ring_data_len : len; + + if (is_read_loop(ring, read_len)) { + int section_len = get_read_section_size(ring); + + memcpy(dst, get_read_ptr(ring), section_len); + memcpy(dst + section_len, ring->buf, read_len - section_len); + } else { + memcpy(dst, get_read_ptr(ring), read_len); + } + + return read_len; +} + + +int rb_delete(struct ring_buffer * ring, uint_t len) { + int del_len = 0; + int ring_data_len = ring->current_len; + + del_len = (len > ring_data_len) ? ring_data_len : len; + + if (is_read_loop(ring, del_len)) { + int section_len = get_read_section_size(ring); + ring->start = del_len - section_len; + } else { + ring->start += del_len; + } + + ring->current_len -= del_len; + return del_len; +} + + int rb_write(struct ring_buffer * ring, char * src, uint_t len) { int write_len = 0; int ring_avail_space = ring->size - ring->current_len;