| Index: mojo/public/cpp/bindings/lib/scratch_buffer.cc
|
| diff --git a/mojo/public/cpp/bindings/lib/scratch_buffer.cc b/mojo/public/cpp/bindings/lib/scratch_buffer.cc
|
| deleted file mode 100644
|
| index c7f507be285e921b81f710510535c9624311ddce..0000000000000000000000000000000000000000
|
| --- a/mojo/public/cpp/bindings/lib/scratch_buffer.cc
|
| +++ /dev/null
|
| @@ -1,98 +0,0 @@
|
| -// Copyright 2014 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.
|
| -
|
| -#include "mojo/public/cpp/bindings/lib/scratch_buffer.h"
|
| -
|
| -#include <assert.h>
|
| -#include <stdlib.h>
|
| -#include <string.h>
|
| -
|
| -#include <algorithm>
|
| -
|
| -#include "mojo/public/cpp/bindings/lib/bindings_serialization.h"
|
| -
|
| -// Scrub memory in debug builds to help catch use-after-free bugs.
|
| -#ifdef NDEBUG
|
| -#define DEBUG_SCRUB(address, size) (void) (address), (void) (size)
|
| -#else
|
| -#define DEBUG_SCRUB(address, size) memset(address, 0xCD, size)
|
| -#endif
|
| -
|
| -namespace mojo {
|
| -namespace internal {
|
| -
|
| -ScratchBuffer::ScratchBuffer()
|
| - : overflow_(NULL) {
|
| - fixed_.next = NULL;
|
| - fixed_.cursor = internal::AlignPointer(fixed_data_);
|
| - fixed_.end = fixed_data_ + kMinSegmentSize;
|
| -}
|
| -
|
| -ScratchBuffer::~ScratchBuffer() {
|
| - // Invoke destructors in reverse order to mirror allocation order.
|
| - std::deque<PendingDestructor>::reverse_iterator it;
|
| - for (it = pending_dtors_.rbegin(); it != pending_dtors_.rend(); ++it)
|
| - it->func(it->address);
|
| -
|
| - while (overflow_) {
|
| - Segment* doomed = overflow_;
|
| - overflow_ = overflow_->next;
|
| - DEBUG_SCRUB(doomed, doomed->end - reinterpret_cast<char*>(doomed));
|
| - free(doomed);
|
| - }
|
| - DEBUG_SCRUB(fixed_data_, sizeof(fixed_data_));
|
| -}
|
| -
|
| -void* ScratchBuffer::Allocate(size_t delta, Destructor func) {
|
| - delta = internal::Align(delta);
|
| - void* result = AllocateInSegment(&fixed_, delta);
|
| - if (!result && overflow_)
|
| - result = AllocateInSegment(overflow_, delta);
|
| -
|
| - if (!result && AddOverflowSegment(delta))
|
| - result = AllocateInSegment(overflow_, delta);
|
| -
|
| - if (func && result) {
|
| - PendingDestructor dtor;
|
| - dtor.func = func;
|
| - dtor.address = result;
|
| - pending_dtors_.push_back(dtor);
|
| - }
|
| - return result;
|
| -}
|
| -
|
| -void* ScratchBuffer::AllocateInSegment(Segment* segment, size_t delta) {
|
| - if (static_cast<size_t>(segment->end - segment->cursor) >= delta) {
|
| - void* result = segment->cursor;
|
| - memset(result, 0, delta); // Required to avoid info leaks.
|
| - segment->cursor += delta;
|
| - return result;
|
| - }
|
| - return NULL;
|
| -}
|
| -
|
| -bool ScratchBuffer::AddOverflowSegment(size_t delta) {
|
| - if (delta < kMinSegmentSize)
|
| - delta = kMinSegmentSize;
|
| -
|
| - if (delta > kMaxSegmentSize)
|
| - return false;
|
| -
|
| - // Ensure segment buffer is aligned.
|
| - size_t padded_segment_size = internal::Align(sizeof(Segment));
|
| - Segment* segment = static_cast<Segment*>(
|
| - malloc(padded_segment_size + delta));
|
| - if (segment) {
|
| - segment->next = overflow_;
|
| - segment->cursor = reinterpret_cast<char*>(segment) + padded_segment_size;
|
| - segment->end = segment->cursor + delta;
|
| - overflow_ = segment;
|
| - return true;
|
| - }
|
| -
|
| - return false;
|
| -}
|
| -
|
| -} // namespace internal
|
| -} // namespace mojo
|
|
|