22 static void __litl_merge_set_archive_name(
const char* filename) {
23 int res __attribute__ ((__unused__));
26 if (filename == NULL )
27 res = asprintf(&__arch->
filename,
"/tmp/%s_%s", getenv(
"USER"),
30 if (asprintf(&__arch->
filename,
"%s", filename) == -1) {
31 perror(
"Error: Cannot set the filename for recording events!\n");
41 static void __litl_merge_add_archive_header() {
43 int trace_in, res __attribute__ ((__unused__));
45 process_header_size, global_header_size, nb_processes, total_nb_processes;
48 total_nb_processes = 0;
49 global_header_size = 0;
58 for (trace_index = 0; trace_index < __arch->
nb_traces; trace_index++) {
60 if ((trace_in = open(__arch->
traces_names[trace_index], O_RDONLY)) < 0) {
61 fprintf(stderr,
"[litl_merge] Cannot open %s to read its header\n",
68 res = read(trace_in, header_buffer, general_header_size);
75 if (trace_index == 0) {
82 global_header_size += general_header_size;
83 __arch->
buffer += general_header_size;
87 res = read(trace_in, __arch->
buffer, nb_processes * process_header_size);
90 if (nb_processes == 1) {
92 if (fstat(trace_in, &st)) {
93 perror(
"Cannot apply fstat to the input trace files!");
99 - process_header_size;
102 for (process_index = 0; process_index < nb_processes; process_index++) {
103 __triples[trace_index][process_index].
nb_processes = nb_processes;
104 __triples[trace_index][process_index].
position = global_header_size
105 + (process_index + 1) * process_header_size -
sizeof(
litl_offset_t);
106 __triples[trace_index][process_index].
offset =
108 - nb_processes * process_header_size;
109 __arch->
buffer += process_header_size;
112 total_nb_processes += nb_processes;
113 global_header_size += nb_processes * process_header_size;
132 static void __litl_merge_init_archive(
const char* arch_name,
133 char** traces_names,
const int nb_traces) {
146 __litl_merge_set_archive_name(arch_name);
151 fprintf(stderr,
"[litl_merge] Cannot open %s archive\n", __arch->
filename);
156 __litl_merge_add_archive_header();
163 static void __litl_merge_create_archive() {
172 for (trace_index = 0; trace_index < __arch->
nb_traces; trace_index++) {
173 if ((trace_in = open(__arch->
traces_names[trace_index], O_RDONLY)) < 0) {
174 fprintf(stderr,
"[litl_merge] Cannot open %s\n",
181 for (process_index = 0; process_index < nb_processes; process_index++) {
184 offset = __triples[trace_index][process_index].
offset
191 header_offset = general_header_size + nb_processes * process_header_size;
192 lseek(trace_in, header_offset, SEEK_SET);
201 perror(
"Cannot read the data from the traces!");
219 static void __litl_merge_finalize_archive() {
224 for (trace_index = 0; trace_index < __arch->
nb_traces; trace_index++)
225 free(__triples[trace_index]);
230 for (trace_index = 0; trace_index < __arch->
nb_traces; trace_index++)
241 const int nb_traces) {
242 __litl_merge_init_archive(arch_name, traces_names, nb_traces);
244 __litl_merge_create_archive();
246 __litl_merge_finalize_archive();
void litl_merge_traces(const char *arch_name, char **traces_names, const int nb_traces)
Merges trace files into an archive. This is a modified version of the implementation of the cat funct...
litl_med_size_t nb_processes
litl_merge Provides a set of functions for merging trace files into an archive of traces ...
litl_med_size_t nb_traces
uint8_t * litl_buffer_t
A data type for storing sets of events.
uint16_t litl_med_size_t
An auxiliary data type for the optimized storage of data.
A data structure for merging trace files into an archive of traces.
litl_offset_t general_offset
uint32_t litl_size_t
An auxiliary data type for storing data.
uint64_t litl_trace_size_t
A data type for storing traces sizes.
uint64_t litl_offset_t
A data type for storing offsets.
A data structure for triples (nb_processes, position, offset)