| Index: content/common/partial_circular_buffer.h
|
| diff --git a/content/common/partial_circular_buffer.h b/content/common/partial_circular_buffer.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b692ac5ff39ce818cd9b70ed6870c17136a9523c
|
| --- /dev/null
|
| +++ b/content/common/partial_circular_buffer.h
|
| @@ -0,0 +1,70 @@
|
| +// Copyright (c) 2013 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.
|
| +
|
| +#ifndef CONTENT_COMMON_PARTIAL_CIRCULAR_BUFFER_H_
|
| +#define CONTENT_COMMON_PARTIAL_CIRCULAR_BUFFER_H_
|
| +
|
| +#include "base/basictypes.h"
|
| +#include "base/gtest_prod_util.h"
|
| +#include "content/common/content_export.h"
|
| +
|
| +namespace content {
|
| +
|
| +// A wrapper around a memory buffer that allows circular read and write with a
|
| +// selectable wrapping position. Buffer layout (after wrap; H is header):
|
| +// -----------------------------------------------------------
|
| +// | H | Beginning | End | Middle |
|
| +// -----------------------------------------------------------
|
| +// ^---- Non-wrapping -----^ ^--------- Wrapping ----------^
|
| +// The non-wrapping part is never overwritten. The wrapping part will be
|
| +// circular. The very first part is the header (see the BufferData struct
|
| +// below). It consists of the following information:
|
| +// - Length written to the buffer (not including header).
|
| +// - Wrapping position.
|
| +// - End position of buffer. (If the last byte is at x, this will be x + 1.)
|
| +// Users of wrappers around the same underlying buffer must ensure that writing
|
| +// is finished before reading is started.
|
| +class CONTENT_EXPORT PartialCircularBuffer {
|
| + public:
|
| + // Use for reading. |buffer_size| is in bytes and must be larger than the
|
| + // header size (see above).
|
| + PartialCircularBuffer(void* buffer, uint32 buffer_size);
|
| +
|
| + // Use for writing. |buffer_size| is in bytes and must be larger than the
|
| + // header size (see above).
|
| + PartialCircularBuffer(void* buffer,
|
| + uint32 buffer_size,
|
| + uint32 wrap_position);
|
| +
|
| + uint32 Read(void* buffer, uint32 buffer_size);
|
| + void Write(const void* buffer, uint32 buffer_size);
|
| +
|
| + private:
|
| + friend class PartialCircularBufferTest;
|
| +
|
| +#pragma pack(push)
|
| +#pragma pack(4)
|
| + struct BufferData {
|
| + uint32 total_written;
|
| + uint32 wrap_position;
|
| + uint32 end_position;
|
| + uint8 data[1];
|
| + };
|
| +#pragma pack(pop)
|
| +
|
| + void DoWrite(void* dest, const void* src, uint32 num);
|
| +
|
| + // Used for reading and writing.
|
| + BufferData* buffer_data_;
|
| + uint32 memory_buffer_size_;
|
| + uint32 data_size_;
|
| + uint32 position_;
|
| +
|
| + // Used for reading.
|
| + uint32 total_read_;
|
| +};
|
| +
|
| +} // namespace content
|
| +
|
| +#endif // CONTENT_COMMON_PARTIAL_CIRCULAR_BUFFER_H_
|
|
|