README

#resource — 资源管理层

MoonDES 层级3:独占/容量/抢占三类资源模型。

#API 概览

符号说明
Resource通用资源
ResourceKind资源类型(Exclusive / Capacity / Preemptive)
ResourceRequest资源申请请求
new_exclusive(name=)创建独占式资源
new_capacity(name=, capacity=)创建共享容量资源
new_preemptive(name=)创建抢占式资源
Resource::request(pid=, callback=, on_preempt=)请求资源
Resource::release()释放资源
Resource::is_available()资源是否可用

#示例

///|
test {
let res = new_exclusive(name="lock")
inspect(res.is_available(), content="true")
let granted = res.request(pid=1, callback=fn() { () })
inspect(granted, content="true")
inspect(res.is_available(), content="false")
res.release()
inspect(res.is_available(), content="true")
}

///|
test {
let res = new_preemptive(name="channel")
let log : Array[String] = []
ignore(
res.request(pid=1, priority=5, callback=fn() { log.push("low") }, on_preempt=fn() {
log.push("preempted")
}),
)
ignore(res.request(pid=2, priority=1, callback=fn() { log.push("high") }))
assert_eq(log[1], "preempted")
assert_eq(log[2], "high")
}

#
Resource

pub(all) struct Resource {
name : String
kind : ResourceKind
capacity : Int
in_use : Int
wait_queue : Array[ResourceRequest]
holder : ResourceRequest?
}

通用资源管理

内置独占式、共享容量、优先级抢占三类资源模型, 自动实现资源申请、排队等待、释放、队列排序。 Preemptive 资源支持高优先级进程抢占低优先级持有者。

#
Resource::in_use_count

fn Resource::in_use_count(self : Resource) -> Int

当前使用量

#
Resource::is_available

fn Resource::is_available(self : Resource) -> Bool

资源是否可用

#
Resource::queue_length

fn Resource::queue_length(self : Resource) -> Int

等待队列长度

#
Resource::release

fn Resource::release(self : Resource) -> Unit

释放资源:如果有等待进程则唤醒优先级最高的

#
Resource::request

fn Resource::request(self : Resource, pid~ : Int, priority? : Int, callback~ : () -> Unit, on_preempt? : () -> Unit) -> Bool

请求资源:如果可用则立即分配,否则加入等待队列

对于 Preemptive 资源,若新请求优先级高于当前持有者,则抢占之: 调用被抢占者的 on_preempt 回调,将其重新入队,新请求立即获取资源。

返回 true 表示立即获取,false 表示排队等待

#
ResourceKind

pub(all) enum ResourceKind {
Exclusive
Capacity(Int)
Preemptive
} derive(Eq,
Debug
)

资源类型

#
ResourceRequest

pub(all) struct ResourceRequest {
process_id : Int
priority : Int
callback : () -> Unit
on_preempt : () -> Unit
}

资源申请请求

#
new_capacity

fn new_capacity(name~ : String, capacity~ : Int) -> Resource

创建共享容量资源

#
new_exclusive

fn new_exclusive(name~ : String) -> Resource

创建独占式资源(容量为 1)

#
new_preemptive

fn new_preemptive(name~ : String) -> Resource

创建优先级抢占资源

Source Files