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) {
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;
30 for (; i
< kernel_memory
.count
-1; i
++) {
31 if ((int)kernel_memory
[i
+1].start
- (int)kernel_memory
[i
].end
>= size
) {
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;
45 if ((int)kernel_memory
[i
].end
+ size
> memory_size
) return 0;
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;
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
);