| Index: third_party/re2/util/arena.cc
|
| diff --git a/third_party/re2/util/arena.cc b/third_party/re2/util/arena.cc
|
| deleted file mode 100644
|
| index 25753c5df5cca24eead3ca9e3f4527797e24b895..0000000000000000000000000000000000000000
|
| --- a/third_party/re2/util/arena.cc
|
| +++ /dev/null
|
| @@ -1,168 +0,0 @@
|
| -// Copyright 2000 The RE2 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 "util/util.h"
|
| -
|
| -namespace re2 {
|
| -
|
| -// ----------------------------------------------------------------------
|
| -// UnsafeArena::UnsafeArena()
|
| -// UnsafeArena::~UnsafeArena()
|
| -// Destroying the arena automatically calls Reset()
|
| -// ----------------------------------------------------------------------
|
| -
|
| -
|
| -UnsafeArena::UnsafeArena(const size_t block_size)
|
| - : block_size_(block_size),
|
| - freestart_(NULL), // set for real in Reset()
|
| - last_alloc_(NULL),
|
| - remaining_(0),
|
| - blocks_alloced_(1),
|
| - overflow_blocks_(NULL) {
|
| - assert(block_size > kDefaultAlignment);
|
| -
|
| - first_blocks_[0].mem = reinterpret_cast<char*>(malloc(block_size_));
|
| - first_blocks_[0].size = block_size_;
|
| -
|
| - Reset();
|
| -}
|
| -
|
| -UnsafeArena::~UnsafeArena() {
|
| - FreeBlocks();
|
| - assert(overflow_blocks_ == NULL); // FreeBlocks() should do that
|
| - // The first X blocks stay allocated always by default. Delete them now.
|
| - for (int i = 0; i < blocks_alloced_; i++)
|
| - free(first_blocks_[i].mem);
|
| -}
|
| -
|
| -// ----------------------------------------------------------------------
|
| -// UnsafeArena::Reset()
|
| -// Clears all the memory an arena is using.
|
| -// ----------------------------------------------------------------------
|
| -
|
| -void UnsafeArena::Reset() {
|
| - FreeBlocks();
|
| - freestart_ = first_blocks_[0].mem;
|
| - remaining_ = first_blocks_[0].size;
|
| - last_alloc_ = NULL;
|
| -
|
| - // We do not know for sure whether or not the first block is aligned,
|
| - // so we fix that right now.
|
| - const int overage = reinterpret_cast<uintptr_t>(freestart_) &
|
| - (kDefaultAlignment-1);
|
| - if (overage > 0) {
|
| - const int waste = kDefaultAlignment - overage;
|
| - freestart_ += waste;
|
| - remaining_ -= waste;
|
| - }
|
| - freestart_when_empty_ = freestart_;
|
| - assert(!(reinterpret_cast<uintptr_t>(freestart_)&(kDefaultAlignment-1)));
|
| -}
|
| -
|
| -// -------------------------------------------------------------
|
| -// UnsafeArena::AllocNewBlock()
|
| -// Adds and returns an AllocatedBlock.
|
| -// The returned AllocatedBlock* is valid until the next call
|
| -// to AllocNewBlock or Reset. (i.e. anything that might
|
| -// affect overflow_blocks_).
|
| -// -------------------------------------------------------------
|
| -
|
| -UnsafeArena::AllocatedBlock* UnsafeArena::AllocNewBlock(const size_t block_size) {
|
| - AllocatedBlock *block;
|
| - // Find the next block.
|
| - if ( blocks_alloced_ < arraysize(first_blocks_) ) {
|
| - // Use one of the pre-allocated blocks
|
| - block = &first_blocks_[blocks_alloced_++];
|
| - } else { // oops, out of space, move to the vector
|
| - if (overflow_blocks_ == NULL) overflow_blocks_ = new vector<AllocatedBlock>;
|
| - // Adds another block to the vector.
|
| - overflow_blocks_->resize(overflow_blocks_->size()+1);
|
| - // block points to the last block of the vector.
|
| - block = &overflow_blocks_->back();
|
| - }
|
| -
|
| - block->mem = reinterpret_cast<char*>(malloc(block_size));
|
| - block->size = block_size;
|
| -
|
| - return block;
|
| -}
|
| -
|
| -// ----------------------------------------------------------------------
|
| -// UnsafeArena::GetMemoryFallback()
|
| -// We take memory out of our pool, aligned on the byte boundary
|
| -// requested. If we don't have space in our current pool, we
|
| -// allocate a new block (wasting the remaining space in the
|
| -// current block) and give you that. If your memory needs are
|
| -// too big for a single block, we make a special your-memory-only
|
| -// allocation -- this is equivalent to not using the arena at all.
|
| -// ----------------------------------------------------------------------
|
| -
|
| -void* UnsafeArena::GetMemoryFallback(const size_t size, const int align) {
|
| - if (size == 0)
|
| - return NULL; // stl/stl_alloc.h says this is okay
|
| -
|
| - assert(align > 0 && 0 == (align & (align - 1))); // must be power of 2
|
| -
|
| - // If the object is more than a quarter of the block size, allocate
|
| - // it separately to avoid wasting too much space in leftover bytes
|
| - if (block_size_ == 0 || size > block_size_/4) {
|
| - // then it gets its own block in the arena
|
| - assert(align <= kDefaultAlignment); // because that's what new gives us
|
| - // This block stays separate from the rest of the world; in particular
|
| - // we don't update last_alloc_ so you can't reclaim space on this block.
|
| - return AllocNewBlock(size)->mem;
|
| - }
|
| -
|
| - const int overage =
|
| - (reinterpret_cast<uintptr_t>(freestart_) & (align-1));
|
| - if (overage) {
|
| - const int waste = align - overage;
|
| - freestart_ += waste;
|
| - if (waste < remaining_) {
|
| - remaining_ -= waste;
|
| - } else {
|
| - remaining_ = 0;
|
| - }
|
| - }
|
| - if (size > remaining_) {
|
| - AllocatedBlock *block = AllocNewBlock(block_size_);
|
| - freestart_ = block->mem;
|
| - remaining_ = block->size;
|
| - }
|
| - remaining_ -= size;
|
| - last_alloc_ = freestart_;
|
| - freestart_ += size;
|
| - assert((reinterpret_cast<uintptr_t>(last_alloc_) & (align-1)) == 0);
|
| - return reinterpret_cast<void*>(last_alloc_);
|
| -}
|
| -
|
| -// ----------------------------------------------------------------------
|
| -// UnsafeArena::FreeBlocks()
|
| -// Unlike GetMemory(), which does actual work, ReturnMemory() is a
|
| -// no-op: we don't "free" memory until Reset() is called. We do
|
| -// update some stats, though. Note we do no checking that the
|
| -// pointer you pass in was actually allocated by us, or that it
|
| -// was allocated for the size you say, so be careful here!
|
| -// FreeBlocks() does the work for Reset(), actually freeing all
|
| -// memory allocated in one fell swoop.
|
| -// ----------------------------------------------------------------------
|
| -
|
| -void UnsafeArena::FreeBlocks() {
|
| - for ( int i = 1; i < blocks_alloced_; ++i ) { // keep first block alloced
|
| - free(first_blocks_[i].mem);
|
| - first_blocks_[i].mem = NULL;
|
| - first_blocks_[i].size = 0;
|
| - }
|
| - blocks_alloced_ = 1;
|
| - if (overflow_blocks_ != NULL) {
|
| - vector<AllocatedBlock>::iterator it;
|
| - for (it = overflow_blocks_->begin(); it != overflow_blocks_->end(); ++it) {
|
| - free(it->mem);
|
| - }
|
| - delete overflow_blocks_; // These should be used very rarely
|
| - overflow_blocks_ = NULL;
|
| - }
|
| -}
|
| -
|
| -} // namespace re2
|
|
|