Compare commits

..

No commits in common. "dfebdce689b670114bec3728d5bf170dcc1a0f3e" and "e1d5b7e7b40b828253e50e12f27357fef752a927" have entirely different histories.

7 changed files with 6 additions and 139 deletions

View File

@ -25,7 +25,6 @@ set(SOURCES
src/thread/Thread.cpp
src/thread/ThreadImage.cpp
src/thread/Scheduler.cpp
src/thread/Timer.cpp
src/sys/Syscall.cpp
src/sys/exit.cpp
src/sys/clock_gettime.cpp

View File

@ -1,7 +1,6 @@
#include "Pledge.h"
#include "sys/Syscall.h"
#include "thread/Scheduler.h"
#include "thread/Timer.h"
Result<u64> sys_alarm(Registers*, SyscallArgs args)
{
@ -11,16 +10,9 @@ Result<u64> sys_alarm(Registers*, SyscallArgs args)
TRY(check_pledge(current, Promise::p_stdio));
u64 ticks_left = current->timer ? current->timer->ticks_left() : 0;
u64 time_left = current->alarm_ticks_left;
if (current->timer) Scheduler::remove_from_timer_queue(current->timer);
else
current->timer = TRY(make<Scheduler::Timer>());
current->alarm_ticks_left = seconds * 1000;
current->timer->total_ticks = seconds * 1000;
current->timer->thread = current;
Scheduler::add_to_timer_queue(current->timer);
return ticks_left * 1000;
return time_left * 1000;
}

View File

@ -5,7 +5,6 @@
#include "binfmt/ELF.h"
#include "memory/MemoryManager.h"
#include "thread/ThreadImage.h"
#include "thread/Timer.h"
#include <luna/Alignment.h>
#include <luna/ScopeGuard.h>
#include <luna/Stack.h>
@ -217,12 +216,6 @@ namespace Scheduler
MemoryManager::unmap_owned_and_free_vm(stack.bottom(), stack.bytes() / ARCH_PAGE_SIZE).release_value();
}
if (thread->timer)
{
Scheduler::remove_from_timer_queue(thread->timer);
delete thread->timer;
}
delete thread;
CPU::enable_interrupts();
@ -300,8 +293,6 @@ namespace Scheduler
{
CPU::disable_interrupts();
tick_queue();
if (is_in_kernel(regs)) g_current->kernel_ticks_self++;
else
g_current->user_ticks_self++;
@ -314,6 +305,8 @@ namespace Scheduler
{
if (thread->sleep_ticks_left == 0 || --thread->sleep_ticks_left == 0) thread->wake_up();
}
if (thread->alarm_ticks_left && --thread->alarm_ticks_left == 0) thread->send_signal(SIGALRM);
}
if (!g_current->ticks_left) switch_task(regs);

View File

@ -19,11 +19,6 @@
#error "Unknown architecture."
#endif
namespace Scheduler
{
class Timer;
}
enum class ThreadState
{
None,
@ -65,6 +60,7 @@ struct Thread : public LinkedListNode<Thread>
u64 ticks_left;
u64 sleep_ticks_left;
u64 alarm_ticks_left { 0 };
int promises { -1 };
int execpromises { -1 };
@ -101,8 +97,6 @@ struct Thread : public LinkedListNode<Thread>
mode_t umask { 0 };
Scheduler::Timer* timer { nullptr };
StaticString<128> cmdline;
String current_directory_path = {};

View File

@ -1,72 +0,0 @@
#include "thread/Timer.h"
#include "Log.h"
static LinkedList<Scheduler::Timer> g_timer_queue;
namespace Scheduler
{
void add_to_timer_queue(Timer* timer)
{
timer->delta_ticks = timer->total_ticks;
for (auto* t : g_timer_queue)
{
if (timer->delta_ticks <= t->delta_ticks)
{
t->delta_ticks -= timer->delta_ticks;
g_timer_queue.add_before(t, timer);
return;
}
timer->delta_ticks -= t->delta_ticks;
}
g_timer_queue.append(timer);
}
void remove_from_timer_queue(Timer* timer)
{
auto maybe_next = g_timer_queue.next(timer);
if (maybe_next.has_value())
{
auto next = maybe_next.value();
next->delta_ticks += timer->delta_ticks;
}
g_timer_queue.remove(timer);
}
void tick_queue()
{
auto maybe_first = g_timer_queue.first();
if (!maybe_first.has_value()) return;
auto first = *maybe_first;
first->delta_ticks--;
LinkedList<Scheduler::Timer> timers_to_be_restarted;
g_timer_queue.delayed_for_each([&](Timer* t) {
if (t->delta_ticks == 0)
{
g_timer_queue.remove(t);
t->thread->send_signal(t->signo);
if (t->restart) timers_to_be_restarted.append(t);
return true;
}
return false;
});
timers_to_be_restarted.consume([](Timer* t) { add_to_timer_queue(t); });
}
u64 Timer::ticks_left()
{
u64 total = 0;
for (auto* t : g_timer_queue)
{
total += t->delta_ticks;
if (t == this) break;
}
return total;
}
}

View File

@ -1,23 +0,0 @@
#pragma once
#include "thread/Thread.h"
#include <luna/LinkedList.h>
namespace Scheduler
{
class Timer : public LinkedListNode<Timer>
{
public:
u64 delta_ticks;
u64 total_ticks;
Thread* thread;
int signo { SIGALRM };
bool restart { false };
u64 ticks_left();
};
void add_to_timer_queue(Timer* timer);
void remove_from_timer_queue(Timer* timer);
void tick_queue();
}

View File

@ -108,22 +108,6 @@ template <typename T> class LinkedList
m_count++;
}
void add_before(T* base, T* ptr)
{
Node* const new_node = extract_node(ptr);
Node* const base_node = extract_node(base);
if (m_start_node == base_node) m_start_node = new_node;
if (base_node->get_last()) base_node->get_last()->set_next(new_node);
new_node->set_last(base_node->get_last());
base_node->set_last(new_node);
new_node->set_next(base_node);
m_count++;
}
T* remove(T* ptr)
{
Node* const node = extract_node(ptr);