nlib
FrameHeap.h
Go to the documentation of this file.
1 
2 #pragma once
3 #ifndef INCLUDE_NN_NLIB_HEAP_FRAMEHEAP_H_
4 #define INCLUDE_NN_NLIB_HEAP_FRAMEHEAP_H_
5 
6 #include "nn/nlib/Config.h"
7 
8 #if defined(_MSC_VER) && defined(nx_heap_EXPORTS)
9 #undef NLIB_VIS_PUBLIC
10 #define NLIB_VIS_PUBLIC NLIB_WINEXPORT
11 #endif
12 
13 NLIB_NAMESPACE_BEGIN
14 namespace heap {
15 
17  public:
18  typedef void (*DestructorHandler)(void* start, void* end);
19  enum AllocOption {
20  ALLOCOPTION_ALLOCHEAD = 0x00000000,
21  ALLOCOPTION_ALLOCTAIL = 0x00000001
22  };
23 
24  struct State {
25  size_t _[2];
26  bool operator==(const State& rhs) NLIB_NOEXCEPT {
27  return _[0] == rhs._[0] && _[1] == rhs._[1];
28  }
29  bool operator!=(const State& rhs) NLIB_NOEXCEPT {
30  return _[0] != rhs._[0] || _[1] != rhs._[1];
31  }
32  };
33  FrameHeap() NLIB_NOEXCEPT : heap_option_(0), start_(NULL), end_(NULL), handler_(NULL) {
34  cur_.interlocked._[0] = cur_.interlocked._[1] = 0;
35  }
37  if (handler_) {
38  (*handler_)(start_, end_);
39  }
40  }
41  errno_t Init(void* start, size_t size, DestructorHandler handler,
42  uint32_t heap_option) NLIB_NOEXCEPT;
43  void FreeAll() NLIB_NOEXCEPT {
44  HeapStatus to;
45  to.tb.topidx = 0;
46  to.tb.botidx = end_ - start_;
47  cur_ = to;
48  }
49  void FreeTop() NLIB_NOEXCEPT { cur_.tb.topidx = 0; }
50  void FreeBot() NLIB_NOEXCEPT {
51  size_t bot = end_ - start_;
52  cur_.tb.botidx = bot;
53  }
54  errno_t ResizeTop(void* p, size_t from_size, size_t to_size) NLIB_NOEXCEPT;
55  errno_t Adjust(void** start, size_t* size) NLIB_NOEXCEPT;
56 
57  State SaveState() NLIB_NOEXCEPT { return cur_.interlocked; }
58  void RestoreState(State state) NLIB_NOEXCEPT { cur_.interlocked = state; }
59  void* Alloc(size_t n) NLIB_NOEXCEPT { return this->Alloc(n, 8, 0); }
60  void* Alloc(size_t n, size_t algn) NLIB_NOEXCEPT { return this->Alloc(n, algn, 0); }
61  void* Alloc(size_t n, size_t algn, uint32_t alloc_option) NLIB_NOEXCEPT;
62  void Dump() NLIB_NOEXCEPT;
63 
64  private:
65  union HeapStatus {
66  State interlocked;
67  struct topbot_ {
68  size_t topidx;
69  size_t botidx;
70  } tb;
71  };
72  static uint8_t* RoundUp(uint8_t* ptr, size_t algn) NLIB_NOEXCEPT {
73  // algn is power of 2.
74  intptr_t tmp = reinterpret_cast<intptr_t>(ptr);
75  return reinterpret_cast<uint8_t*>(tmp + (-tmp & (algn - 1)));
76  }
77  static uint8_t* RoundDown(uint8_t* ptr, size_t algn) NLIB_NOEXCEPT {
78  // algn is power of 2.
79  intptr_t tmp = reinterpret_cast<intptr_t>(ptr);
80  return reinterpret_cast<uint8_t*>(tmp & (~algn + 1));
81  }
82  void ChangeHeapRange(void* start, void* end) NLIB_NOEXCEPT {
83  start_ = reinterpret_cast<uint8_t*>(start);
84  end_ = reinterpret_cast<uint8_t*>(end);
85  }
86 
87  private:
88  HeapStatus cur_;
89  uint32_t heap_option_;
90  uint8_t* start_;
91  uint8_t* end_;
92  DestructorHandler handler_;
93 };
94 
95 } // namespace heap
96 NLIB_NAMESPACE_END
97 
98 #if defined(_MSC_VER) && defined(nx_heap_EXPORTS)
99 #undef NLIB_VIS_PUBLIC
100 #define NLIB_VIS_PUBLIC NLIB_WINIMPORT
101 #endif
102 
103 #endif // INCLUDE_NN_NLIB_HEAP_FRAMEHEAP_H_
bool operator==(const State &rhs) noexcept
Compares heap states and returns true if they are equal.
Definition: FrameHeap.h:26
void FreeAll() noexcept
Frees all memory and restores the heap to its post-initialization state.
Definition: FrameHeap.h:43
void FreeBot() noexcept
Frees all memory regions that were allocated from bottom of the heap.
Definition: FrameHeap.h:50
void FreeTop() noexcept
Frees all memory regions that were allocated from top of the heap.
Definition: FrameHeap.h:49
State SaveState() noexcept
Saves the current heap state.
Definition: FrameHeap.h:57
Lists the state of the heap.
Definition: FrameHeap.h:24
#define NLIB_VIS_PUBLIC
Symbols for functions and classes are made available outside of the library.
Definition: Platform_unix.h:61
bool operator!=(const State &rhs) noexcept
Compares heap states and returns true if they are unequal.
Definition: FrameHeap.h:29
Allows memory to be allocated from both sides of the heap.
Definition: FrameHeap.h:16
void RestoreState(State state) noexcept
Restores a saved heap state.
Definition: FrameHeap.h:58
#define NLIB_NOEXCEPT
Defines noexcept geared to the environment, or the equivalent.
Definition: Config.h:86
A file that contains the configuration information for each development environment.
void * Alloc(size_t n, size_t algn) noexcept
Allocates a memory block with a specific alignment.
Definition: FrameHeap.h:60
AllocOption
Specifies which side of the heap to allocate from.
Definition: FrameHeap.h:19
#define NLIB_FINAL
Defines final if it is available for use. If not, holds an empty string.
Definition: Config.h:211
void * Alloc(size_t n) noexcept
Allocates a memory block.
Definition: FrameHeap.h:59
int errno_t
Indicates with an int-type typedef that a POSIX error value is returned as the return value...
Definition: NMalloc.h:24