summaryrefslogtreecommitdiff
path: root/script/brave/brave.lua
diff options
context:
space:
mode:
author最萌小汐 <sumneko@hotmail.com>2020-11-20 21:57:09 +0800
committer最萌小汐 <sumneko@hotmail.com>2020-11-20 21:57:09 +0800
commit4ca61ec457822dd14966afa0752340ae8ce180a1 (patch)
treeae8adb1ad82c717868e551e699fd3cf3bb290089 /script/brave/brave.lua
parentc63b2e404d8d2bb984afe3678a5ba2b2836380cc (diff)
downloadlua-language-server-4ca61ec457822dd14966afa0752340ae8ce180a1.zip
no longer beta
Diffstat (limited to 'script/brave/brave.lua')
-rw-r--r--script/brave/brave.lua70
1 files changed, 70 insertions, 0 deletions
diff --git a/script/brave/brave.lua b/script/brave/brave.lua
new file mode 100644
index 00000000..08909074
--- /dev/null
+++ b/script/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