Fix. Remove easy handle from multi handle

This commit is contained in:
Alexey Melnichuk 2014-09-11 12:27:29 +05:00
parent de4fc1e58b
commit 56a47e12d0

View File

@ -58,11 +58,13 @@ local function make_iterator(self, perform)
end end
local remain = #self._easy local remain = self._easy.n
for _, e in ipairs(self._easy) do for h, e in pairs(self._easy) do
if h ~= 'n' then
e:setopt_writefunction (function(str) buffers:append(e, "data", str) end) e:setopt_writefunction (function(str) buffers:append(e, "data", str) end)
e:setopt_headerfunction(function(str) buffers:append(e, "header", str) end) e:setopt_headerfunction(function(str) buffers:append(e, "header", str) end)
end end
end
assert(perform(self)) assert(perform(self))
@ -78,11 +80,9 @@ local function make_iterator(self, perform)
if n <= remain then if n <= remain then
while true do while true do
local e, ok, err = assert(self:info_read()) local h, ok, err = assert(self:info_read())
if e == 0 then break end if h == 0 then break end
for _, a in ipairs(self._easy) do local e = assert(self._easy[h])
if e == a:handle() then e = a break end
end
if ok then if ok then
ok = e:getinfo_response_code() or ok ok = e:getinfo_response_code() or ok
buffers:append(e, "done", ok) buffers:append(e, "done", ok)
@ -90,7 +90,6 @@ local function make_iterator(self, perform)
end end
remain = n remain = n
end end
end end
end end
end end
@ -276,7 +275,7 @@ local add_handle = wrap_function("add_handle")
local remove_handle = wrap_function("remove_handle") local remove_handle = wrap_function("remove_handle")
function Multi:__init() function Multi:__init()
self._easy = {} self._easy = {n = 0}
return self return self
end end
@ -285,14 +284,26 @@ function Multi:perform()
end end
function Multi:add_handle(e) function Multi:add_handle(e)
self._easy = self._easy or {} assert(self._easy.n >= 0)
self._easy[#self._easy + 1] = e
return add_handle(self, e:handle()) local h = e:handle()
if self._easy[h] then return self end
local ok, err = add_handle(self, h)
if not ok then return nil, err end
self._easy[h], self._easy.n = e, self._easy.n + 1
return self
end end
function Multi:remove_handle(e) function Multi:remove_handle(e)
self._easy[#self._easy + 1] = e local h = e:handle()
return remove_handle(self, e:handle())
if self._easy[h] then
self._easy[h], self._easy.n = nil, self._easy.n - 1
end
assert(self._easy.n >= 0)
return remove_handle(self, h)
end end
end end
@ -348,7 +359,7 @@ end
local Multi = class(curl.multi) do local Multi = class(curl.multi) do
function Multi:__init() function Multi:__init()
self._easy = {} self._easy = {n = 0}
return self return self
end end
@ -356,17 +367,30 @@ function Multi:iperform()
return make_iterator(self, self.perform) return make_iterator(self, self.perform)
end end
local add_handle = wrap_function("add_handle")
function Multi:add_handle(e) function Multi:add_handle(e)
self._easy[#self._easy + 1] = e assert(self._easy.n >= 0)
return add_handle(self, e:handle())
local h = e:handle()
if self._easy[h] then return self end
local ok, err = add_handle(self, h)
if not ok then return nil, err end
self._easy[h], self._easy.n = e, self._easy.n + 1
return self
end end
local remove_handle = wrap_function("remove_handle")
function Multi:remove_handle(e) function Multi:remove_handle(e)
self._easy[#self._easy + 1] = e local h = e:handle()
return remove_handle(self, e:handle())
if self._easy[h] then
self._easy[h], self._easy.n = nil, self._easy.n - 1
end end
assert(self._easy.n >= 0)
return remove_handle(self, h)
end
--! @fixme Multi:info_read(true) should also remove easy handle from self._easy
end end
------------------------------------------- -------------------------------------------