| 40 | // #endif |
| 41 | |
| 42 | reader_t *setup_reader(const char *const trace_path, |
| 43 | const trace_type_e trace_type, |
| 44 | const reader_init_param_t *const init_params) { |
| 45 | static bool _info_printed = false; |
| 46 | |
| 47 | int fd; |
| 48 | struct stat st; |
| 49 | reader_t *const reader = (reader_t *)malloc(sizeof(reader_t)); |
| 50 | memset(reader, 0, sizeof(reader_t)); |
| 51 | reader->reader_params = NULL; |
| 52 | |
| 53 | /* check whether the trace is a zstd trace file, |
| 54 | * currently zstd reader only supports a few binary trace */ |
| 55 | reader->is_zstd_file = false; |
| 56 | reader->zstd_reader_p = NULL; |
| 57 | #ifdef SUPPORT_ZSTD_TRACE |
| 58 | size_t slen = strlen(trace_path); |
| 59 | if (strncmp(trace_path + (slen - 4), ".zst", 4) == 0) { |
| 60 | reader->is_zstd_file = true; |
| 61 | reader->zstd_reader_p = create_zstd_reader(trace_path); |
| 62 | if (!_info_printed) { |
| 63 | VERBOSE("opening a zstd compressed data\n"); |
| 64 | } |
| 65 | } |
| 66 | #endif |
| 67 | |
| 68 | reader->trace_format = INVALID_TRACE_FORMAT; |
| 69 | reader->trace_type = trace_type; |
| 70 | reader->n_total_req = 0; |
| 71 | reader->n_read_req = 0; |
| 72 | reader->ignore_size_zero_req = true; |
| 73 | reader->ignore_obj_size = false; |
| 74 | reader->cloned = false; |
| 75 | reader->item_size = 0; |
| 76 | reader->obj_id_is_num = false; |
| 77 | reader->obj_id_is_num_set = false; |
| 78 | reader->mapped_file = NULL; |
| 79 | reader->mmap_offset = 0; |
| 80 | reader->sampler = NULL; |
| 81 | reader->trace_start_offset = 0; |
| 82 | reader->read_direction = READ_FORWARD; |
| 83 | reader->n_req_left = 0; |
| 84 | reader->last_req_clock_time = -1; |
| 85 | |
| 86 | if (init_params != NULL) { |
| 87 | memcpy(&reader->init_params, init_params, sizeof(reader_init_param_t)); |
| 88 | if (init_params->binary_fmt_str != NULL) |
| 89 | reader->init_params.binary_fmt_str = strdup(init_params->binary_fmt_str); |
| 90 | |
| 91 | reader->ignore_obj_size = init_params->ignore_obj_size; |
| 92 | reader->ignore_size_zero_req = init_params->ignore_size_zero_req; |
| 93 | reader->obj_id_is_num = init_params->obj_id_is_num; |
| 94 | reader->obj_id_is_num_set = init_params->obj_id_is_num_set; |
| 95 | reader->trace_start_offset = init_params->trace_start_offset; |
| 96 | reader->mmap_offset = init_params->trace_start_offset; |
| 97 | reader->cap_at_n_req = init_params->cap_at_n_req; |
| 98 | reader->block_size = init_params->block_size; |
| 99 | if (init_params->sampler != NULL) |