mirror of
https://github.com/cloudwu/skynet.git
synced 2026-07-24 20:23:06 +00:00
remove global buffer_pool
This commit is contained in:
@@ -5,13 +5,11 @@ local assert = assert
|
|||||||
|
|
||||||
local BUFFER_LIMIT = 128 * 1024
|
local BUFFER_LIMIT = 128 * 1024
|
||||||
local socket = {} -- api
|
local socket = {} -- api
|
||||||
local buffer_pool = {} -- store all message buffer object
|
|
||||||
local socket_pool = setmetatable( -- store all socket object
|
local socket_pool = setmetatable( -- store all socket object
|
||||||
{},
|
{},
|
||||||
{ __gc = function(p)
|
{ __gc = function(p)
|
||||||
for id,v in pairs(p) do
|
for id,v in pairs(p) do
|
||||||
driver.close(id)
|
driver.close(id)
|
||||||
-- don't need clear v.buffer, because buffer pool will be free at the end
|
|
||||||
p[id] = nil
|
p[id] = nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -53,7 +51,7 @@ socket_message[1] = function(id, size, data)
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local sz = driver.push(s.buffer, buffer_pool, data, size)
|
local sz = driver.push(s.buffer, s.pool, data, size)
|
||||||
local rr = s.read_required
|
local rr = s.read_required
|
||||||
local rrt = type(rr)
|
local rrt = type(rr)
|
||||||
if rrt == "number" then
|
if rrt == "number" then
|
||||||
@@ -69,7 +67,6 @@ socket_message[1] = function(id, size, data)
|
|||||||
else
|
else
|
||||||
if s.buffer_limit and sz > s.buffer_limit then
|
if s.buffer_limit and sz > s.buffer_limit then
|
||||||
skynet.error(string.format("socket buffer overflow: fd=%d size=%d", id , sz))
|
skynet.error(string.format("socket buffer overflow: fd=%d size=%d", id , sz))
|
||||||
driver.clear(s.buffer,buffer_pool)
|
|
||||||
driver.close(id)
|
driver.close(id)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@@ -192,6 +189,7 @@ local function connect(id, func)
|
|||||||
local s = {
|
local s = {
|
||||||
id = id,
|
id = id,
|
||||||
buffer = newbuffer,
|
buffer = newbuffer,
|
||||||
|
pool = newbuffer and {},
|
||||||
connected = false,
|
connected = false,
|
||||||
connecting = true,
|
connecting = true,
|
||||||
read_required = false,
|
read_required = false,
|
||||||
@@ -234,7 +232,6 @@ end
|
|||||||
function socket.shutdown(id)
|
function socket.shutdown(id)
|
||||||
local s = socket_pool[id]
|
local s = socket_pool[id]
|
||||||
if s then
|
if s then
|
||||||
driver.clear(s.buffer,buffer_pool)
|
|
||||||
-- the framework would send SKYNET_SOCKET_TYPE_CLOSE , need close(id) later
|
-- the framework would send SKYNET_SOCKET_TYPE_CLOSE , need close(id) later
|
||||||
driver.shutdown(id)
|
driver.shutdown(id)
|
||||||
end
|
end
|
||||||
@@ -252,8 +249,6 @@ function socket.close(id)
|
|||||||
end
|
end
|
||||||
if s.connected then
|
if s.connected then
|
||||||
driver.close(id)
|
driver.close(id)
|
||||||
-- notice: call socket.close in __gc should be carefully,
|
|
||||||
-- because skynet.wait never return in __gc, so driver.clear may not be called
|
|
||||||
if s.co then
|
if s.co then
|
||||||
-- reading this socket on another coroutine, so don't shutdown (clear the buffer) immediately
|
-- reading this socket on another coroutine, so don't shutdown (clear the buffer) immediately
|
||||||
-- wait reading coroutine read the buffer.
|
-- wait reading coroutine read the buffer.
|
||||||
@@ -265,7 +260,6 @@ function socket.close(id)
|
|||||||
end
|
end
|
||||||
s.connected = false
|
s.connected = false
|
||||||
end
|
end
|
||||||
driver.clear(s.buffer,buffer_pool)
|
|
||||||
assert(s.lock == nil or next(s.lock) == nil)
|
assert(s.lock == nil or next(s.lock) == nil)
|
||||||
socket_pool[id] = nil
|
socket_pool[id] = nil
|
||||||
end
|
end
|
||||||
@@ -275,7 +269,7 @@ function socket.read(id, sz)
|
|||||||
assert(s)
|
assert(s)
|
||||||
if sz == nil then
|
if sz == nil then
|
||||||
-- read some bytes
|
-- read some bytes
|
||||||
local ret = driver.readall(s.buffer, buffer_pool)
|
local ret = driver.readall(s.buffer, s.pool)
|
||||||
if ret ~= "" then
|
if ret ~= "" then
|
||||||
return ret
|
return ret
|
||||||
end
|
end
|
||||||
@@ -286,7 +280,7 @@ function socket.read(id, sz)
|
|||||||
assert(not s.read_required)
|
assert(not s.read_required)
|
||||||
s.read_required = 0
|
s.read_required = 0
|
||||||
suspend(s)
|
suspend(s)
|
||||||
ret = driver.readall(s.buffer, buffer_pool)
|
ret = driver.readall(s.buffer, s.pool)
|
||||||
if ret ~= "" then
|
if ret ~= "" then
|
||||||
return ret
|
return ret
|
||||||
else
|
else
|
||||||
@@ -294,22 +288,22 @@ function socket.read(id, sz)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local ret = driver.pop(s.buffer, buffer_pool, sz)
|
local ret = driver.pop(s.buffer, s.pool, sz)
|
||||||
if ret then
|
if ret then
|
||||||
return ret
|
return ret
|
||||||
end
|
end
|
||||||
if not s.connected then
|
if not s.connected then
|
||||||
return false, driver.readall(s.buffer, buffer_pool)
|
return false, driver.readall(s.buffer, s.pool)
|
||||||
end
|
end
|
||||||
|
|
||||||
assert(not s.read_required)
|
assert(not s.read_required)
|
||||||
s.read_required = sz
|
s.read_required = sz
|
||||||
suspend(s)
|
suspend(s)
|
||||||
ret = driver.pop(s.buffer, buffer_pool, sz)
|
ret = driver.pop(s.buffer, s.pool, sz)
|
||||||
if ret then
|
if ret then
|
||||||
return ret
|
return ret
|
||||||
else
|
else
|
||||||
return false, driver.readall(s.buffer, buffer_pool)
|
return false, driver.readall(s.buffer, s.pool)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -317,34 +311,34 @@ function socket.readall(id)
|
|||||||
local s = socket_pool[id]
|
local s = socket_pool[id]
|
||||||
assert(s)
|
assert(s)
|
||||||
if not s.connected then
|
if not s.connected then
|
||||||
local r = driver.readall(s.buffer, buffer_pool)
|
local r = driver.readall(s.buffer, s.pool)
|
||||||
return r ~= "" and r
|
return r ~= "" and r
|
||||||
end
|
end
|
||||||
assert(not s.read_required)
|
assert(not s.read_required)
|
||||||
s.read_required = true
|
s.read_required = true
|
||||||
suspend(s)
|
suspend(s)
|
||||||
assert(s.connected == false)
|
assert(s.connected == false)
|
||||||
return driver.readall(s.buffer, buffer_pool)
|
return driver.readall(s.buffer, s.pool)
|
||||||
end
|
end
|
||||||
|
|
||||||
function socket.readline(id, sep)
|
function socket.readline(id, sep)
|
||||||
sep = sep or "\n"
|
sep = sep or "\n"
|
||||||
local s = socket_pool[id]
|
local s = socket_pool[id]
|
||||||
assert(s)
|
assert(s)
|
||||||
local ret = driver.readline(s.buffer, buffer_pool, sep)
|
local ret = driver.readline(s.buffer, s.pool, sep)
|
||||||
if ret then
|
if ret then
|
||||||
return ret
|
return ret
|
||||||
end
|
end
|
||||||
if not s.connected then
|
if not s.connected then
|
||||||
return false, driver.readall(s.buffer, buffer_pool)
|
return false, driver.readall(s.buffer, s.pool)
|
||||||
end
|
end
|
||||||
assert(not s.read_required)
|
assert(not s.read_required)
|
||||||
s.read_required = sep
|
s.read_required = sep
|
||||||
suspend(s)
|
suspend(s)
|
||||||
if s.connected then
|
if s.connected then
|
||||||
return driver.readline(s.buffer, buffer_pool, sep)
|
return driver.readline(s.buffer, s.pool, sep)
|
||||||
else
|
else
|
||||||
return false, driver.readall(s.buffer, buffer_pool)
|
return false, driver.readall(s.buffer, s.pool)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -415,7 +409,6 @@ end
|
|||||||
function socket.abandon(id)
|
function socket.abandon(id)
|
||||||
local s = socket_pool[id]
|
local s = socket_pool[id]
|
||||||
if s then
|
if s then
|
||||||
driver.clear(s.buffer,buffer_pool)
|
|
||||||
s.connected = false
|
s.connected = false
|
||||||
wakeup(s)
|
wakeup(s)
|
||||||
socket_pool[id] = nil
|
socket_pool[id] = nil
|
||||||
|
|||||||
Reference in New Issue
Block a user