Protect kalloc

This commit is contained in:
Baptiste Wicht 2014-04-02 20:46:21 +02:00
parent 78554b3242
commit ae0b2463a5

View File

@ -10,6 +10,7 @@
#include "physical_allocator.hpp" #include "physical_allocator.hpp"
#include "paging.hpp" #include "paging.hpp"
#include "e820.hpp" #include "e820.hpp"
#include "mutex.hpp"
#include "fs/sysfs.hpp" #include "fs/sysfs.hpp"
@ -20,6 +21,8 @@ namespace {
const bool DEBUG_MALLOC = false; const bool DEBUG_MALLOC = false;
const bool TRACE_MALLOC = false; const bool TRACE_MALLOC = false;
mutex lock;
size_t _used_memory; size_t _used_memory;
size_t _allocated_memory; size_t _allocated_memory;
@ -320,6 +323,18 @@ std::string sysfs_used(){
return std::to_string(kalloc::used_memory()); return std::to_string(kalloc::used_memory());
} }
void malloc_lock(){
if(scheduler::is_started()){
lock.acquire();
}
}
void malloc_unlock(){
if(scheduler::is_started()){
lock.release();
}
}
} //end of anonymous namespace } //end of anonymous namespace
void kalloc::init(){ void kalloc::init(){
@ -334,9 +349,13 @@ void kalloc::finalize(){
sysfs::set_dynamic_value("/sys/", "/memory/dynamic/free", &sysfs_free); sysfs::set_dynamic_value("/sys/", "/memory/dynamic/free", &sysfs_free);
sysfs::set_dynamic_value("/sys/", "/memory/dynamic/used", &sysfs_used); sysfs::set_dynamic_value("/sys/", "/memory/dynamic/used", &sysfs_used);
sysfs::set_dynamic_value("/sys/", "/memory/dynamic/allocated", &sysfs_allocated); sysfs::set_dynamic_value("/sys/", "/memory/dynamic/allocated", &sysfs_allocated);
lock.init();
} }
void* kalloc::k_malloc(uint64_t bytes){ void* kalloc::k_malloc(uint64_t bytes){
malloc_lock();
auto current = malloc_head->next(); auto current = malloc_head->next();
//Try not to create too small blocks //Try not to create too small blocks
@ -417,10 +436,14 @@ void* kalloc::k_malloc(uint64_t bytes){
printf("m %u(%u) %h ", bytes, current->size(), block_start); printf("m %u(%u) %h ", bytes, current->size(), block_start);
} }
malloc_unlock();
return reinterpret_cast<void*>(block_start); return reinterpret_cast<void*>(block_start);
} }
void kalloc::k_free(void* block){ void kalloc::k_free(void* block){
malloc_lock();
auto free_header = reinterpret_cast<malloc_header_chunk*>( auto free_header = reinterpret_cast<malloc_header_chunk*>(
reinterpret_cast<uintptr_t>(block) - sizeof(malloc_header_chunk)); reinterpret_cast<uintptr_t>(block) - sizeof(malloc_header_chunk));
@ -442,6 +465,8 @@ void kalloc::k_free(void* block){
insert_after(malloc_head, free_header); insert_after(malloc_head, free_header);
debug_malloc<DEBUG_MALLOC>("after free"); debug_malloc<DEBUG_MALLOC>("after free");
malloc_unlock();
} }
size_t kalloc::allocated_memory(){ size_t kalloc::allocated_memory(){