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.
5 #include "mojo/public/bindings/lib/buffer.h"
13 #include "mojo/public/bindings/lib/bindings_serialization.h"
17 //-----------------------------------------------------------------------------
19 ScratchBuffer::ScratchBuffer()
22 fixed_.cursor = fixed_data_;
23 fixed_.end = fixed_data_ + kMinSegmentSize;
26 ScratchBuffer::~ScratchBuffer() {
28 Segment* doomed = overflow_;
29 overflow_ = overflow_->next;
34 void* ScratchBuffer::Allocate(size_t delta) {
35 delta = internal::Align(delta);
38 AllocateInSegment((overflow_ != NULL) ? overflow_ : &fixed_, delta);
42 AddOverflowSegment(delta);
43 return Allocate(delta);
46 void* ScratchBuffer::AllocateInSegment(Segment* segment, size_t delta) {
48 if (static_cast<size_t>(segment->end - segment->cursor) >= delta) {
49 result = segment->cursor;
50 memset(result, 0, delta);
51 segment->cursor += delta;
58 void ScratchBuffer::AddOverflowSegment(size_t delta) {
59 if (delta < kMinSegmentSize)
60 delta = kMinSegmentSize;
62 // Ensure segment buffer is aligned.
63 size_t segment_size = internal::Align(sizeof(Segment)) + delta;
65 Segment* segment = static_cast<Segment*>(malloc(segment_size));
66 segment->next = overflow_;
67 segment->cursor = reinterpret_cast<char*>(segment + 1);
68 segment->end = segment->cursor + delta;
73 //-----------------------------------------------------------------------------
75 FixedBuffer::FixedBuffer(size_t size)
78 size_(internal::Align(size)) {
79 ptr_ = static_cast<char*>(calloc(size_, 1));
82 FixedBuffer::~FixedBuffer() {
86 void* FixedBuffer::Allocate(size_t delta) {
87 delta = internal::Align(delta);
89 // TODO(darin): Using <assert.h> is probably not going to cut it.
91 assert(cursor_ + delta <= size_);
92 if (cursor_ + delta > size_)
95 char* result = ptr_ + cursor_;
101 void* FixedBuffer::Leak() {