diff options
author | 最萌小汐 <sumneko@hotmail.com> | 2019-11-08 14:59:03 +0800 |
---|---|---|
committer | 最萌小汐 <sumneko@hotmail.com> | 2019-11-08 14:59:03 +0800 |
commit | 6b222a0a14135e6f39eb9e80f3c2bf879811ca2c (patch) | |
tree | b9db4a53303fec89dbceab74b0f257f959fe7f5c /server-beta/src | |
parent | d8c8c6ded148a8e130956b08010db3a0cda8585a (diff) | |
download | lua-language-server-6b222a0a14135e6f39eb9e80f3c2bf879811ca2c.zip |
协作模式改为队列
Diffstat (limited to 'server-beta/src')
-rw-r--r-- | server-beta/src/await.lua | 38 | ||||
-rw-r--r-- | server-beta/src/provider/diagnostic.lua | 2 | ||||
-rw-r--r-- | server-beta/src/pub/pub.lua | 8 | ||||
-rw-r--r-- | server-beta/src/service/service.lua | 8 |
4 files changed, 44 insertions, 12 deletions
diff --git a/server-beta/src/await.lua b/server-beta/src/await.lua index ee64e896..37cade79 100644 --- a/server-beta/src/await.lua +++ b/server-beta/src/await.lua @@ -5,6 +5,8 @@ local m = {} m.type = 'await' m.coTracker = setmetatable({}, { __mode = 'k' }) +m.delayQueue = {} +m.delayQueueIndex = 1 --- 设置错误处理器 ---@param errHandle function {comment = '当有错误发生时,会以错误堆栈为参数调用该函数'} @@ -44,8 +46,8 @@ function m.sleep(time, ...) end --- 等待直到唤醒 ----@param waker function -function m.wait(waker, ...) +---@param callback function +function m.wait(callback, ...) local co, main = coroutine.running() if main then if m.errorHandle then @@ -53,10 +55,40 @@ function m.wait(waker, ...) end return end - waker(function (...) + callback(function (...) return m.checkResult(co, coroutine.resume(co, ...)) end) return coroutine.yield(...) end +--- 延迟 +function m.delay(...) + local co, main = coroutine.running() + if main then + if m.errorHandle then + m.errorHandle(debug.traceback('Cant wait in main thread')) + end + return + end + m.delayQueue[#m.delayQueue+1] = function (...) + return m.checkResult(co, coroutine.resume(co, ...)) + end + return coroutine.yield(...) +end + +--- 步进 +function m.step() + local waker = m.delayQueue[m.delayQueueIndex] + if waker then + m.delayQueueIndex = m.delayQueueIndex + 1 + waker() + return true + else + for i = 1, #m.delayQueue do + m.delayQueue[i] = nil + end + return false + end +end + return m diff --git a/server-beta/src/provider/diagnostic.lua b/server-beta/src/provider/diagnostic.lua index 2b4ae9b3..d7d4be1e 100644 --- a/server-beta/src/provider/diagnostic.lua +++ b/server-beta/src/provider/diagnostic.lua @@ -173,7 +173,7 @@ function m.refresh(uri) for destUri in files.eachFile() do if destUri ~= uri then m.doDiagnostic(files.getOriginUri(destUri)) - await.sleep(0.001) + await.delay() if myVersion ~= m.version then return end diff --git a/server-beta/src/pub/pub.lua b/server-beta/src/pub/pub.lua index 3e97fe9f..19800e95 100644 --- a/server-beta/src/pub/pub.lua +++ b/server-beta/src/pub/pub.lua @@ -226,11 +226,9 @@ function m.checkDead() end end -function m.listen() - timer.loop(0.001, function () - m.checkDead() - m.recieve() - end) +function m.step() + m.checkDead() + m.recieve() end return m diff --git a/server-beta/src/service/service.lua b/server-beta/src/service/service.lua index 6ff82897..1d65a1ea 100644 --- a/server-beta/src/service/service.lua +++ b/server-beta/src/service/service.lua @@ -73,8 +73,11 @@ end function m.startTimer() while true do - thread.sleep(0.001) - timer.update() + pub.step() + if not await.step() then + thread.sleep(0.001) + timer.update() + end end end @@ -82,7 +85,6 @@ function m.start() await.setErrorHandle(log.error) pub.recruitBraves(4) proto.listen() - pub.listen() m.report() require 'provider' |