Compare commits
No commits in common. "779fda307a73e4047eee32e672c7fd3a451c356c" and "6de7753b4c66c42c0b759541ce22892ee643157d" have entirely different histories.
779fda307a
...
6de7753b4c
@ -7,7 +7,6 @@
|
||||
#include <luna/Alignment.h>
|
||||
#include <luna/LinkedList.h>
|
||||
#include <luna/SafeArithmetic.h>
|
||||
#include <luna/ScopeGuard.h>
|
||||
#include <luna/String.h>
|
||||
#include <luna/SystemError.h>
|
||||
|
||||
@ -37,9 +36,7 @@ static DoublyLinkedList<HeapBlock> heap;
|
||||
static Result<HeapBlock*> allocate_pages(usize count)
|
||||
{
|
||||
u64 virt = TRY(KernelVM::alloc_several_pages(count));
|
||||
auto vm_guard = make_scope_guard([&] { KernelVM::free_several_pages(virt, count).value(); });
|
||||
void* const ptr = (void*)TRY(MemoryManager::alloc_at(virt, count, MMU::ReadWrite | MMU::NoExecute));
|
||||
vm_guard.deactivate();
|
||||
return (HeapBlock*)ptr;
|
||||
}
|
||||
|
||||
|
@ -4,7 +4,6 @@
|
||||
#include "arch/MMU.h"
|
||||
#include "memory/KernelVM.h"
|
||||
#include "memory/MemoryManager.h"
|
||||
#include <luna/ScopeGuard.h>
|
||||
#include <luna/Stack.h>
|
||||
|
||||
static Thread g_idle;
|
||||
@ -45,19 +44,12 @@ namespace Scheduler
|
||||
return &g_idle;
|
||||
}
|
||||
|
||||
Result<void> new_kernel_thread_impl(Thread* thread)
|
||||
Result<void> kernel_thread_alloc_stack_and_append_impl(Thread* thread)
|
||||
{
|
||||
// If anything fails, make sure to clean up.
|
||||
auto thread_guard = make_scope_guard([&] { delete thread; });
|
||||
|
||||
// FIXME: We will leak the thread if VM allocation or alloc_at fail.
|
||||
u64 thread_stack_vm = TRY(KernelVM::alloc_several_pages(4));
|
||||
auto vm_guard = make_scope_guard([&] { KernelVM::free_several_pages(thread_stack_vm, 4).value(); });
|
||||
|
||||
TRY(MemoryManager::alloc_at(thread_stack_vm, 4, MMU::NoExecute | MMU::ReadWrite));
|
||||
|
||||
thread_guard.deactivate();
|
||||
vm_guard.deactivate();
|
||||
|
||||
Stack thread_stack{thread_stack_vm, ARCH_PAGE_SIZE * 4};
|
||||
thread->set_sp(thread_stack.top());
|
||||
|
||||
@ -74,7 +66,7 @@ namespace Scheduler
|
||||
thread->init_regs_kernel();
|
||||
thread->set_ip(address);
|
||||
|
||||
return new_kernel_thread_impl(thread);
|
||||
return kernel_thread_alloc_stack_and_append_impl(thread);
|
||||
}
|
||||
|
||||
Result<void> new_kernel_thread(void (*func)(void))
|
||||
@ -83,7 +75,7 @@ namespace Scheduler
|
||||
thread->init_regs_kernel();
|
||||
thread->set_ip((u64)func);
|
||||
|
||||
return new_kernel_thread_impl(thread);
|
||||
return kernel_thread_alloc_stack_and_append_impl(thread);
|
||||
}
|
||||
|
||||
Result<void> new_kernel_thread(void (*func)(void*), void* arg)
|
||||
@ -93,7 +85,7 @@ namespace Scheduler
|
||||
thread->set_ip((u64)func);
|
||||
thread->set_arguments((u64)arg, 0, 0, 0);
|
||||
|
||||
return new_kernel_thread_impl(thread);
|
||||
return kernel_thread_alloc_stack_and_append_impl(thread);
|
||||
}
|
||||
|
||||
Thread* pick_task()
|
||||
|
@ -1,28 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
template <typename Callback> class ScopeGuard
|
||||
{
|
||||
public:
|
||||
ScopeGuard(const Callback& callback) : m_callback(callback)
|
||||
{
|
||||
}
|
||||
|
||||
void deactivate()
|
||||
{
|
||||
m_activated = false;
|
||||
}
|
||||
|
||||
~ScopeGuard()
|
||||
{
|
||||
if (m_activated) m_callback();
|
||||
}
|
||||
|
||||
private:
|
||||
bool m_activated{true};
|
||||
Callback m_callback;
|
||||
};
|
||||
|
||||
template <typename Callback> [[nodiscard]] ScopeGuard<Callback> make_scope_guard(const Callback& callback)
|
||||
{
|
||||
return {callback};
|
||||
}
|
Loading…
Reference in New Issue
Block a user