mirror of
https://github.com/cloudwu/skynet.git
synced 2026-07-24 20:23:06 +00:00
add skynet.queue
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
-- This is a deprecated module, use skynet.queue instead.
|
||||
|
||||
local skynet = require "skynet"
|
||||
local c = require "skynet.c"
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ local skynet = {
|
||||
PTYPE_HARBOR = 5,
|
||||
PTYPE_SOCKET = 6,
|
||||
PTYPE_ERROR = 7,
|
||||
PTYPE_QUEUE = 8,
|
||||
PTYPE_QUEUE = 8, -- use in deprecated mqueue, use skynet.queue instead
|
||||
PTYPE_DEBUG = 9,
|
||||
PTYPE_LUA = 10,
|
||||
PTYPE_SNAX = 11,
|
||||
|
||||
33
lualib/skynet/queue.lua
Normal file
33
lualib/skynet/queue.lua
Normal file
@@ -0,0 +1,33 @@
|
||||
local skynet = require "skynet"
|
||||
local coroutine = coroutine
|
||||
local pcall = pcall
|
||||
local table = table
|
||||
|
||||
function skynet.queue()
|
||||
local current_thread
|
||||
local ref = 0
|
||||
local thread_queue = {}
|
||||
return function(f, ...)
|
||||
local thread = coroutine.running()
|
||||
if ref == 0 then
|
||||
current_thread = thread
|
||||
elseif current_thread ~= thread then
|
||||
table.insert(thread_queue, thread)
|
||||
skynet.wait()
|
||||
assert(ref == 0)
|
||||
end
|
||||
ref = ref + 1
|
||||
local ok, err = pcall(f, ...)
|
||||
ref = ref - 1
|
||||
if ref == 0 then
|
||||
current_thread = nil
|
||||
local co = table.remove(thread_queue,1)
|
||||
if co then
|
||||
skynet.wakeup(co)
|
||||
end
|
||||
end
|
||||
assert(ok,err)
|
||||
end
|
||||
end
|
||||
|
||||
return skynet.queue
|
||||
Reference in New Issue
Block a user