aboutsummaryrefslogtreecommitdiff
path: root/src/rt
diff options
context:
space:
mode:
authorBrian Anderson <[email protected]>2011-01-07 23:09:16 -0500
committerGraydon Hoare <[email protected]>2011-01-10 11:31:33 -0800
commit97aa599b0d8cd19c6535c7a9e4a1e72d70c0c16f (patch)
treea2b1165f0abe4419f35ae4e3d5a4d62b3bd7bbac /src/rt
parentRemove tabs (diff)
downloadrust-97aa599b0d8cd19c6535c7a9e4a1e72d70c0c16f.tar.xz
rust-97aa599b0d8cd19c6535c7a9e4a1e72d70c0c16f.zip
Fix circular_buffer growth when _next != 0
Diffstat (limited to 'src/rt')
-rw-r--r--src/rt/circular_buffer.cpp13
1 files changed, 7 insertions, 6 deletions
diff --git a/src/rt/circular_buffer.cpp b/src/rt/circular_buffer.cpp
index c3b068ac..54898fb7 100644
--- a/src/rt/circular_buffer.cpp
+++ b/src/rt/circular_buffer.cpp
@@ -63,7 +63,7 @@ circular_buffer::enqueue(void *src) {
I(dom, _unread <= _buffer_sz);
// Grow if necessary.
- if (_unread + unit_sz > _buffer_sz) {
+ if (_next + _unread + unit_sz > _buffer_sz) {
size_t new_buffer_sz = _buffer_sz << 1;
I(dom, new_buffer_sz <= MAX_CIRCULAR_BUFFFER_SIZE);
void *new_buffer = dom->malloc(new_buffer_sz);
@@ -76,15 +76,16 @@ circular_buffer::enqueue(void *src) {
dom->log(rust_log::MEM | rust_log::COMM,
"circular_buffer enqueue "
- "unread: %d, buffer_sz: %d, unit_sz: %d",
- _unread, _buffer_sz, unit_sz);
+ "unread: %d, next: %d, buffer_sz: %d, unit_sz: %d",
+ _unread, _next, _buffer_sz, unit_sz);
I(dom, is_power_of_two(_buffer_sz));
I(dom, _unread < _buffer_sz);
- I(dom, _unread + unit_sz <= _buffer_sz);
+ I(dom, _next + _unread + unit_sz <= _buffer_sz);
// Copy data
size_t i = (_next + _unread) & (_buffer_sz - 1);
+ I(dom, i + unit_sz <= _buffer_sz);
memcpy(&_buffer[i], src, unit_sz);
_unread += unit_sz;
@@ -106,8 +107,8 @@ circular_buffer::dequeue(void *dst) {
dom->log(rust_log::MEM | rust_log::COMM,
"circular_buffer dequeue "
- "unread: %d, buffer_sz: %d, unit_sz: %d",
- _unread, _buffer_sz, unit_sz);
+ "unread: %d, next: %d, buffer_sz: %d, unit_sz: %d",
+ _unread, _next, _buffer_sz, unit_sz);
if (dst != NULL) {
memcpy(dst, &_buffer[_next], unit_sz);