15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "mojo/public/cpp/bindings/lib/fixed_buffer.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <stdlib.h>
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <algorithm>
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "mojo/public/cpp/bindings/lib/bindings_serialization.h"
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/public/cpp/environment/logging.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace mojo {
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace internal {
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)FixedBuffer::FixedBuffer(size_t size)
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : ptr_(NULL),
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      cursor_(0),
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      size_(internal::Align(size)) {
21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // calloc() required to zero memory and thus avoid info leaks.
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ptr_ = static_cast<char*>(calloc(size_, 1));
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)FixedBuffer::~FixedBuffer() {
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  free(ptr_);
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void* FixedBuffer::Allocate(size_t delta) {
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  delta = internal::Align(delta);
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (delta == 0 || delta > size_ - cursor_) {
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    MOJO_DCHECK(false) << "Not reached";
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return NULL;
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  char* result = ptr_ + cursor_;
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cursor_ += delta;
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return result;
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void* FixedBuffer::Leak() {
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  char* ptr = ptr_;
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ptr_ = NULL;
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cursor_ = 0;
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_ = 0;
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return ptr;
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace internal
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace mojo
53