Commit 3485b3ef authored by Staffan Gimåker's avatar Staffan Gimåker

Fixed a bug in the mtrie table compaction logic.

Signed-off-by: 's avatarStaffan Gimåker <staffan@spotify.com>
parent 2cd04c54
...@@ -200,16 +200,16 @@ void zmq::mtrie_t::rm_helper (pipe_t *pipe_, unsigned char **buff_, ...@@ -200,16 +200,16 @@ void zmq::mtrie_t::rm_helper (pipe_t *pipe_, unsigned char **buff_,
// If there are multiple subnodes. // If there are multiple subnodes.
// //
// New min non-null character in the node table after the removal // New min non-null character in the node table after the removal
unsigned char new_min = min; unsigned char new_min = min + count - 1;
// New max non-null character in the node table after the removal // New max non-null character in the node table after the removal
unsigned char new_max = min + count - 1; unsigned char new_max = min;
for (unsigned short c = 0; c != count; c++) { for (unsigned short c = 0; c != count; c++) {
(*buff_) [buffsize_] = min + c; (*buff_) [buffsize_] = min + c;
if (next.table [c]) { if (next.table [c]) {
next.table [c]->rm_helper (pipe_, buff_, buffsize_ + 1, next.table [c]->rm_helper (pipe_, buff_, buffsize_ + 1,
maxbuffsize_, func_, arg_); maxbuffsize_, func_, arg_);
// Prune redudant nodes from the mtrie // Prune redundant nodes from the mtrie
if (next.table [c]->is_redundant ()) { if (next.table [c]->is_redundant ()) {
delete next.table [c]; delete next.table [c];
next.table [c] = 0; next.table [c] = 0;
...@@ -218,9 +218,16 @@ void zmq::mtrie_t::rm_helper (pipe_t *pipe_, unsigned char **buff_, ...@@ -218,9 +218,16 @@ void zmq::mtrie_t::rm_helper (pipe_t *pipe_, unsigned char **buff_,
--live_nodes; --live_nodes;
} }
else { else {
if (c + min > new_min) // The node is not redundant, so it's a candidate for being
// the new min/max node.
//
// We loop through the node array from left to right, so the
// first non-null, non-redundant node encountered is the new
// minimum index. Conversely, the last non-redundant, non-null
// node encountered is the new maximum index.
if (c + min < new_min)
new_min = c + min; new_min = c + min;
if (c + min < new_max) if (c + min > new_max)
new_max = c + min; new_max = c + min;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment