From ce1b5046c65ad3c11ecb73c7bcabf0ab4e9f832f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=A3=8E?= Date: Mon, 13 Aug 2012 23:28:23 +0800 Subject: [PATCH] bugfix: timeout --- lualib/skynet.lua | 23 ++++++++++++++++++----- service/testtimer.lua | 5 +++++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/lualib/skynet.lua b/lualib/skynet.lua index b38f5a54..237f9faf 100644 --- a/lualib/skynet.lua +++ b/lualib/skynet.lua @@ -17,6 +17,7 @@ local function suspend(co, result, command, param, size) local co_session = session_coroutine_id[co] local co_address = session_coroutine_address[co] c.send(co_address, co_session, param, size) + return suspend(co, coroutine.resume(co)) else assert(command == nil, command) session_coroutine_id[co] = nil @@ -28,15 +29,21 @@ function skynet.timeout(ti, func, ...) local session = c.command("TIMEOUT",tostring(ti)) assert(session) session = tonumber(session) - local co = coroutine.create(func) + local co + if select("#",...) == 0 then + co = coroutine.create(func) + else + local args = { ... } + co = coroutine.create(function() + func(unpack(args)) + end) + end assert(session_id_coroutine[session] == nil) session_id_coroutine[session] = co - suspend(co, coroutine.resume(co, ...)) end -function skynet.yield() - local session = c.command("TIMEOUT","0") - coroutine.yield("SLEEP", tonumber(session)) +function skynet.fork(func,...) + skynet.timeout("0", func, ...) end function skynet.sleep(ti) @@ -45,6 +52,12 @@ function skynet.sleep(ti) coroutine.yield("SLEEP", tonumber(session)) end +function skynet.yield() + local session = c.command("TIMEOUT","0") + assert(session) + coroutine.yield("SLEEP", tonumber(session)) +end + function skynet.register(name) return c.command("REG", name) end diff --git a/service/testtimer.lua b/service/testtimer.lua index 0f6fc004..54c289e4 100644 --- a/service/testtimer.lua +++ b/service/testtimer.lua @@ -3,7 +3,12 @@ local skynet = require "skynet" -- register a dummy callback function skynet.dispatch() +local function timeout(t) + print(t) +end + skynet.start(function() + skynet.timeout(500, timeout, "Hello World") for i = 1, 10 do print(i) skynet.sleep(100)