bugfix: mongo driver runCommand , and fix socket.close

This commit is contained in:
Cloud Wu
2014-03-12 14:11:45 +08:00
parent 1a7d960a36
commit 7989daf9bb
3 changed files with 91 additions and 22 deletions

View File

@@ -153,7 +153,14 @@ function socket.close(id)
end
if s.connected then
driver.close(s.id)
suspend(s)
if s.co then
-- reading this socket on another coroutine
assert(not s.closing)
s.closing = coroutine.running()
skynet.wait()
else
suspend(s)
end
end
if s.buffer then
driver.clear(s.buffer,buffer_pool)
@@ -162,6 +169,13 @@ function socket.close(id)
socket_pool[id] = nil
end
local function close_socket(s)
if s.closing then
skynet.wakeup(s.closing)
end
return driver.readall(s.buffer, buffer_pool)
end
function socket.read(id, sz)
local s = socket_pool[id]
assert(s)
@@ -170,7 +184,7 @@ function socket.read(id, sz)
return ret
end
if not s.connected then
return false, driver.readall(s.buffer, buffer_pool)
return false, close_socket(s)
end
assert(not s.read_required)
@@ -180,7 +194,7 @@ function socket.read(id, sz)
if ret then
return ret
else
return false, driver.readall(s.buffer, buffer_pool)
return false, close_socket(s)
end
end
@@ -188,14 +202,14 @@ function socket.readall(id)
local s = socket_pool[id]
assert(s)
if not s.connected then
local r = driver.readall(s.buffer, buffer_pool)
local r = close_socket(s)
return r ~= "" and r
end
assert(not s.read_required)
s.read_required = true
suspend(s)
assert(s.connected == false)
return driver.readall(s.buffer, buffer_pool)
return close_socket(s)
end
function socket.readline(id, sep)
@@ -207,7 +221,7 @@ function socket.readline(id, sep)
return ret
end
if not s.connected then
return false, driver.readall(s.buffer, buffer_pool)
return false, close_socket(s)
end
assert(not s.read_required)
s.read_required = sep
@@ -215,7 +229,7 @@ function socket.readline(id, sep)
if s.connected then
return driver.readline(s.buffer, buffer_pool, sep)
else
return false, driver.readall(s.buffer, buffer_pool)
return false, close_socket(s)
end
end