From 3327bb7f82e0fed1d90e18e4fe49464a59e03c85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=A3=8E?= Date: Mon, 28 Oct 2013 13:35:28 +0800 Subject: [PATCH] queue lock request in socket, fix issue #51 --- lualib/socket.lua | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/lualib/socket.lua b/lualib/socket.lua index 89985f9e..ed9ce06e 100644 --- a/lualib/socket.lua +++ b/lualib/socket.lua @@ -230,16 +230,15 @@ function socket.lock(id) local s = socket_pool[id] assert(s) local lock_set = s.lock - local co = coroutine.running() if not lock_set then lock_set = {} s.lock = lock_set - lock_set[co] = true - elseif next(lock_set) == nil then - lock_set[co] = true + end + local co = coroutine.running() + if #lock_set == 0 then + lock_set[1] = co else - assert(lock_set[co] == nil) - lock_set[co] = true + table.insert(lock_set, co) skynet.wait() end end @@ -250,18 +249,11 @@ function socket.unlock(id) local lock_set = s.lock assert(lock_set) local co = coroutine.running() - assert(lock_set[co]) - lock_set[co] = nil - while true do - co = next(lock_set) - if co == nil then - break - end - if skynet.wakeup(co) then - break - else - lock_set[co] = nil - end + assert(lock_set[1] == co) + table.remove(lock_set,1) + co = lock_set[1] + if co then + skynet.wakeup(co) end end