Made the tracefile.c seek more robust. Fixes a rare crash where high can be
lower than low in a seek.
Matthew Khouzam <matthew.khouzam@ericsson.com>:
I am including an example to better illustrace my fix.
the current binary search has a case where high can be lower then low.
An example: 51 blocks, the element is somewhere in the 12th block.
trace of before :
low : 0, high 51 , block_num -1
low : 0, high 24 , block_num 25
low : 13, high 24 , block_num 12
low : 13, high 17 , block_num 18
low : 13, high 14 , block_num 15
low : 13, high 12 , block_num 13
This will assert and fail.
The trace after will produce the following walkthrough
low : 0, high 51 , block_num -1
low : 0, high 24 , block_num 25
low : 0, high 24 , block_num 12
Found!
Reported-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
}
} else if(ltt_time_compare(time, tf->buffer.begin.timestamp) < 0) {
- /* go to lower part */
- high = block_num - 1;
+ /*
+ * Go to lower part. We don't want block_num - 1 since block_num
+ * can equal low , in which case high < low.
+ */
+ high = block_num;
} else if(ltt_time_compare(time, tf->buffer.end.timestamp) > 0) {
/* go to higher part */
low = block_num + 1;