Fix. Remove easy handle from multi handle
This commit is contained in:
parent
de4fc1e58b
commit
56a47e12d0
@ -58,10 +58,12 @@ 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
|
||||||
e:setopt_writefunction (function(str) buffers:append(e, "data", str) end)
|
if h ~= 'n' then
|
||||||
e:setopt_headerfunction(function(str) buffers:append(e, "header", str) end)
|
e:setopt_writefunction (function(str) buffers:append(e, "data", 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,18 +367,31 @@ 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
|
||||||
|
assert(self._easy.n >= 0)
|
||||||
|
|
||||||
|
return remove_handle(self, h)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--! @fixme Multi:info_read(true) should also remove easy handle from self._easy
|
||||||
|
|
||||||
end
|
end
|
||||||
-------------------------------------------
|
-------------------------------------------
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user