mirror of
https://github.com/bjc/prosody.git
synced 2025-04-01 20:27:39 +03:00
util.indexedbheap: Fix heap datastructure corruption in :reschedule(smaller_value)
This commit is contained in:
parent
c313b10cd9
commit
80beeeb187
2 changed files with 34 additions and 1 deletions
33
spec/util_indexedbheap_spec.lua
Normal file
33
spec/util_indexedbheap_spec.lua
Normal file
|
@ -0,0 +1,33 @@
|
|||
local ibh = require"util.indexedbheap";
|
||||
|
||||
local function verify_heap_property(priorities)
|
||||
for k in ipairs(priorities) do
|
||||
local parent = priorities[k];
|
||||
local childA = priorities[2*k];
|
||||
local childB = priorities[2*k+1];
|
||||
-- print("-", parent, childA, childB)
|
||||
assert(childA == nil or childA > parent, "heap property violated");
|
||||
assert(childB == nil or childB > parent, "heap property violated");
|
||||
end
|
||||
end
|
||||
|
||||
local h
|
||||
setup(function ()
|
||||
h = ibh.create();
|
||||
end)
|
||||
describe("util.indexedbheap", function ()
|
||||
it("item can be moved from end to top", function ()
|
||||
verify_heap_property(h);
|
||||
h:insert("a", 1);
|
||||
verify_heap_property(h);
|
||||
h:insert("b", 2);
|
||||
verify_heap_property(h);
|
||||
h:insert("c", 3);
|
||||
verify_heap_property(h);
|
||||
local id = h:insert("*", 10);
|
||||
verify_heap_property(h);
|
||||
h:reprioritize(id, 0);
|
||||
verify_heap_property(h);
|
||||
assert.same({ 0, "*", id }, { h:pop() });
|
||||
end)
|
||||
end);
|
|
@ -23,7 +23,7 @@ local function _percolate_up(self, k, sync, index)
|
|||
local tmp_sync = sync[k];
|
||||
while k ~= 1 do
|
||||
local parent = math_floor(k/2);
|
||||
if tmp < self[parent] then break; end
|
||||
if tmp >= self[parent] then break; end
|
||||
self[k] = self[parent];
|
||||
sync[k] = sync[parent];
|
||||
index[sync[k]] = k;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue