| // 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_CPP_BINDINGS_LIB_BUFFER_H_ |
| #define MOJO_PUBLIC_CPP_BINDINGS_LIB_BUFFER_H_ |
| |
| #include <stddef.h> |
| |
| #include "base/logging.h" |
| #include "base/macros.h" |
| #include "mojo/public/cpp/bindings/lib/bindings_internal.h" |
| |
| namespace mojo { |
| namespace internal { |
| |
| // Buffer provides an interface to allocate memory blocks which are 8-byte |
| // aligned and zero-initialized. It doesn't own the underlying memory. Users |
| // must ensure that the memory stays valid while using the allocated blocks from |
| // Buffer. |
| class Buffer { |
| public: |
| Buffer() {} |
| |
| // The memory must have been zero-initialized. |data| must be 8-byte |
| // aligned. |
| void Initialize(void* data, size_t size) { |
| DCHECK(IsAligned(data)); |
| |
| data_ = data; |
| size_ = size; |
| cursor_ = reinterpret_cast<uintptr_t>(data); |
| data_end_ = cursor_ + size; |
| } |
| |
| size_t size() const { return size_; } |
| |
| void* data() const { return data_; } |
| |
| // Allocates |num_bytes| from the buffer and returns a pointer to the start of |
| // the allocated block. |
| // The resulting address is 8-byte aligned, and the content of the memory is |
| // zero-filled. |
| void* Allocate(size_t num_bytes) { |
| num_bytes = Align(num_bytes); |
| uintptr_t result = cursor_; |
| cursor_ += num_bytes; |
| if (cursor_ > data_end_ || cursor_ < result) { |
| NOTREACHED(); |
| cursor_ -= num_bytes; |
| return nullptr; |
| } |
| |
| return reinterpret_cast<void*>(result); |
| } |
| |
| private: |
| void* data_ = nullptr; |
| size_t size_ = 0; |
| |
| uintptr_t cursor_ = 0; |
| uintptr_t data_end_ = 0; |
| |
| DISALLOW_COPY_AND_ASSIGN(Buffer); |
| }; |
| |
| } // namespace internal |
| } // namespace mojo |
| |
| #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_BUFFER_H_ |