1// Copyright 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef CHROME_COMMON_PARTIAL_CIRCULAR_BUFFER_H_ 6#define CHROME_COMMON_PARTIAL_CIRCULAR_BUFFER_H_ 7 8#include "base/basictypes.h" 9#include "base/gtest_prod_util.h" 10 11// A wrapper around a memory buffer that allows circular read and write with a 12// selectable wrapping position. Buffer layout (after wrap; H is header): 13// ----------------------------------------------------------- 14// | H | Beginning | End | Middle | 15// ----------------------------------------------------------- 16// ^---- Non-wrapping -----^ ^--------- Wrapping ----------^ 17// The non-wrapping part is never overwritten. The wrapping part will be 18// circular. The very first part is the header (see the BufferData struct 19// below). It consists of the following information: 20// - Length written to the buffer (not including header). 21// - Wrapping position. 22// - End position of buffer. (If the last byte is at x, this will be x + 1.) 23// Users of wrappers around the same underlying buffer must ensure that writing 24// is finished before reading is started. 25class PartialCircularBuffer { 26 public: 27 // Use for reading. |buffer_size| is in bytes and must be larger than the 28 // header size (see above). 29 PartialCircularBuffer(void* buffer, uint32 buffer_size); 30 31 // Use for writing. |buffer_size| is in bytes and must be larger than the 32 // header size (see above). If |append| is true, the header data is not reset 33 // and writing will continue were left off, |wrap_position| is then ignored. 34 PartialCircularBuffer(void* buffer, 35 uint32 buffer_size, 36 uint32 wrap_position, 37 bool append); 38 39 uint32 Read(void* buffer, uint32 buffer_size); 40 void Write(const void* buffer, uint32 buffer_size); 41 42 private: 43 friend class PartialCircularBufferTest; 44 45#pragma pack(push) 46#pragma pack(4) 47 struct BufferData { 48 uint32 total_written; 49 uint32 wrap_position; 50 uint32 end_position; 51 uint8 data[1]; 52 }; 53#pragma pack(pop) 54 55 void DoWrite(void* dest, const void* src, uint32 num); 56 57 // Used for reading and writing. 58 BufferData* buffer_data_; 59 uint32 memory_buffer_size_; 60 uint32 data_size_; 61 uint32 position_; 62 63 // Used for reading. 64 uint32 total_read_; 65}; 66 67#endif // CHROME_COMMON_PARTIAL_CIRCULAR_BUFFER_H_ 68