SimpleKernel 1.17.0
Loading...
Searching...
No Matches
block.cpp
Go to the documentation of this file.
1
5#include <cassert>
6
7#include "kernel_log.hpp"
8#include "resource_id.hpp"
9#include "task_manager.hpp"
10#include "task_messages.hpp"
11
12auto TaskManager::Block(ResourceId resource_id) -> void {
13 auto& cpu_sched = GetCurrentCpuSched();
14
15 auto* current = GetCurrentTask();
16 assert(current != nullptr && "Block: No current task to block");
17 assert(current->GetStatus() == TaskStatus::kRunning &&
18 "Block: current task status must be kRunning");
19
20 {
21 LockGuard<SpinLock> lock_guard(cpu_sched.lock);
22
23 // Check capacity before transitioning FSM
24 auto& list = cpu_sched.blocked_tasks[resource_id];
25 if (list.full()) {
27 "Block: blocked_tasks list full for resource, cannot block task {}",
28 current->pid);
29 // Rollback: task stays kRunning, do not transition FSM
30 return;
31 }
32
33 // Transition: kRunning -> kBlocked
34 current->fsm.Receive(MsgBlock{resource_id});
35 // Record blocked resource
36 current->aux->blocked_on = resource_id;
37 list.push_back(current);
38
39 klog::Debug("Block: pid={} blocked on resource={}, data={:#x}",
40 current->pid, resource_id.GetTypeName(),
41 static_cast<uint64_t>(resource_id.GetData()));
42 }
43
44 // 调度到其他任务
45 Schedule();
46
47 // 任务被唤醒后会从这里继续执行
48}
RAII 风格的锁守卫模板类
Definition spinlock.hpp:131
资源 ID
auto Block(ResourceId resource_id) -> void
阻塞当前任务
Definition block.cpp:12
constexpr etl::fsm_state_id_t kRunning
Definition task_fsm.hpp:16
auto Err(etl::format_string< Args... > fmt, Args &&... args) -> void
以 ERROR 级别记录日志
auto Debug(etl::format_string< Args... > fmt, Args &&... args) -> void
以 DEBUG 级别记录日志(SIMPLEKERNEL_MIN_LOG_LEVEL > 0 时编译期消除)
阻塞消息,携带资源 ID