diff --git a/logger/logger_dump.c b/logger/logger_dump.c index 2c21bd42c1d147209fb614286d4d07c7bcd5b8a8..8f82706b01677551f6cb3532e668bd4f0faa37bb 100644 --- a/logger/logger_dump.c +++ b/logger/logger_dump.c @@ -35,6 +35,9 @@ void logger_dump_init( /* Set the pointer to the reader. */ dump->reader = reader; + /* Set pointers to zero */ + time_array_init_to_zero(&dump->times); + /* Open file, map it and get its size. */ if (reader->verbose > 1) message("Mapping the dump file."); @@ -51,14 +54,14 @@ void logger_dump_init( } /* Check if the offset are corrupted */ - if (header_are_offset_corrupted(&dump->header)) { + if (header_is_corrupted(&dump->header)) { error("The offsets have been corrupted"); } /* Reverse offset direction */ if (reader->verbose > 1) message("Checking if offsets need to be reversed."); - if (header_are_offset_backward(&dump->header)) { + if (header_is_backward(&dump->header)) { logger_dump_reverse_offset(dump); } @@ -94,7 +97,7 @@ void logger_dump_reverse_offset(struct logger_dump *dump) { struct header *header = &dump->header; const struct logger_reader *reader = dump->reader; - if (!header_are_offset_backward(header)) { + if (!header_is_backward(header)) { error("The offset are already reversed."); } @@ -102,31 +105,32 @@ void logger_dump_reverse_offset(struct logger_dump *dump) { #ifdef SWIFT_DEBUG_CHECKS /* check offset */ if (reader->verbose > 0) { - message("Check offsets...\n"); - } - size_t offset_debug = header->offset_first; - while (offset_debug < dump->dump.file_size) { - tools_check_offset(header, dump->dump.map, &offset_debug); + message("Check offsets..."); } + + for(size_t offset_debug = header->offset_first; + offset_debug < dump->dump.file_size; + offset_debug = tools_check_offset(reader, offset_debug)) {} + if (reader->verbose > 0) { - message("Check done\n"); + message("Check done"); } #endif /* reverse header offset */ header_change_offset_direction(header, logger_offset_corrupted); - size_t offset = header->offset_first; - /* reverse chunks */ if (reader->verbose > 0) { - message("Reversing offsets...\n"); - } - while (offset < dump->dump.file_size) { - tools_reverse_offset(header, dump->dump.map, &offset); + message("Reversing offsets..."); } + + for(size_t offset = header->offset_first; + offset < dump->dump.file_size; + offset = tools_reverse_offset(header, dump->dump.map, offset)) {} + if (reader->verbose > 0) { - message("Reversing done\n"); + message("Reversing done"); } /* reverse header offset */ @@ -135,14 +139,15 @@ void logger_dump_reverse_offset(struct logger_dump *dump) { #ifdef SWIFT_DEBUG_CHECKS /* check offset */ if (reader->verbose > 0) { - message("Check offsets...\n"); - } - offset_debug = header->offset_first; - while (offset_debug < dump->dump.file_size) { - tools_check_offset(header, dump->dump.map, &offset_debug); + message("Check offsets..."); } + + for(size_t offset_debug = header->offset_first; + offset_debug < dump->dump.file_size; + offset_debug = tools_check_offset(reader, offset_debug)) {} + if (reader->verbose > 0) { - message("Check done\n"); + message("Check done"); } #endif diff --git a/logger/logger_header.c b/logger/logger_header.c index 1a93076f5edc2605b6413fec9e0ab094c9d3f2d9..884b3bcdc0b6cae925631dc2d6c5729789cab08c 100644 --- a/logger/logger_header.c +++ b/logger/logger_header.c @@ -90,7 +90,7 @@ void header_change_offset_direction(struct header *h, int new_value) { h->offset_direction = new_value; size_t offset = LOGGER_VERSION_SIZE; - io_write_data(h->dump->dump.map, LOGGER_NUMBER_SIZE, &new_value, &offset); + io_write_data(h->dump->dump.map, LOGGER_NUMBER_SIZE, &new_value, offset); } /** @@ -107,23 +107,23 @@ void header_read(struct header *h, struct logger_dump *dump) { h->dump = dump; /* read version */ - io_read_data(map, LOGGER_VERSION_SIZE, &h->version, &offset); + offset = io_read_data(map, LOGGER_VERSION_SIZE, &h->version, offset); /* read offset direction */ h->offset_direction = -1; - io_read_data(map, LOGGER_NUMBER_SIZE, &h->offset_direction, &offset); + offset = io_read_data(map, LOGGER_NUMBER_SIZE, &h->offset_direction, offset); - if (!header_are_offset_forward(h) && !header_are_offset_backward(h) && - !header_are_offset_corrupted(h)) + if (!header_is_forward(h) && !header_is_backward(h) && + !header_is_corrupted(h)) error("Wrong offset value in the header (%i)", h->offset_direction); /* read offset to first data */ h->offset_first = 0; - io_read_data(map, LOGGER_OFFSET_SIZE, &h->offset_first, &offset); + offset = io_read_data(map, LOGGER_OFFSET_SIZE, &h->offset_first, offset); /* read name size */ h->name_length = 0; - io_read_data(map, LOGGER_NUMBER_SIZE, &h->name_length, &offset); + offset = io_read_data(map, LOGGER_NUMBER_SIZE, &h->name_length, offset); /* check if value defined in this file is large enough */ if (STRING_SIZE < h->name_length) { @@ -132,7 +132,7 @@ void header_read(struct header *h, struct logger_dump *dump) { /* read number of masks */ h->number_mask = 0; - io_read_data(map, LOGGER_NUMBER_SIZE, &h->number_mask, &offset); + offset = io_read_data(map, LOGGER_NUMBER_SIZE, &h->number_mask, offset); /* allocate memory */ h->masks = malloc(sizeof(struct mask_data) * h->number_mask); @@ -140,14 +140,14 @@ void header_read(struct header *h, struct logger_dump *dump) { /* loop over all masks */ for (size_t i = 0; i < h->number_mask; i++) { /* read mask name */ - io_read_data(map, h->name_length, h->masks[i].name, &offset); + offset = io_read_data(map, h->name_length, h->masks[i].name, offset); /* get mask value */ h->masks[i].mask = 1 << i; /* read mask data size */ h->masks[i].size = 0; - io_read_data(map, LOGGER_NUMBER_SIZE, &h->masks[i].size, &offset); + offset = io_read_data(map, LOGGER_NUMBER_SIZE, &h->masks[i].size, offset); } if (offset != h->offset_first) { diff --git a/logger/logger_header.h b/logger/logger_header.h index 6e18c82e3654e9adc47ec8b7bc8532e5b342a022..a6891126abaae73e4ec25032f969a0c266190023 100644 --- a/logger/logger_header.h +++ b/logger/logger_header.h @@ -91,7 +91,7 @@ void header_change_offset_direction(struct header *h, int new_value); * @brief Check if the offset are forward. * @param h The #header. */ -__attribute__((always_inline)) INLINE static int header_are_offset_forward( +__attribute__((always_inline)) INLINE static int header_is_forward( const struct header *h) { return h->offset_direction == logger_offset_forward; } @@ -100,7 +100,7 @@ __attribute__((always_inline)) INLINE static int header_are_offset_forward( * @brief Check if the offset are backward. * @param h The #header. */ -__attribute__((always_inline)) INLINE static int header_are_offset_backward( +__attribute__((always_inline)) INLINE static int header_is_backward( const struct header *h) { return h->offset_direction == logger_offset_backward; } @@ -109,7 +109,7 @@ __attribute__((always_inline)) INLINE static int header_are_offset_backward( * @brief Check if the offset are corrupted. * @param h The #header. */ -__attribute__((always_inline)) INLINE static int header_are_offset_corrupted( +__attribute__((always_inline)) INLINE static int header_is_corrupted( const struct header *h) { return h->offset_direction == logger_offset_corrupted; } diff --git a/logger/logger_io.h b/logger/logger_io.h index 7fafab84fe34c8aa54464e4f51007939109a208c..b0b94080974d49baec6ca046d472d35e0b12d15a 100644 --- a/logger/logger_io.h +++ b/logger/logger_io.h @@ -37,57 +37,64 @@ void io_munmap_file(void *map, size_t file_size); * * @param h #header file structure * @param data Pointer to the data to read. - * @param offset In: position in the file, Out: shifted by the mask + offset + * @param offset position in the file, Out: shifted by the mask + offset * size * @param mask mask read * @param diff_offset offset difference to previous/next corresponding chunk * + * @return offset after the record header */ -__attribute__((always_inline)) INLINE static void io_read_mask( - const struct header *h, void *data, size_t *offset, size_t *mask, +__attribute__((always_inline)) INLINE static size_t io_read_mask( + const struct header *h, void *data, size_t offset, size_t *mask, size_t *diff_offset) { /* read mask */ if (mask) { *mask = 0; - memcpy(mask, data + *offset, LOGGER_MASK_SIZE); + memcpy(mask, data + offset, LOGGER_MASK_SIZE); } - *offset += LOGGER_MASK_SIZE; + offset += LOGGER_MASK_SIZE; /* read offset */ if (diff_offset) { *diff_offset = 0; - memcpy(diff_offset, data + *offset, LOGGER_OFFSET_SIZE); + memcpy(diff_offset, data + offset, LOGGER_OFFSET_SIZE); } - *offset += LOGGER_OFFSET_SIZE; + offset += LOGGER_OFFSET_SIZE; + + return offset; } /** - * @brief read a single value in a file + * @brief read a single value in a file. * * @param data Pointer to the data to read. - * @param size size of the chunk to read - * @param p pointer where to store the data - * @param offset In: position to read, Out: shifted by size + * @param size size of the chunk to read. + * @param p pointer where to store the data. + * @param offset position to read. + + * @return offset after the record. */ -__attribute__((always_inline)) INLINE static void io_read_data( - void *data, const size_t size, void *p, size_t *offset) { - memcpy(p, data + *offset, size); - *offset += size; +__attribute__((always_inline)) INLINE static size_t io_read_data( + void *data, const size_t size, void *p, size_t offset) { + memcpy(p, data + offset, size); + return offset + size; }; /** - * @brief write a single value in a file + * @brief write a single value in a file. * * @param data Pointer to the data to read. - * @param size size of the chunk to write - * @param p pointer to the data - * @param offset In: position to write, Out: shifted by size + * @param size size of the chunk to write. + * @param p pointer to the data. + * @param offset position to write. * + * @return offset after the data written. */ -__attribute__((always_inline)) INLINE static void io_write_data( - void *data, const size_t size, const void *p, size_t *offset) { - memcpy(data + *offset, p, size); - *offset += size; +__attribute__((always_inline)) INLINE static size_t io_write_data( + void *data, const size_t size, const void *p, size_t offset) { + memcpy(data + offset, p, size); + + return offset + size; }; #endif // __LOGGER_LOGGER_IO_H__ diff --git a/logger/logger_particle.c b/logger/logger_particle.c index fa2ed36e9a201d52a0c2eac80d5dcbea2e9c139f..8c0227ee3eac4368219a0fc0da762fd85ab2b643 100644 --- a/logger/logger_particle.c +++ b/logger/logger_particle.c @@ -19,6 +19,7 @@ #include "logger_particle.h" #include "logger_header.h" #include "logger_io.h" +#include "logger_reader.h" #include "logger_time.h" #include "logger_tools.h" @@ -63,19 +64,19 @@ void logger_particle_init(struct logger_particle *part) { } /** - * @brief Read a single field for a particle + * @brief Read a single field for a particle. * - * @param part The #logger_particle to update + * @param part The #logger_particle to update. * @param data Pointer to the data to read. - * @param offset In: read position, Out: input shifted by the required amount of - * data - * @param field field to read - * @param size number of bits to read + * @param offset position to read. + * @param field field to read. + * @param size number of bits to read. * + * @return position after the data read. */ -void logger_particle_read_field(struct logger_particle *part, void *map, - size_t *offset, const char *field, - const size_t size) { +size_t logger_particle_read_field(struct logger_particle *part, void *map, + size_t offset, const char *field, + const size_t size) { void *p = NULL; if (strcmp("positions", field) == 0) { @@ -96,7 +97,7 @@ void logger_particle_read_field(struct logger_particle *part, void *map, error("Type %s not defined", field); } - io_read_data(map, size, p, offset); + offset = io_read_data(map, size, p, offset); if (strcmp("consts", field) == 0) { part->mass = 0; @@ -107,67 +108,81 @@ void logger_particle_read_field(struct logger_particle *part, void *map, p -= sizeof(float); free(p); } + + return offset; } /** * @brief Read a particle in the dump file. * + * @param reader The #logger_reader. * @param part The #logger_particle to update. - * @param h #header structure of the file - * @param map file mapping - * @param offset offset of the chunk to read (update it to the end of the chunk) + * @param offset offset of the chunk to read. * @param time time to interpolate (if #logger_reader_type is an interpolating - * one) - * @param reader #logger_reader_type - * @param times #time_array times in the dump + * one). + * @param reader_type #logger_reader_type. * + * @return position after the record. */ -void logger_particle_read(struct logger_particle *part, const struct header *h, - void *map, size_t *offset, const double time, - const int reader, struct time_array *times) { +size_t logger_particle_read(struct logger_particle *part, const struct logger_reader *reader, + size_t offset, const double time, + const enum logger_reader_type reader_type) { + + const struct header *h = &reader->dump.header; + void *map = reader->dump.dump.map; + + const struct time_array *times = &reader->dump.times; + size_t mask = 0; size_t h_offset = 0; logger_particle_init(part); - io_read_mask(h, map, offset, &mask, &h_offset); + offset = io_read_mask(h, map, offset, &mask, &h_offset); if (mask != 127) error("Unexpected mask: %lu", mask); for (size_t i = 0; i < h->number_mask; i++) { if (mask & h->masks[i].mask) { - logger_particle_read_field(part, map, offset, h->masks[i].name, - h->masks[i].size); + offset = logger_particle_read_field(part, map, offset, h->masks[i].name, + h->masks[i].size); } } - if (times) /* move offset by 1 in order to be in the required chunk */ - part->time = time_array_get_time(times, *offset - 1); + if (times) { + /* move offset by 1 in order to be in the required chunk */ + part->time = time_array_get_time(times, offset - 1); + } else part->time = -1; /* end of const case */ - if (reader == logger_reader_const) return; + if (reader_type == logger_reader_const) + return offset; /* read next particle */ struct logger_particle part_next; - if (!header_are_offset_forward(h)) { + if (!header_is_forward(h)) { error("Cannot read a particle with non forward offsets."); } - if (h_offset == 0) return; + if (h_offset == 0) + return offset; + /* get absolute offset of next particle */ - h_offset += *offset - header_get_mask_size(h, mask) - LOGGER_MASK_SIZE - + h_offset += offset - header_get_mask_size(h, mask) - LOGGER_MASK_SIZE - LOGGER_OFFSET_SIZE; part_next.time = time_array_get_time(times, h_offset); /* previous part exists */ - logger_particle_read(&part_next, h, map, &h_offset, part_next.time, - logger_reader_const, times); + h_offset = logger_particle_read(&part_next, reader, h_offset, part_next.time, + logger_reader_const); logger_particle_interpolate(part, &part_next, time); + + return offset; } /** diff --git a/logger/logger_particle.h b/logger/logger_particle.h index 112ad28962c31ebad98fac8b874475c83c0b3a08..3493f13dc1d83d63f74ad99f2fd513d6f9f7198b 100644 --- a/logger/logger_particle.h +++ b/logger/logger_particle.h @@ -28,6 +28,8 @@ #define DIM 3 +struct logger_reader; + /** * @brief Store the data from a chunk. * @@ -83,14 +85,14 @@ enum logger_reader_type { void logger_particle_print(const struct logger_particle *p); -void logger_particle_read(struct logger_particle *part, const struct header *h, - void *map, size_t *offset, const double time, - const int reader, struct time_array *times); +size_t logger_particle_read(struct logger_particle *part, const struct logger_reader *reader, + size_t offset, const double time, + const enum logger_reader_type reader_type); void logger_particle_init(struct logger_particle *part); -void logger_particle_read_field(struct logger_particle *part, void *map, - size_t *offset, const char *field, +size_t logger_particle_read_field(struct logger_particle *part, void *map, + size_t offset, const char *field, const size_t size); void logger_particle_interpolate(struct logger_particle *part_curr, diff --git a/logger/logger_python_wrapper.c b/logger/logger_python_wrapper.c index 4c8c2d0b04a00f1f3a9f15af397ecd3fb84c159b..4fe72bf10888fd0a879ec9ce0fc0b2d9bf03553c 100644 --- a/logger/logger_python_wrapper.c +++ b/logger/logger_python_wrapper.c @@ -56,7 +56,7 @@ static PyObject *loadFromIndex(__attribute__((unused)) PyObject *self, PyArrayObject *id = NULL; size_t time_offset; - int verbose = 0; + int verbose = 2; /* parse arguments */ @@ -123,14 +123,14 @@ static PyObject *loadFromIndex(__attribute__((unused)) PyObject *self, if (verbose > 1) message("Reading particles."); + /* loop over all particles */ for (npy_intp i = 0; i < PyArray_DIMS(offset)[0]; i++) { struct logger_particle part; - size_t *offset_particle = (size_t *)PyArray_GETPTR1(offset, i); + size_t offset_particle = *(size_t *)PyArray_GETPTR1(offset, i); - logger_particle_read(&part, &reader.dump.header, reader.dump.dump.map, offset_particle, time, - logger_reader_lin, &reader.dump.times); + logger_particle_read(&part, &reader, offset_particle, time, logger_reader_lin); double *dtmp; float *ftmp; diff --git a/logger/logger_time.c b/logger/logger_time.c index 71247341c0e9cdd1b2838be08ebaf1287073b61f..758cbbd0699f59434d48c945066f815454192ebe 100644 --- a/logger/logger_time.c +++ b/logger/logger_time.c @@ -26,19 +26,24 @@ * * @param timestamp timestamp read * @param time time read - * @param h #header file structure - * @param map file mapping - * @param offset In: position in the file, Out: shifted by the timestamp + * @param reader The #logger_reader + * @param offset position in the file + * + * @return position after the timestamp */ -void time_read(integertime_t *timestamp, double *time, const struct header *h, - void *map, size_t *offset) { +size_t time_read(integertime_t *timestamp, double *time, const struct logger_reader *reader, + size_t offset) { + + const struct header *h = &reader->dump.header; + void *map = h->dump->dump.map; + size_t mask = 0; size_t prev_offset = 0; *timestamp = 0; *time = 0; /* read chunck header */ - io_read_mask(h, map, offset, &mask, &prev_offset); + offset = io_read_mask(h, map, offset, &mask, &prev_offset); #ifdef SWIFT_DEBUG_CHECKS @@ -51,33 +56,44 @@ void time_read(integertime_t *timestamp, double *time, const struct header *h, #endif /* read data */ - // TODO - io_read_data(map, sizeof(unsigned long long int), timestamp, offset); - io_read_data(map, sizeof(double), time, offset); + offset = io_read_data(map, sizeof(unsigned long long int), timestamp, offset); + offset = io_read_data(map, sizeof(double), time, offset); + + return offset; } /** * @brief get offset of first timestamp * * @param h file #header - * @param map file mapping - * @param offset out: offset of first timestamp + * @return offset of first timestamp * */ -void time_first_timestamp(const struct header *h, void *map, size_t *offset) { - *offset = h->offset_first; +size_t time_first_timestamp(const struct header *h) { + size_t offset = h->offset_first; + void *map = h->dump->dump.map; int i = header_get_field_index(h, "timestamp"); if (i == -1) error("Time stamp not present in header"); - size_t tmp = *offset; size_t mask = 0; io_read_mask(h, map, offset, &mask, NULL); if (mask != h->masks[i].mask) error("Dump should begin by timestep"); - *offset = tmp; + return h->offset_first; +} + +/** + * @brief Initialize an empty time array. + * + * @param t #time_array to initialize. + * @param dump The #logger_dump. + */ +void time_array_init_to_zero(struct time_array *t) { + t->next = NULL; + t->prev = NULL; } /** @@ -91,21 +107,19 @@ void time_array_init(struct time_array *t, struct logger_dump *dump) { t->next = NULL; t->prev = NULL; - /* get first time stamp */ - size_t offset = 0; - time_first_timestamp(&dump->header, dump->dump.map, &offset); - integertime_t timestamp = 0; double time = 0; /* get file size */ size_t file_size = dump->dump.file_size; + /* get first time stamp */ + size_t offset = time_first_timestamp(&dump->header); while (offset < file_size) { /* read time */ t->offset = offset; size_t tmp_offset = offset; - time_read(×tamp, &time, &dump->header, dump->dump.map, &tmp_offset); + tmp_offset = time_read(×tamp, &time, dump->reader, tmp_offset); t->timestamp = timestamp; t->time = time; @@ -150,7 +164,7 @@ integertime_t time_array_get_integertime(struct time_array *t, * * @return time of the chunk */ -double time_array_get_time(struct time_array *t, const size_t offset) { +double time_array_get_time(const struct time_array *t, const size_t offset) { const struct time_array *tmp = time_array_get_time_array(t, offset); return tmp->time; } @@ -163,22 +177,19 @@ double time_array_get_time(struct time_array *t, const size_t offset) { * * @return pointer to the requested #time_array */ -struct time_array *time_array_get_time_array(struct time_array *t, +struct time_array *time_array_get_time_array(const struct time_array *t, const size_t offset) { #ifdef SWIFT_DEBUG_CHECKS - if (!t) return 0; + if (!t) error("NULL pointer"); #endif - while (t->next) { - if (t->offset > offset) break; + const struct time_array *tmp; + for(tmp = t; tmp->next && tmp->offset <= offset; tmp = tmp->next) + {} - t = t->next; - } + if (tmp->prev == NULL) return (struct time_array *) tmp; - if (t->prev == NULL) return t; - - struct time_array *tmp = t->prev; - return tmp; + return (struct time_array *) tmp->prev; } /** @@ -188,10 +199,9 @@ struct time_array *time_array_get_time_array(struct time_array *t, */ void time_array_free(struct time_array *t) { struct time_array *tmp; - while (t->next) { + for(tmp = t; t->next; t = tmp) { tmp = t->next; free(t); - t = tmp; } } @@ -204,13 +214,15 @@ void time_array_print(const struct time_array *t) { size_t threshold = 4; size_t n = time_array_count(t); - size_t i = 0; size_t up_threshold = n - threshold; printf("Times (size %lu): [%lli (%g)", n, t->timestamp, t->time); - while (t->next) { - i += 1; + for(size_t i = 1; i < n; i++) { + /* The last time_array does not have a next */ + if (!t->next) + error("Next pointer not initialized %li", i); + t = t->next; if (i < threshold || i > up_threshold) printf(", %lli (%g)", t->timestamp, t->time); @@ -230,13 +242,12 @@ void time_array_print_offset(const struct time_array *t) { size_t threshold = 4; size_t n = time_array_count(t); - size_t i = 0; size_t up_threshold = n - threshold; printf("Times (size %lu): [%lu", n, t->offset); - while (t->next) { - i += 1; + + for(size_t i = 1; i < n; i++) { t = t->next; if (i < threshold || i > up_threshold) printf(", %lu", t->offset); @@ -255,8 +266,7 @@ void time_array_print_offset(const struct time_array *t) { */ size_t time_array_count(const struct time_array *t) { size_t count = 1; - while (t->next) { - t = t->next; + for(; t->next; t = t->next) { count += 1; } diff --git a/logger/logger_time.h b/logger/logger_time.h index 004c3b4e3e9e83a1bfa8cf840951dc0e97686349..b2f56ef3ccd95f2b33ed181dbb25f410d169852a 100644 --- a/logger/logger_time.h +++ b/logger/logger_time.h @@ -25,6 +25,8 @@ typedef char timebin_t; typedef long long integertime_t; +struct logger_reader; + /** * @brief This structure contains all the timestamp. * @@ -59,18 +61,26 @@ struct time_array { size_t offset; }; -void time_read(integertime_t *timestamp, double *time, const struct header *h, - void *map, size_t *offset); +size_t time_read(integertime_t *timestamp, double *time, + const struct logger_reader *reader, size_t offset); + +void time_array_init_to_zero(struct time_array *t); void time_array_init(struct time_array *t, struct logger_dump *dump); -integertime_t time_array_get_integertime(struct time_array *t, - const size_t offset); -double time_array_get_time(struct time_array *t, const size_t offset); -struct time_array *time_array_get_time_array(struct time_array *t, - const size_t offset); + +integertime_t time_array_get_integertime(struct time_array *t, const size_t offset); + +double time_array_get_time(const struct time_array *t, const size_t offset); + +struct time_array *time_array_get_time_array(const struct time_array *t, const size_t offset); + void time_array_free(struct time_array *t); + void time_array_print(const struct time_array *t); + void time_array_print_offset(const struct time_array *t); + size_t time_array_count(const struct time_array *t); -void time_first_timestamp(const struct header *h, void *map, size_t *offset); + +size_t time_first_timestamp(const struct header *h); #endif // __LOGGER_LOGGER_TIMELINE_H__ diff --git a/logger/logger_tools.c b/logger/logger_tools.c index 112a000d64fac5b8ff86f9a470dc4fc006f4b5c4..24a654920d511bbe47b91a40c5ad9c7c182b9899 100644 --- a/logger/logger_tools.c +++ b/logger/logger_tools.c @@ -19,6 +19,7 @@ #include "logger_tools.h" #include "logger_header.h" #include "logger_io.h" +#include "logger_reader.h" #include "logger_particle.h" @@ -36,9 +37,9 @@ */ int tools_get_next_chunk(const struct header *h, void *map, size_t *offset, size_t file_size) { - if (header_are_offset_forward(h)) + if (header_is_forward(h)) return _tools_get_next_chunk_forward(h, map, offset); - if (header_are_offset_backward(h)) + if (header_is_backward(h)) return _tools_get_next_chunk_backward(h, map, offset, file_size); else error("Offsets are corrupted"); @@ -58,7 +59,7 @@ int _tools_get_next_chunk_forward(const struct header *h, void *map, size_t diff_offset = 0; /* read offset */ - io_read_mask(h, map, offset, NULL, &diff_offset); + *offset = io_read_mask(h, map, *offset, NULL, &diff_offset); if (diff_offset == 0) return -1; @@ -89,7 +90,7 @@ int _tools_get_next_chunk_backward(const struct header *h, void *map, while (current_offset < file_size) { size_t mask = 0; size_t prev_offset; - io_read_mask(h, map, ¤t_offset, &mask, &prev_offset); + current_offset = io_read_mask(h, map, current_offset, &mask, &prev_offset); prev_offset = current_offset - prev_offset - chunk_header; if (*offset == prev_offset) { @@ -104,32 +105,34 @@ int _tools_get_next_chunk_backward(const struct header *h, void *map, } /** - * @brief switch side offset + * @brief switch side offset. * * From current chunk, switch side of the offset of the previous one. - * @param h #header structure of the file - * @param map file mapping - * @param offset In: initial offset, Out: offset of next chunk + * @param h #header structure of the file. + * @param map file mapping. + * @param position of the record. * + * @return position after the record. */ -void tools_reverse_offset(const struct header *h, void *map, size_t *offset) { +size_t tools_reverse_offset(const struct header *h, void *map, size_t offset) { size_t mask = 0; size_t prev_offset = 0; - const size_t cur_offset = *offset; + const size_t cur_offset = offset; /* read mask + offset */ - io_read_mask(h, map, offset, &mask, &prev_offset); + offset = io_read_mask(h, map, offset, &mask, &prev_offset); /* write offset of zero (in case it is the last chunk) */ const size_t zero = 0; - *offset -= LOGGER_OFFSET_SIZE; - io_write_data(map, LOGGER_OFFSET_SIZE, &zero, offset); + offset -= LOGGER_OFFSET_SIZE; + offset = io_write_data(map, LOGGER_OFFSET_SIZE, &zero, offset); /* set offset after current chunk */ - *offset += header_get_mask_size(h, mask); + offset += header_get_mask_size(h, mask); /* first chunks do not have a previous partner */ - if (prev_offset == cur_offset) return; + if (prev_offset == cur_offset) + return offset; if (prev_offset > cur_offset) error("Unexpected offset, header %lu, current %lu", prev_offset, @@ -137,18 +140,20 @@ void tools_reverse_offset(const struct header *h, void *map, size_t *offset) { /* modify previous offset */ size_t abs_prev_offset = cur_offset - prev_offset + LOGGER_MASK_SIZE; - io_write_data(map, LOGGER_OFFSET_SIZE, &prev_offset, &abs_prev_offset); + abs_prev_offset = io_write_data(map, LOGGER_OFFSET_SIZE, &prev_offset, abs_prev_offset); #ifdef SWIFT_DEBUG_CHECKS size_t prev_mask = 0; abs_prev_offset -= LOGGER_MASK_SIZE + LOGGER_OFFSET_SIZE; - io_read_mask(h, map, &abs_prev_offset, &prev_mask, NULL); + abs_prev_offset = io_read_mask(h, map, abs_prev_offset, &prev_mask, NULL); if (prev_mask != mask) - error("Unexpected mask: %lu (at %lu), got %lu (at %lu)", mask, *offset, + error("Unexpected mask: %lu (at %lu), got %lu (at %lu)", mask, offset, prev_mask, prev_offset); #endif // SWIFT_DEBUG_CHECKS + + return offset; } /** @@ -156,29 +161,32 @@ void tools_reverse_offset(const struct header *h, void *map, size_t *offset) { * * Compare the mask with the one pointed by the header. * if the chunk is a particle, check the id too. - * @param h #header structure of the file - * @param map file mapping - * @param offset In: chunk offset, Out: offset after the chunk * - * @return error code + * @param reader The #logger_reader. + * @param offset position of the record. + * + * @return position after the record. */ -void tools_check_offset(const struct header *h, void *map, size_t *offset) { +size_t tools_check_offset(const struct logger_reader *reader, size_t offset) { #ifndef SWIFT_DEBUG_CHECKS error("Should not check in non debug mode"); #endif - size_t tmp = *offset; + const struct header *h = &reader->dump.header; + void *map = reader->dump.dump.map; + + size_t tmp = offset; size_t mask; size_t pointed_offset; /* read mask + offset */ - io_read_mask(h, map, offset, &mask, &pointed_offset); + offset = io_read_mask(h, map, offset, &mask, &pointed_offset); /* get absolute offset */ - if (header_are_offset_forward(h)) + if (header_is_forward(h)) pointed_offset += tmp; - if (header_are_offset_backward(h)) { + else if (header_is_backward(h)) { if (tmp < pointed_offset) error("Offset too large (%lu) at %lu with mask %lu", pointed_offset, tmp, mask); @@ -189,31 +197,36 @@ void tools_check_offset(const struct header *h, void *map, size_t *offset) { } /* set offset after current chunk */ - *offset += header_get_mask_size(h, mask); + offset += header_get_mask_size(h, mask); - if (pointed_offset == tmp || pointed_offset == 0) return; + if (pointed_offset == tmp || pointed_offset == 0) + return offset; /* read mask of the pointed chunk */ size_t pointed_mask = 0; - io_read_mask(h, map, &pointed_offset, &pointed_mask, NULL); + pointed_offset = io_read_mask(h, map, pointed_offset, &pointed_mask, NULL); /* check masks */ if (pointed_mask != mask) error("Error in the offset (mask %lu != %lu) at %lu and %lu", mask, pointed_mask, - *offset - header_get_mask_size(h, mask) - LOGGER_MASK_SIZE - - LOGGER_OFFSET_SIZE, + offset - header_get_mask_size(h, mask) - LOGGER_MASK_SIZE - + LOGGER_OFFSET_SIZE, pointed_offset - LOGGER_MASK_SIZE - LOGGER_OFFSET_SIZE); - if (pointed_mask == 128) return; + if (pointed_mask == 128) + return offset; struct logger_particle part; - logger_particle_read(&part, h, map, &tmp, 0, logger_reader_const, NULL); + tmp = logger_particle_read(&part, reader, tmp, 0, logger_reader_const); size_t id = part.id; tmp = pointed_offset - LOGGER_MASK_SIZE - LOGGER_OFFSET_SIZE; - logger_particle_read(&part, h, map, &tmp, 0, logger_reader_const, NULL); + tmp = logger_particle_read(&part, reader, tmp, 0, logger_reader_const); if (id != part.id) error("Offset wrong, id incorrect (%lu != %lu) at %lu", id, part.id, tmp); + + return offset; } + diff --git a/logger/logger_tools.h b/logger/logger_tools.h index 7bdaeb8f9323224e79f56b096ec665b6266dab08..e2e2eba3ea4a46de16c32467f6850df50f804c3d 100644 --- a/logger/logger_tools.h +++ b/logger/logger_tools.h @@ -41,6 +41,7 @@ #define STRING_SIZE 200 struct header; +struct logger_reader; #define error(s, ...) \ ({ \ @@ -62,7 +63,7 @@ int _tools_get_next_chunk_backward(const struct header *h, void *map, size_t *offset, size_t file_size); int _tools_get_next_chunk_forward(const struct header *h, void *map, size_t *offset); -void tools_reverse_offset(const struct header *h, void *map, size_t *offset); -void tools_check_offset(const struct header *h, void *map, size_t *offset); +size_t tools_reverse_offset(const struct header *h, void *map, size_t offset); +size_t tools_check_offset(const struct logger_reader *reader, size_t offset); #endif //__LOGGER_LOGGER_TOOLS_H__ diff --git a/logger/python/reader_example.py b/logger/python/reader_example.py index d3b40254b0bbd8c1409279d63a671204f7dd635b..aadc8f29402b021536f0f96297cb5fa9fae0c104 100644 --- a/logger/python/reader_example.py +++ b/logger/python/reader_example.py @@ -14,7 +14,7 @@ import liblogger as logger # Get filenames if len(sys.argv) != 3: print("WARNING missing arguments. Will use the default ones") - index = "../../examples/SedovBlast_3D/index_0005.hdf5" + index = "../../examples/SedovBlast_3D/index_0002.hdf5" dump = "../../examples/SedovBlast_3D/index.dump" else: index = sys.argv[-1]