X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fgeekos%2Fring_buffer.c;h=71d4dc7b90d52f33c5410508f10af2c490156fce;hb=101529b6eae500272347287df43ec51aa003d0aa;hp=aa8745877dfd4db22f0d00d5141225c62c1dae3d;hpb=e642ea3a27bf1961a19ef3776c34333025c2a585;p=palacios.git diff --git a/palacios/src/geekos/ring_buffer.c b/palacios/src/geekos/ring_buffer.c index aa87458..71d4dc7 100644 --- a/palacios/src/geekos/ring_buffer.c +++ b/palacios/src/geekos/ring_buffer.c @@ -1,3 +1,6 @@ +/* (c) 2008, Jack Lange */ +/* (c) 2008, The V3VEE Project */ + #include #include #include @@ -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;