blob: 73d3537a7be8cdccc87371d147ea04f4bac0cf0a [file] [log] [blame]
/*
* Copyright 2011 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Author: fangfei@google.com (Fangfei Zhou)
#ifndef PAGESPEED_KERNEL_UTIL_CIRCULAR_BUFFER_H_
#define PAGESPEED_KERNEL_UTIL_CIRCULAR_BUFFER_H_
#include "pagespeed/kernel/base/basictypes.h"
#include "pagespeed/kernel/base/string.h"
#include "pagespeed/kernel/base/string_util.h"
namespace net_instaweb {
class MessageHandler;
// CircularBuffer which can be instantiated using malloc or with a
// pre-allocated buffer.
class CircularBuffer {
public:
// Instantiate buffer with malloc.
static CircularBuffer* Create(const int capacity);
// Instantiate buffer with pre-allocated block.
// parent = true if this is invoked in root process (ie, this call should
// initialize the fields of the segment).
// block is a pointer to a pre-allocated segment.
// block_size is the size of the block, it must be equal to Sizeof(capacity).
// capacity is the size of the data buffer (the maximum amount of data
// which we can buffer at one time).
static CircularBuffer* Init(bool parent, void* block,
const int block_size,
const int capacity);
// Return the size in bytes of the memory block to allocate to hold a buffer
// with size equal to capacity.
// capacity is the size of data buffer.
static int Sizeof(const int capacity) {
// buffer[1] is double counted, so -1 here.
int total = sizeof(CircularBuffer) + capacity - 1;
return total;
}
// Reset offset of data segment and wrapped flag.
// The old content is not cleared but shouldn't be print out again.
void Clear();
// Write message to buffer.
bool Write(const StringPiece& message);
// Return data content as string.
GoogleString ToString(MessageHandler* handler);
private:
// Can't construct -- must call Create() or Init() from a pre-allocated
// block of correct size.
CircularBuffer();
~CircularBuffer();
// Return the part from offset to the end of buffer.
StringPiece FirstChunk();
// Return the part from the beginning to the offset of buffer.
StringPiece SecondChunk();
// Capacity of buffer.
int capacity_;
// Flag of having wrapped message.
bool wrapped_;
// Position to write in buffer.
int offset_;
// Buffer.
char buffer_[1];
DISALLOW_COPY_AND_ASSIGN(CircularBuffer);
};
} // namespace net_instaweb
#endif // PAGESPEED_KERNEL_UTIL_CIRCULAR_BUFFER_H_