///|
/// 资源类型
pub(all) enum ResourceKind {
Exclusive // 独占式(如泵站机组)
Capacity(Int) // 共享容量(如管网输水限额)
Preemptive // 优先级抢占(如调度通道)
} derive(Debug, Eq)
///|
/// 资源申请请求
pub(all) struct ResourceRequest {
process_id : @core.ProcessId
priority : Int
callback : () -> Unit
on_preempt : () -> Unit
}
///|
/// 通用资源管理
///
/// 内置独占式、共享容量、优先级抢占三类资源模型,
/// 自动实现资源申请、排队等待、释放、队列排序。
/// Preemptive 资源支持高优先级进程抢占低优先级持有者。
pub(all) struct Resource {
name : String
kind : ResourceKind
mut capacity : Int
mut in_use : Int
// 等待队列:按优先级排序
wait_queue : Array[ResourceRequest]
// Preemptive 资源的当前持有者(用于抢占)
mut holder : ResourceRequest?
}
///|
/// 创建独占式资源(容量为 1)
pub fn new_exclusive(name~ : String) -> Resource {
{
name,
kind: Exclusive,
capacity: 1,
in_use: 0,
wait_queue: [],
holder: None,
}
}
///|
/// 创建共享容量资源
pub fn new_capacity(name~ : String, capacity~ : Int) -> Resource {
{
name,
kind: Capacity(capacity),
capacity,
in_use: 0,
wait_queue: [],
holder: None,
}
}
///|
/// 创建优先级抢占资源
pub fn new_preemptive(name~ : String) -> Resource {
{
name,
kind: Preemptive,
capacity: 1,
in_use: 0,
wait_queue: [],
holder: None,
}
}
///|
/// 请求资源:如果可用则立即分配,否则加入等待队列
///
/// 对于 Preemptive 资源,若新请求优先级高于当前持有者,则抢占之:
/// 调用被抢占者的 `on_preempt` 回调,将其重新入队,新请求立即获取资源。
///
/// 返回 true 表示立即获取,false 表示排队等待
pub fn Resource::request(
self : Resource,
pid~ : @core.ProcessId,
priority? : Int = 0,
callback~ : () -> Unit,
on_preempt? : () -> Unit = fn() { () },
) -> Bool {
let req : ResourceRequest = {
process_id: pid,
priority,
callback,
on_preempt,
}
if self.in_use < self.capacity {
// 资源可用,直接分配
self.in_use = self.in_use + 1
if self.kind is Preemptive {
self.holder = Some(req)
}
callback()
true
} else if self.kind is Preemptive {
// Preemptive 资源已满,检查是否可以抢占
match self.holder {
Some(holder) =>
if req.priority < holder.priority {
// 抢占成功:通知旧持有者,重新入队,新请求获取资源
(holder.on_preempt)()
self._insert_sorted(holder)
self.holder = Some(req)
callback()
true
} else {
// 优先级不够,排队等待
self._insert_sorted(req)
false
}
None => {
// 异常状态(in_use >= capacity 但无 holder),直接分配
self.in_use = self.in_use + 1
self.holder = Some(req)
callback()
true
}
}
} else {
// 非抢占资源,排队等待
self._insert_sorted(req)
false
}
}
///|
/// 释放资源:如果有等待进程则唤醒优先级最高的
pub fn Resource::release(self : Resource) -> Unit {
if self.in_use > 0 {
self.in_use = self.in_use - 1
}
// Preemptive 资源释放后清空 holder
if self.kind is Preemptive && self.in_use == 0 {
self.holder = None
}
// 唤醒等待队列中的下一个进程
if self.wait_queue.length() > 0 && self.in_use < self.capacity {
let req = self.wait_queue.remove(0)
self.in_use = self.in_use + 1
if self.kind is Preemptive {
self.holder = Some(req)
}
(req.callback)()
}
}
///|
/// 当前使用量
pub fn Resource::in_use_count(self : Resource) -> Int {
self.in_use
}
///|
/// 等待队列长度
pub fn Resource::queue_length(self : Resource) -> Int {
self.wait_queue.length()
}
///|
/// 资源是否可用
pub fn Resource::is_available(self : Resource) -> Bool {
self.in_use < self.capacity
}
///|
/// 按优先级插入等待队列(优先级数值小者排前)
fn Resource::_insert_sorted(self : Resource, req : ResourceRequest) -> Unit {
let mut idx = self.wait_queue.length()
for i in 0..