tracefile.c: Seek fix
authorMathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Thu, 25 Nov 2010 15:04:27 +0000 (10:04 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Thu, 25 Nov 2010 15:04:27 +0000 (10:04 -0500)
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>
ltt/tracefile.c

index 0d8a248eb859900525e528445520119247ecc485..012ce10801ec27cf63819614a477ccf5fa173e3d 100644 (file)
@@ -1094,8 +1094,11 @@ int ltt_tracefile_seek_time(LttTracefile *tf, LttTime time)
       }
 
     } 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;
This page took 0.024757 seconds and 4 git commands to generate.