11 #include "gu_string.hpp"
12 #include "gu_fdesc.hpp"
13 #include "gu_mmap.hpp"
15 #include "gu_vector.hpp"
17 #include "gu_macros.h"
18 #include "gu_limits.h"
34 virtual void print(std::ostream& os)
const = 0;
40 typedef unsigned int page_size_type;
41 typedef page_size_type heap_size_type;
45 byte_t* reserved = NULL,
46 page_size_type reserved_size = 0,
47 heap_size_type max_heap = (1U << 22),
48 page_size_type disk_page_size = (1U << 26));
53 byte_t*
alloc (page_size_type
const size,
bool& new_page);
56 size_t size ()
const {
return size_; }
59 size_t count()
const {
return pages_->size(); }
61 #ifdef GU_ALLOCATOR_DEBUG
65 size_t gather (std::vector<Buf>& out)
const;
70 static size_t const INITIAL_VECTOR_SIZE = 4;
78 Page (byte_t* ptr,
size_t size)
86 byte_t*
alloc (
size_t size)
90 if (gu_likely(size <= left_))
100 const byte_t* base()
const {
return base_ptr_; }
101 ssize_t size()
const {
return ptr_ - base_ptr_; }
107 page_size_type left_;
109 Page& operator=(
const Page&);
113 class HeapPage :
public Page
117 HeapPage (page_size_type max_size);
119 ~HeapPage () { free (base_ptr_); }
122 class FilePage :
public Page
126 FilePage (
const std::string& name, page_size_type size);
128 ~FilePage () { fd_.unlink(); }
140 Page* new_page (page_size_type size) {
return my_new_page(size); }
144 virtual ~PageStore() {}
148 virtual Page* my_new_page (page_size_type size) = 0;
151 class HeapStore :
public PageStore
155 HeapStore (heap_size_type max) : PageStore(), left_(max) {}
162 static page_size_type
const PAGE_SIZE = GU_PAGE_SIZE * 16;
164 heap_size_type left_;
166 Page* my_new_page (page_size_type
const size);
169 class FileStore :
public PageStore
173 FileStore (
const BaseName& base_name,
174 page_size_type page_size)
177 base_name_(base_name),
178 page_size_(page_size),
184 const BaseName& base_name()
const {
return base_name_; }
185 int size()
const {
return n_; }
189 const BaseName& base_name_;
190 page_size_type
const page_size_;
193 Page* my_new_page (page_size_type
const size);
195 FileStore (
const FileStore&);
196 FileStore& operator= (
const FileStore&);
202 HeapStore heap_store_;
203 FileStore file_store_;
204 PageStore* current_store_;
208 #ifdef GU_ALLOCATOR_DEBUG
210 void add_current_to_bufs();
218 class BaseNameDefault :
public BaseName
222 void print(std::ostream& os)
const { os <<
"alloc"; }
225 static BaseNameDefault
const BASE_NAME_DEFAULT;
230 std::ostream& operator<< (std::ostream& os,
const Allocator::BaseName& bn)
232 bn.print(os);
return os;
byte_t * alloc(page_size_type const size, bool &new_page)
Definition: gu_alloc.hpp:27
Definition: gu_alloc.hpp:31