~ubuntu-branches/ubuntu/quantal/ceph/quantal

« back to all changes in this revision

Viewing changes to src/leveldb/util/arena.h

  • Committer: Package Import Robot
  • Author(s): James Page
  • Date: 2012-07-16 09:56:24 UTC
  • mfrom: (0.3.11)
  • mto: This revision was merged to the branch mainline in revision 17.
  • Revision ID: package-import@ubuntu.com-20120716095624-azr2w4hbhei1rxmx
Tags: upstream-0.48
ImportĀ upstreamĀ versionĀ 0.48

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
// Copyright (c) 2011 The LevelDB 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. See the AUTHORS file for names of contributors.
4
 
 
5
 
#ifndef STORAGE_LEVELDB_UTIL_ARENA_H_
6
 
#define STORAGE_LEVELDB_UTIL_ARENA_H_
7
 
 
8
 
#include <cstddef>
9
 
#include <vector>
10
 
#include <assert.h>
11
 
#include <stdint.h>
12
 
 
13
 
namespace leveldb {
14
 
 
15
 
class Arena {
16
 
 public:
17
 
  Arena();
18
 
  ~Arena();
19
 
 
20
 
  // Return a pointer to a newly allocated memory block of "bytes" bytes.
21
 
  char* Allocate(size_t bytes);
22
 
 
23
 
  // Allocate memory with the normal alignment guarantees provided by malloc
24
 
  char* AllocateAligned(size_t bytes);
25
 
 
26
 
  // Returns an estimate of the total memory usage of data allocated
27
 
  // by the arena (including space allocated but not yet used for user
28
 
  // allocations).
29
 
  size_t MemoryUsage() const {
30
 
    return blocks_memory_ + blocks_.capacity() * sizeof(char*);
31
 
  }
32
 
 
33
 
 private:
34
 
  char* AllocateFallback(size_t bytes);
35
 
  char* AllocateNewBlock(size_t block_bytes);
36
 
 
37
 
  // Allocation state
38
 
  char* alloc_ptr_;
39
 
  size_t alloc_bytes_remaining_;
40
 
 
41
 
  // Array of new[] allocated memory blocks
42
 
  std::vector<char*> blocks_;
43
 
 
44
 
  // Bytes of memory in blocks allocated so far
45
 
  size_t blocks_memory_;
46
 
 
47
 
  // No copying allowed
48
 
  Arena(const Arena&);
49
 
  void operator=(const Arena&);
50
 
};
51
 
 
52
 
inline char* Arena::Allocate(size_t bytes) {
53
 
  // The semantics of what to return are a bit messy if we allow
54
 
  // 0-byte allocations, so we disallow them here (we don't need
55
 
  // them for our internal use).
56
 
  assert(bytes > 0);
57
 
  if (bytes <= alloc_bytes_remaining_) {
58
 
    char* result = alloc_ptr_;
59
 
    alloc_ptr_ += bytes;
60
 
    alloc_bytes_remaining_ -= bytes;
61
 
    return result;
62
 
  }
63
 
  return AllocateFallback(bytes);
64
 
}
65
 
 
66
 
}  // namespace leveldb
67
 
 
68
 
#endif  // STORAGE_LEVELDB_UTIL_ARENA_H_