* skip the next following N elements in the trace, * @param reader * @param N * @return the number of elements that are actually skipped */
| 454 | * @return the number of elements that are actually skipped |
| 455 | */ |
| 456 | int skip_n_req(reader_t *reader, const int N) { |
| 457 | int count = N; |
| 458 | char **buf = &reader->line_buf; |
| 459 | size_t *buf_size_ptr = &reader->line_buf_size; |
| 460 | |
| 461 | if (reader->trace_format == TXT_TRACE_FORMAT) { |
| 462 | for (int i = 0; i < N; i++) { |
| 463 | if (getline(buf, buf_size_ptr, reader->file) == -1) { |
| 464 | WARN("try to skip %d requests, but only %d requests left\n", N, i); |
| 465 | return i; |
| 466 | } |
| 467 | } |
| 468 | } else if (reader->trace_format == BINARY_TRACE_FORMAT) { |
| 469 | if (reader->mmap_offset + N * reader->item_size <= reader->file_size) { |
| 470 | reader->mmap_offset = reader->mmap_offset + N * reader->item_size; |
| 471 | } else { |
| 472 | count = (reader->file_size - reader->mmap_offset) / reader->item_size; |
| 473 | reader->mmap_offset = reader->file_size; |
| 474 | WARN("try to skip %d requests, but only %d requests left\n", N, count); |
| 475 | } |
| 476 | } else { |
| 477 | ERROR("unknown trace format %d\n", reader->trace_format); |
| 478 | abort(); |
| 479 | } |
| 480 | |
| 481 | VERBOSE("skip %d requests\n", count); |
| 482 | |
| 483 | return count; |
| 484 | } |
| 485 | |
| 486 | void reset_reader(reader_t *const reader) { |
| 487 | /* rewind the reader back to beginning */ |
no outgoing calls