diff --git a/kernel/src/kalloc.cpp b/kernel/src/kalloc.cpp index 6356d1a3..0a4289af 100644 --- a/kernel/src/kalloc.cpp +++ b/kernel/src/kalloc.cpp @@ -10,6 +10,7 @@ #include "physical_allocator.hpp" #include "paging.hpp" #include "e820.hpp" +#include "mutex.hpp" #include "fs/sysfs.hpp" @@ -20,6 +21,8 @@ namespace { const bool DEBUG_MALLOC = false; const bool TRACE_MALLOC = false; +mutex lock; + size_t _used_memory; size_t _allocated_memory; @@ -320,6 +323,18 @@ std::string sysfs_used(){ 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 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/used", &sysfs_used); sysfs::set_dynamic_value("/sys/", "/memory/dynamic/allocated", &sysfs_allocated); + + lock.init(); } void* kalloc::k_malloc(uint64_t bytes){ + malloc_lock(); + auto current = malloc_head->next(); //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); } + malloc_unlock(); + return reinterpret_cast(block_start); } void kalloc::k_free(void* block){ + malloc_lock(); + auto free_header = reinterpret_cast( reinterpret_cast(block) - sizeof(malloc_header_chunk)); @@ -442,6 +465,8 @@ void kalloc::k_free(void* block){ insert_after(malloc_head, free_header); debug_malloc("after free"); + + malloc_unlock(); } size_t kalloc::allocated_memory(){