p = &(*p)->rb_right;
else if (t->bit->sequence < __t->bit->sequence)
p = &(*p)->rb_left;
- else if (t->bit->sequence > __t->bit->sequence)
+ else /* >= sequence */
p = &(*p)->rb_right;
- else if (t->bit->device == __t->bit->device) {
- fprintf(stderr,
- "sequence alias (%d) on device %d,%d!\n",
- t->bit->sequence,
- MAJOR(t->bit->device), MINOR(t->bit->device));
- return 1;
- }
}
rb_link_node(&t->rb_node, parent, p);
}
}
-static int check_sequence(struct per_dev_info *pdi, struct blk_io_trace *bit,
- int force)
+static int check_sequence(struct per_dev_info *pdi, struct blk_io_trace *bit)
{
unsigned long expected_sequence = pdi->last_sequence + 1;
struct trace *t;
__put_trace_last(pdi, t);
return 0;
- } else if (!force)
- return 1;
- else {
+ } else {
skip:
if (print_missing) {
fprintf(stderr, "(%d,%d): skipping %lu -> %u\n",
struct trace *t;
while ((n = rb_first(&rb_sort_root)) != NULL) {
- if (done)
+ if (is_done() && !force)
break;
t = rb_entry(n, struct trace, rb_node);
break;
}
- if (check_sequence(pdi, bit, force))
- break;
+ if (!force) {
+ if (check_sequence(pdi, bit))
+ break;
- if (!force && bit->time > last_allowed_time)
- break;
+ if (bit->time > last_allowed_time)
+ break;
+ }
pdi->last_sequence = bit->sequence;
static int do_stdin(void)
{
unsigned long long youngest;
- int fd;
+ int fd, events, loops;
last_allowed_time = -1ULL;
fd = dup(STDIN_FILENO);
- do {
- int events;
+ if (fd == -1) {
+ perror("dup stdin");
+ return -1;
+ }
- events = read_events(fd, 0);
- if (!events)
- break;
+ loops = 0;
+ while ((events = read_events(fd, 0)) != 0) {
+ smallest_seq_read = -1U;
+
if (sort_entries(&youngest))
break;
if (youngest > stopwatch_end)
break;
- show_entries_rb(0);
- } while (1);
+ if (loops++ & 1)
+ show_entries_rb(0);
+ }
if (rb_sort_entries)
show_entries_rb(1);