summaryrefslogtreecommitdiff
path: root/script-beta/src/brave/brave.lua
diff options
context:
space:
mode:
Diffstat (limited to 'script-beta/src/brave/brave.lua')
-rw-r--r--script-beta/src/brave/brave.lua70
1 files changed, 70 insertions, 0 deletions
diff --git a/script-beta/src/brave/brave.lua b/script-beta/src/brave/brave.lua
new file mode 100644
index 00000000..08909074
--- /dev/null
+++ b/script-beta/src/brave/brave.lua
@@ -0,0 +1,70 @@
+local thread = require 'bee.thread'
+
+---@class pub_brave
+local m = {}
+m.type = 'brave'
+m.ability = {}
+m.queue = {}
+
+--- 注册成为勇者
+function m.register(id)
+ m.taskpad = thread.channel('taskpad' .. id)
+ m.waiter = thread.channel('waiter' .. id)
+ m.id = id
+
+ if #m.queue > 0 then
+ for _, info in ipairs(m.queue) do
+ m.waiter:push(info.name, info.params)
+ end
+ end
+ m.queue = nil
+
+ m.start()
+end
+
+--- 注册能力
+function m.on(name, callback)
+ m.ability[name] = callback
+end
+
+--- 报告
+function m.push(name, params)
+ if m.waiter then
+ m.waiter:push(name, params)
+ else
+ m.queue[#m.queue+1] = {
+ name = name,
+ params = params,
+ }
+ end
+end
+
+--- 开始找工作
+function m.start()
+ m.push('mem', collectgarbage 'count')
+ while true do
+ local suc, name, id, params = m.taskpad:pop()
+ if not suc then
+ -- 找不到工作的勇者,只好睡觉
+ thread.sleep(0.001)
+ goto CONTINUE
+ end
+ local ability = m.ability[name]
+ -- TODO
+ if not ability then
+ m.waiter:push(id)
+ log.error('Brave can not handle this work: ' .. name)
+ goto CONTINUE
+ end
+ local ok, res = xpcall(ability, log.error, params)
+ if ok then
+ m.waiter:push(id, res)
+ else
+ m.waiter:push(id)
+ end
+ m.push('mem', collectgarbage 'count')
+ ::CONTINUE::
+ end
+end
+
+return m