X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fgeekos%2Fring_buffer.c;h=cde7c2b117c94691d07e01bdde20d543083db0f2;hb=f9bb3db89469169bb5775dc031d89e570c6fed70;hp=7e0505ff37330bd63f1c6c07b5dec72abfa124cc;hpb=2ebe47590960c6edc54ad46f9453258a46082c6c;p=palacios.git diff --git a/palacios/src/geekos/ring_buffer.c b/palacios/src/geekos/ring_buffer.c index 7e0505f..cde7c2b 100644 --- a/palacios/src/geekos/ring_buffer.c +++ b/palacios/src/geekos/ring_buffer.c @@ -1,7 +1,10 @@ +/* Northwestern University */ +/* (c) 2008, Jack Lange */ + #include #include #include - +#include void init_ring_buffer(struct ring_buffer * ring, uint_t size) { @@ -32,11 +35,11 @@ void free_ring_buffer(struct ring_buffer * ring) { static inline uchar_t * get_read_ptr(struct ring_buffer * ring) { - return (uchar_t *)&(ring->buf + ring->start); + return (uchar_t *)(ring->buf + ring->start); } static inline uchar_t * get_write_ptr(struct ring_buffer * ring) { - return (uchar_t *)&(ring->buf + ring->end); + return (uchar_t *)(ring->buf + ring->end); } @@ -88,11 +91,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 +106,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; @@ -131,3 +171,14 @@ int rb_write(struct ring_buffer * ring, char * src, uint_t len) { return write_len; } + + +void print_ring_buffer(struct ring_buffer * ring) { + int ctr = 0; + + for (ctr = 0; ctr < ring->current_len; ctr++) { + int index = (ctr + ring->start) % ring->size; + + PrintBoth("Entry %d (index=%d): %c\n", ctr, index, ring->buf[index]); + } +}