blob: c3479b63136823de4857f1d598412963150a2523 [file] [log] [blame]
// Copyright 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 MOJO_PUBLIC_BINDINGS_LIB_BUFFER_H_
#define MOJO_PUBLIC_BINDINGS_LIB_BUFFER_H_
#include <stddef.h>
#include "mojo/public/system/macros.h"
namespace mojo {
// Allocations are 8-byte aligned and zero-filled.
class Buffer {
public:
virtual ~Buffer() {}
virtual void* Allocate(size_t num_bytes) = 0;
};
// The following class is designed to be allocated on the stack. If necessary,
// it will failover to allocating objects on the heap.
class ScratchBuffer : public Buffer {
public:
ScratchBuffer();
virtual ~ScratchBuffer();
virtual void* Allocate(size_t num_bytes) MOJO_OVERRIDE;
private:
enum { kMinSegmentSize = 512 };
struct Segment {
Segment* next;
char* cursor;
char* end;
};
void* AllocateInSegment(Segment* segment, size_t num_bytes);
void AddOverflowSegment(size_t delta);
char fixed_data_[kMinSegmentSize];
Segment fixed_;
Segment* overflow_;
MOJO_DISALLOW_COPY_AND_ASSIGN(ScratchBuffer);
};
// FixedBuffer provides a simple way to allocate objects within a fixed chunk
// of memory. Objects are allocated by calling the |Allocate| method, which
// extends the buffer accordingly. Objects allocated in this way are not freed
// explicitly. Instead, they remain valid so long as the FixedBuffer remains
// valid. The Leak method may be used to steal the underlying memory from the
// FixedBuffer.
//
// Typical usage:
//
// {
// FixedBuffer buf(8 + 8);
//
// int* a = static_cast<int*>(buf->Allocate(sizeof(int)));
// *a = 2;
//
// double* b = static_cast<double*>(buf->Allocate(sizeof(double)));
// *b = 3.14f;
//
// void* data = buf.Leak();
// Process(data);
//
// free(data);
// }
//
class FixedBuffer : public Buffer {
public:
explicit FixedBuffer(size_t size);
virtual ~FixedBuffer();
// Grows the buffer by |num_bytes| and returns a pointer to the start of the
// addition. The resulting address is 8-byte aligned, and the content of the
// memory is zero-filled.
virtual void* Allocate(size_t num_bytes) MOJO_OVERRIDE;
size_t size() const { return size_; }
// Returns the internal memory owned by the Buffer to the caller. The Buffer
// relinquishes its pointer, effectively resetting the state of the Buffer
// and leaving the caller responsible for freeing the returned memory address
// when no longer needed.
void* Leak();
private:
char* ptr_;
size_t cursor_;
size_t size_;
MOJO_DISALLOW_COPY_AND_ASSIGN(FixedBuffer);
};
} // namespace mojo
#endif // MOJO_PUBLIC_BINDINGS_LIB_BUFFER_H_