configuration option for kernel's multiboot-compliance
[quarnos.git] / resources / slob.cpp
blob325b280331386e8eaeb13e119eb41f7d2076dfc5
1 #include "slob.h"
2 #include "resource_manager.h"
3 #include "resource_id.h"
5 #include "manes/kernel_state.h"
6 #include "services/service.h"
7 #include "services/service_manager.h"
9 using namespace resources;
11 slob::slob() : res_fs((resource_type*)RESOURCE(slob)), start_heap((void*)0x300000), memory_size(GET_KSTATE()->get_memory_size()) {}
12 extern char *htoa(int);
13 extern bool _static_mem_off;
14 res_buffer *slob::allocate_space(int size) {
15 _static_mem_off = false;
16 if (kernel_memory.count == 0) {
18 memory_block bl;
19 bl.start = (void*)start_heap;
20 bl.end = (void*)((int)start_heap+size);
21 kernel_memory.add(bl);
23 res_buffer* rb = new res_buffer(kernel_memory[0].start, size);
25 _static_mem_off = true;
26 return rb;
29 int i = 0;
30 for (; i < kernel_memory.count-1; i++) {
31 if ((int)kernel_memory[i+1].start - (int)kernel_memory[i].end >= size) {
33 memory_block bl;
34 bl.start = kernel_memory[i].end;
35 bl.end = (void*)((int)kernel_memory[i].end+size);
36 kernel_memory.insert(i + 1, bl);
38 res_buffer* rb = new res_buffer(bl.start, size);
40 _static_mem_off = true;
41 return rb;
45 if ((int)kernel_memory[i].end + size > memory_size) return 0;
47 memory_block bl;
48 bl.start = kernel_memory[i].end;
49 bl.end = (void*)((int)kernel_memory[i].end+size);
50 kernel_memory.add(bl);
52 res_buffer* rb = new res_buffer(bl.start, size);
54 _static_mem_off = true;
55 return rb;
58 void slob::deallocate_space(res_buffer *ptr) {
59 for (int i = 0; i < kernel_memory.count; i++) {
60 if (kernel_memory[i].start == ptr->get_address())
61 kernel_memory.remove(i);
65 void slob::register_resource() {
66 resource_manager *rman = GET_RESOURCES();
68 delegate<manes::object *> *res = new delegate<manes::object *>;
70 res->function(create_object<manes::object,slob>);
71 resource_type *slob_type = new resource_type(resource_type::translator, resource_type::fs_dev,"slob",*res);
72 rman->register_type(slob_type);