3 #include <cstddef> // size_t
9 /// allocate s bytes size-aligned
10 virtual void *alloc(size_t order) = 0;
12 /// free s bytes previously allocated with alloc(s)
13 virtual void free(size_t order, void *p) = 0;
15 virtual void *unaligned_alloc(unsigned long size) = 0;
16 virtual void unaligned_free(unsigned long size, void *p) = 0;
18 virtual void dump() const {}
20 static Mapped_allocator *_alloc;
23 class Mapped_alloc_reaper
25 size_t (*_reap)(bool desperate);
26 Mapped_alloc_reaper* _next;
29 static Mapped_alloc_reaper* mem_reapers;
37 #include "mem_layout.h"
40 // class Mapped_allocator
43 Mapped_allocator* Mapped_allocator::_alloc;
47 Mapped_allocator::allocator()
49 assert (_alloc /* uninitialized use of Mapped_allocator */);
55 Mapped_allocator::allocator(Mapped_allocator *a)
60 PUBLIC inline NEEDS["mem_layout.h"]
61 void Mapped_allocator::free_phys(size_t s, Address p)
63 void *va = (void*)Mem_layout::phys_to_pmem(p);
64 if((unsigned long)va != ~0UL)
68 PUBLIC template< typename Q >
71 Mapped_allocator::q_alloc(Q *quota, size_t order)
73 if (EXPECT_FALSE(!quota->alloc(1UL<<order)))
77 if (EXPECT_FALSE(!(b=alloc(order))))
79 quota->free(1UL<<order);
86 PUBLIC template< typename Q >
89 Mapped_allocator::q_unaligned_alloc(Q *quota, size_t size)
91 if (EXPECT_FALSE(!quota->alloc(size)))
95 if (EXPECT_FALSE(!(b=unaligned_alloc(size))))
104 PUBLIC template< typename Q >
107 Mapped_allocator::q_free_phys(Q *quota, size_t order, Address obj)
109 free_phys(order, obj);
110 quota->free(1UL<<order);
113 PUBLIC template< typename Q >
116 Mapped_allocator::q_free(Q *quota, size_t order, void *obj)
119 quota->free(1UL<<order);
122 PUBLIC template< typename Q >
125 Mapped_allocator::q_unaligned_free(Q *quota, size_t size, void *obj)
127 unaligned_free(size, obj);
132 // class Mapped_alloc_reaper
138 Mapped_alloc_reaper* Mapped_alloc_reaper::mem_reapers;
140 PUBLIC inline NEEDS["atomic.h"]
141 Mapped_alloc_reaper::Mapped_alloc_reaper (size_t (*reap)(bool desperate))
146 } while (! cas (&mem_reapers, _next, this));
151 Mapped_alloc_reaper::morecore (bool desperate = false)
155 for (Mapped_alloc_reaper* reaper = mem_reapers;
157 reaper = reaper->_next)
159 freed += reaper->_reap(desperate);
163 WARN ("morecore freed %lu bytes of memory\n",
164 static_cast<unsigned long>(freed));