Index: net/tools/flip_server/ring_buffer.cc |
diff --git a/net/tools/flip_server/ring_buffer.cc b/net/tools/flip_server/ring_buffer.cc |
deleted file mode 100644 |
index 16c278bcdefa8773188242a5e8f47cc76fb9a0e0..0000000000000000000000000000000000000000 |
--- a/net/tools/flip_server/ring_buffer.cc |
+++ /dev/null |
@@ -1,241 +0,0 @@ |
-// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "net/tools/flip_server/ring_buffer.h" |
-#include "base/logging.h" |
- |
-namespace net { |
- |
-RingBuffer::RingBuffer(int buffer_size) |
- : buffer_(new char[buffer_size]), |
- buffer_size_(buffer_size), |
- bytes_used_(0), |
- read_idx_(0), |
- write_idx_(0) {} |
- |
-RingBuffer::~RingBuffer() {} |
- |
-int RingBuffer::ReadableBytes() const { return bytes_used_; } |
- |
-int RingBuffer::BufferSize() const { return buffer_size_; } |
- |
-int RingBuffer::BytesFree() const { return BufferSize() - ReadableBytes(); } |
- |
-bool RingBuffer::Empty() const { return ReadableBytes() == 0; } |
- |
-bool RingBuffer::Full() const { return ReadableBytes() == BufferSize(); } |
- |
-// Returns the number of characters written. |
-// Appends up-to-'size' bytes to the ringbuffer. |
-int RingBuffer::Write(const char* bytes, int size) { |
- CHECK_GE(size, 0); |
-#if 1 |
- char* wptr; |
- int wsize; |
- GetWritablePtr(&wptr, &wsize); |
- int bytes_remaining = size; |
- int bytes_written = 0; |
- |
- while (wsize && bytes_remaining) { |
- if (wsize > bytes_remaining) { |
- wsize = bytes_remaining; |
- } |
- memcpy(wptr, bytes + bytes_written, wsize); |
- bytes_written += wsize; |
- bytes_remaining -= wsize; |
- AdvanceWritablePtr(wsize); |
- GetWritablePtr(&wptr, &wsize); |
- } |
- return bytes_written; |
-#else |
- const char* p = bytes; |
- |
- int bytes_to_write = size; |
- int bytes_available = BytesFree(); |
- if (bytes_available < bytes_to_write) { |
- bytes_to_write = bytes_available; |
- } |
- const char* end = bytes + bytes_to_write; |
- |
- while (p != end) { |
- this->buffer_[this->write_idx_] = *p; |
- ++p; |
- ++this->write_idx_; |
- if (this->write_idx_ >= this->buffer_size_) { |
- this->write_idx_ = 0; |
- } |
- } |
- bytes_used_ += bytes_to_write; |
- return bytes_to_write; |
-#endif |
-} |
- |
-// Sets *ptr to the beginning of writable memory, and sets *size to the size |
-// available for writing using this pointer. |
-void RingBuffer::GetWritablePtr(char** ptr, int* size) const { |
- *ptr = buffer_.get() + write_idx_; |
- |
- if (bytes_used_ == buffer_size_) { |
- *size = 0; |
- } else if (read_idx_ > write_idx_) { |
- *size = read_idx_ - write_idx_; |
- } else { |
- *size = buffer_size_ - write_idx_; |
- } |
-} |
- |
-// Sets *ptr to the beginning of readable memory, and sets *size to the size |
-// available for reading using this pointer. |
-void RingBuffer::GetReadablePtr(char** ptr, int* size) const { |
- *ptr = buffer_.get() + read_idx_; |
- |
- if (bytes_used_ == 0) { |
- *size = 0; |
- } else if (write_idx_ > read_idx_) { |
- *size = write_idx_ - read_idx_; |
- } else { |
- *size = buffer_size_ - read_idx_; |
- } |
-} |
- |
-// returns the number of bytes read into |
-int RingBuffer::Read(char* bytes, int size) { |
- CHECK_GE(size, 0); |
-#if 1 |
- char* rptr; |
- int rsize; |
- GetReadablePtr(&rptr, &rsize); |
- int bytes_remaining = size; |
- int bytes_read = 0; |
- |
- while (rsize && bytes_remaining) { |
- if (rsize > bytes_remaining) { |
- rsize = bytes_remaining; |
- } |
- memcpy(bytes + bytes_read, rptr, rsize); |
- bytes_read += rsize; |
- bytes_remaining -= rsize; |
- AdvanceReadablePtr(rsize); |
- GetReadablePtr(&rptr, &rsize); |
- } |
- return bytes_read; |
-#else |
- char* p = bytes; |
- int bytes_to_read = size; |
- int bytes_used = ReadableBytes(); |
- if (bytes_used < bytes_to_read) { |
- bytes_to_read = bytes_used; |
- } |
- char* end = bytes + bytes_to_read; |
- |
- while (p != end) { |
- *p = this->buffer_[this->read_idx_]; |
- ++p; |
- ++this->read_idx_; |
- if (this->read_idx_ >= this->buffer_size_) { |
- this->read_idx_ = 0; |
- } |
- } |
- this->bytes_used_ -= bytes_to_read; |
- return bytes_to_read; |
-#endif |
-} |
- |
-void RingBuffer::Clear() { |
- bytes_used_ = 0; |
- write_idx_ = 0; |
- read_idx_ = 0; |
-} |
- |
-bool RingBuffer::Reserve(int size) { |
- DCHECK_GT(size, 0); |
- char* write_ptr = NULL; |
- int write_size = 0; |
- GetWritablePtr(&write_ptr, &write_size); |
- |
- if (write_size < size) { |
- char* read_ptr = NULL; |
- int read_size = 0; |
- GetReadablePtr(&read_ptr, &read_size); |
- if (size <= BytesFree()) { |
- // The fact that the total Free size is big enough but writable size is |
- // not means that the writeable region is broken into two pieces: only |
- // possible if the read_idx < write_idx. If write_idx < read_idx, then |
- // the writeable region must be contiguous: [write_idx, read_idx). There |
- // is no work to be done for the latter. |
- DCHECK_LE(read_idx_, write_idx_); |
- DCHECK_EQ(read_size, ReadableBytes()); |
- if (read_idx_ < write_idx_) { |
- // Writeable area fragmented, consolidate it. |
- memmove(buffer_.get(), read_ptr, read_size); |
- read_idx_ = 0; |
- write_idx_ = read_size; |
- } else if (read_idx_ == write_idx_) { |
- // No unconsumed data in the buffer, simply reset the indexes. |
- DCHECK_EQ(ReadableBytes(), 0); |
- read_idx_ = 0; |
- write_idx_ = 0; |
- } |
- } else { |
- Resize(ReadableBytes() + size); |
- } |
- } |
- DCHECK_LE(size, buffer_size_ - write_idx_); |
- return true; |
-} |
- |
-void RingBuffer::AdvanceReadablePtr(int amount_to_consume) { |
- CHECK_GE(amount_to_consume, 0); |
- if (amount_to_consume >= bytes_used_) { |
- Clear(); |
- return; |
- } |
- read_idx_ += amount_to_consume; |
- read_idx_ %= buffer_size_; |
- bytes_used_ -= amount_to_consume; |
-} |
- |
-void RingBuffer::AdvanceWritablePtr(int amount_to_produce) { |
- CHECK_GE(amount_to_produce, 0); |
- CHECK_LE(amount_to_produce, BytesFree()); |
- write_idx_ += amount_to_produce; |
- write_idx_ %= buffer_size_; |
- bytes_used_ += amount_to_produce; |
-} |
- |
-void RingBuffer::Resize(int buffer_size) { |
- CHECK_GE(buffer_size, 0); |
- if (buffer_size == buffer_size_) |
- return; |
- |
- char* new_buffer = new char[buffer_size]; |
- if (buffer_size < bytes_used_) { |
- // consume the oldest data. |
- AdvanceReadablePtr(bytes_used_ - buffer_size); |
- } |
- |
- int bytes_written = 0; |
- int bytes_used = bytes_used_; |
- while (true) { |
- int size; |
- char* ptr; |
- GetReadablePtr(&ptr, &size); |
- if (size == 0) |
- break; |
- if (size > buffer_size) { |
- size = buffer_size; |
- } |
- memcpy(new_buffer + bytes_written, ptr, size); |
- bytes_written += size; |
- AdvanceReadablePtr(size); |
- } |
- buffer_.reset(new_buffer); |
- |
- buffer_size_ = buffer_size; |
- bytes_used_ = bytes_used; |
- read_idx_ = 0; |
- write_idx_ = bytes_used_ % buffer_size_; |
-} |
- |
-} // namespace net |