diff --git a/kernel/include/kernel/Scheduler.h b/kernel/include/kernel/Scheduler.h index 07bbef9b..42a4ffd6 100644 --- a/kernel/include/kernel/Scheduler.h +++ b/kernel/include/kernel/Scheduler.h @@ -26,6 +26,7 @@ namespace Kernel void block_current_thread(Semaphore*); void unblock_threads(Semaphore*); + void unblock_thread(pid_t tid); Thread& current_thread(); static pid_t current_tid(); diff --git a/kernel/kernel/Scheduler.cpp b/kernel/kernel/Scheduler.cpp index 5242a255..a815fe80 100644 --- a/kernel/kernel/Scheduler.cpp +++ b/kernel/kernel/Scheduler.cpp @@ -351,7 +351,26 @@ namespace Kernel it++; } } + } + void Scheduler::unblock_thread(pid_t tid) + { + CriticalScope _; + + for (auto it = m_blocking_threads.begin(); it != m_blocking_threads.end(); it++) + { + if (it->thread->tid() == tid) + { + auto thread = it->thread; + it = m_blocking_threads.remove(it); + + // This should work as we released enough memory from active thread + static_assert(sizeof(ActiveThread) == sizeof(BlockingThread)); + MUST(m_active_threads.emplace_back(thread)); + + return; + } + } } } \ No newline at end of file