Block-Structured AMR Software Framework
AMReX_DArena.H
Go to the documentation of this file.
1 #ifndef AMREX_D_ARENA_H_
2 #define AMREX_D_ARENA_H_
3 #include <AMReX_Config.H>
4 
5 #include <AMReX_Arena.H>
6 
7 #include <cstddef>
8 #include <unordered_set>
9 #include <unordered_map>
10 #include <array>
11 #include <mutex>
12 
13 namespace amrex {
14 
15 /*
16  * \brief Buddy memory allocator
17  */
18 
19 class DArena
20  : public Arena
21 {
22 public:
23 
24  DArena (std::size_t max_size, std::size_t max_block_size, ArenaInfo info);
25 
26  DArena (DArena const&) = delete;
27  DArena (DArena &&) = delete;
28  DArena& operator= (DArena const&) = delete;
29  DArena& operator= (DArena&&) = delete;
30 
31  virtual ~DArena () override;
32 
33  virtual void* alloc (std::size_t nbytes) override final;
34  virtual void free (void* p) override final;
35 
36  std::size_t totalMem () const { return m_max_size; }
37  std::size_t freeMem () const;
38 
39 private:
40  static constexpr int m_max_max_order = 30;
41  // buckets of free blocks
42  std::array<std::unordered_set<std::ptrdiff_t>, m_max_max_order+1> m_free;
43  // map: allocated pointer offset relative to baseptr -> order
44  std::unordered_map<std::ptrdiff_t,int> m_used;
45  std::unordered_map<void*,std::size_t> m_system;
46  char* m_baseptr;
47  std::size_t m_max_size;
48  std::size_t m_block_size;
50  std::mutex m_mutex;
51  bool warning_printed = false;
52 
53  std::ptrdiff_t allocate_order (int order);
54  void deallocate_order (int order, std::ptrdiff_t offset);
55 };
56 
57 }
58 
59 #endif
amrex::DArena::freeMem
std::size_t freeMem() const
Definition: AMReX_DArena.cpp:160
amrex::DArena::~DArena
virtual ~DArena() override
Definition: AMReX_DArena.cpp:53
amrex::DArena::deallocate_order
void deallocate_order(int order, std::ptrdiff_t offset)
Definition: AMReX_DArena.cpp:147
amrex::DArena::m_max_max_order
static constexpr int m_max_max_order
Definition: AMReX_DArena.H:40
amrex::Arena
A virtual base class for objects that manage their own dynamic memory allocation.
Definition: AMReX_Arena.H:84
amrex::DArena::m_block_size
std::size_t m_block_size
Definition: AMReX_DArena.H:48
amrex::DArena::operator=
DArena & operator=(DArena const &)=delete
amrex::ArenaInfo
Definition: AMReX_Arena.H:36
amrex::DArena::DArena
DArena(std::size_t max_size, std::size_t max_block_size, ArenaInfo info)
Definition: AMReX_DArena.cpp:22
AMReX_Arena.H
amrex::DArena::allocate_order
std::ptrdiff_t allocate_order(int order)
Definition: AMReX_DArena.cpp:128
amrex::DArena::m_free
std::array< std::unordered_set< std::ptrdiff_t >, m_max_max_order+1 > m_free
Definition: AMReX_DArena.H:42
amrex::DArena::warning_printed
bool warning_printed
Definition: AMReX_DArena.H:51
amrex::DArena::totalMem
std::size_t totalMem() const
Definition: AMReX_DArena.H:36
amrex::DArena
Definition: AMReX_DArena.H:19
amrex::DArena::m_max_order
int m_max_order
Definition: AMReX_DArena.H:49
amrex::DArena::m_used
std::unordered_map< std::ptrdiff_t, int > m_used
Definition: AMReX_DArena.H:44
amrex::DArena::m_mutex
std::mutex m_mutex
Definition: AMReX_DArena.H:50
amrex::DArena::m_baseptr
char * m_baseptr
Definition: AMReX_DArena.H:46
amrex::DArena::alloc
virtual void * alloc(std::size_t nbytes) override final
Definition: AMReX_DArena.cpp:62
amrex
Definition: AMReX_Amr.cpp:49
amrex::DArena::m_system
std::unordered_map< void *, std::size_t > m_system
Definition: AMReX_DArena.H:45
amrex::DArena::free
virtual void free(void *p) override final
A pure virtual function for deleting the arena pointed to by pt.
Definition: AMReX_DArena.cpp:105
amrex::DArena::m_max_size
std::size_t m_max_size
Definition: AMReX_DArena.H:47