- Info
1
6
7
13
14 #ifndef _INCLUDE__BASE__HEAP_H_
15 #define _INCLUDE__BASE__HEAP_H_
16
17 #include <util/list.h>
18 #include <ram_session/ram_session.h>
19 #include <rm_session/rm_session.h>
20 #include <base/allocator_avl.h>
21 #include <base/lock.h>
22
23 namespace Genode {
24
25
31 class Heap : public Allocator
32 {
33 private:
34
35 enum {
36 MIN_CHUNK_SIZE = 4*1024,
37 MAX_CHUNK_SIZE = 1024*1024
38 };
39
40 class Dataspace : public List<Dataspace>::Element
41 {
42 public:
43
44 Ram_dataspace_capability cap;
45 void *local_addr;
46 };
47
48 class Dataspace_pool : public List<Dataspace>
49 {
50 private:
51
52 Ram_session *_ram_session;
53 Rm_session *_rm_session;
54
55 public:
56
57
60 Dataspace_pool(Ram_session *ram_session, Rm_session *rm_session):
61 _ram_session(ram_session), _rm_session(rm_session) { }
62
63
66 ~Dataspace_pool();
67
68
79 int expand(size_t size, Range_allocator *alloc);
80 };
81
82
86
87 Lock _lock;
88 Dataspace_pool _ds_pool;
89 Allocator_avl _alloc;
90 size_t _quota_limit;
91 size_t _quota_used;
92 size_t _chunk_size;
93
94
102 bool _try_local_alloc(size_t size, void **out_addr);
103
104
105 public:
106
107 enum { UNLIMITED = ~0 };
108
109 Heap(Ram_session *ram_session,
110 Rm_session *rm_session,
111 size_t quota_limit = UNLIMITED,
112 void *static_addr = 0,
113 size_t static_size = 0)
114 :
115 _ds_pool(ram_session, rm_session),
116 _quota_limit(quota_limit), _quota_used(0),
117 _chunk_size(MIN_CHUNK_SIZE)
118 {
119 if (static_addr)
120 _alloc.add_range((addr_t)static_addr, static_size);
121 }
122
123
129 int quota_limit(size_t new_quota_limit);
130
131
132
135
136 bool alloc(size_t, void **);
137 void free(void *, size_t);
138 size_t consumed() { return _quota_used; }
139 size_t overhead() { return _alloc.overhead(); }
140 };
141
142
143
146 class Sliced_heap : public Allocator
147 {
148 private:
149
150 class Block;
151
152 Ram_session *_ram_session;
153 Rm_session *_rm_session;
154 size_t _consumed;
155 List<Block> _block_list;
156 Lock _lock;
157
158 public:
159
160
163 Sliced_heap(Ram_session *ram_session, Rm_session *rm_session);
164
165
168 ~Sliced_heap();
169
170
171
174
175 bool alloc(size_t, void **);
176 void free(void *, size_t);
177 size_t consumed() { return _consumed; }
178 size_t overhead();
179 };
180 }
181
182 #endif