diff --git a/logger/logger_time.c b/logger/logger_time.c index 125c7ea94b3866daedcd1391df3c9f7d98736a26..ef5bc04451ef2d58685c47b8216290afc2b2365e 100644 --- a/logger/logger_time.c +++ b/logger/logger_time.c @@ -33,14 +33,19 @@ void time_array_ensure_size(struct time_array *t) { /* Increase the size */ t->capacity *= 2; - t->time = realloc(t->time, sizeof(double) * t->capacity); - if (t->time == NULL) error("Failed to realloc time memory."); + /* Allocate the new array */ + struct time_record *tmp = malloc(sizeof(struct time_record) * t->capacity); + if (tmp == NULL) error("Failed to allocate the time records."); - t->int_time = realloc(t->int_time, sizeof(integertime_t) * t->capacity); - if (t->int_time == NULL) error("Failed to realloc integer time memory."); + /* Copy the memory */ + memcpy(tmp, t->records, sizeof(struct time_record) * t->size); - t->offset = realloc(t->offset, sizeof(size_t) * t->capacity); - if (t->offset == NULL) error("Failed to realloc offset memory."); + /* Cleanup the memory */ + free(t->records); + + /* Set the pointer to the new array */ + t->records = tmp; + } /** @@ -58,9 +63,9 @@ void time_array_append(struct time_array *t, const integertime_t int_time, time_array_ensure_size(t); /* Copy the values */ - t->time[t->size] = time; - t->int_time[t->size] = int_time; - t->offset[t->size] = offset; + t->records[t->size].time = time; + t->records[t->size].int_time = int_time; + t->records[t->size].offset = offset; /* Increase the size used. */ t->size += 1; @@ -141,14 +146,8 @@ size_t time_offset_first_record(const struct header *h) { */ void time_array_init(struct time_array *t) { /* Allocate the arrays */ - t->int_time = malloc(sizeof(integertime_t) * LOGGER_TIME_INIT_SIZE); - if (t->int_time == NULL) error("Failed to initialize the integer times."); - - t->time = malloc(sizeof(double) * LOGGER_TIME_INIT_SIZE); - if (t->time == NULL) error("Failed to initialize the times."); - - t->offset = malloc(sizeof(size_t) * LOGGER_TIME_INIT_SIZE); - if (t->offset == NULL) error("Failed to initialize the offsets."); + t->records = malloc(sizeof(struct time_record) * LOGGER_TIME_INIT_SIZE); + if (t->records == NULL) error("Failed to initialize the time records."); /* Initialize the sizes */ t->size = 0; @@ -196,7 +195,7 @@ void time_array_populate(struct time_array *t, struct logger_logfile *log) { integertime_t time_array_get_integertime(struct time_array *t, const size_t offset) { size_t ind = time_array_get_index(t, offset); - return t->int_time[ind]; + return t->records[ind].int_time; } /** @@ -209,7 +208,7 @@ integertime_t time_array_get_integertime(struct time_array *t, */ double time_array_get_time(const struct time_array *t, const size_t offset) { size_t ind = time_array_get_index(t, offset); - return t->time[ind]; + return t->records[ind].time; } /** @@ -224,15 +223,18 @@ size_t time_array_get_index(const struct time_array *t, const size_t offset) { #ifdef SWIFT_DEBUG_CHECKS if (!t) error("NULL pointer."); + + if (offset < t->records[0].offset || offset > t->records[t->size].offset) + error("Offset outside of range."); #endif /* Find the time_array with the correct offset. */ for (size_t i = 1; i < t->size; i++) { - if (offset < t->offset[i]) { + if (offset < t->records[i].offset) { return i - 1; } - else if (offset == t->offset[i]) + else if (offset == t->records[i].offset) return i; } @@ -246,14 +248,8 @@ size_t time_array_get_index(const struct time_array *t, const size_t offset) { */ void time_array_free(struct time_array *t) { /* Free the arrays */ - free(t->int_time); - t->int_time = NULL; - - free(t->time); - t->time = NULL; - - free(t->offset); - t->offset = NULL; + free(t->records); + t->records = NULL; /* Reset the counters */ t->size = 0; @@ -271,13 +267,14 @@ void time_array_print(const struct time_array *t) { size_t n = t->size; size_t up_threshold = n - threshold; - printf("Times (size %lu): [%lli (%g)", n, t->int_time[0], t->time[0]); + printf("Times (size %lu): [%lli (%g)", n, + t->records[0].int_time, t->records[0].time); /* Loop over all elements. */ for (size_t i = 1; i < n; i++) { /* Skip the times at the center of the array. */ if (i < threshold || i > up_threshold) - printf(", %lli (%g)", t->int_time[i], t->time[i]); + printf(", %lli (%g)", t->records[i].int_time, t->records[i].time); if (i == threshold) printf(", ..."); } @@ -296,12 +293,12 @@ void time_array_print_offset(const struct time_array *t) { size_t n = t->size; size_t up_threshold = n - threshold; - printf("Times (size %lu): [%lu", n, t->offset[0]); + printf("Times (size %lu): [%lu", n, t->records[0].offset); /* Loop over all elements. */ for (size_t i = 1; i < n; i++) { /* Skip the offset in the middle of the array. */ - if (i < threshold || i > up_threshold) printf(", %lu", t->offset[i]); + if (i < threshold || i > up_threshold) printf(", %lu", t->records[i].offset); if (i == threshold) printf(", ..."); } diff --git a/logger/logger_time.h b/logger/logger_time.h index 272746b6ed4406fe70e45ac16f137c4c37048fc7..c84b505d584868706c34c96f7bc3c82febbac2fe 100644 --- a/logger/logger_time.h +++ b/logger/logger_time.h @@ -29,6 +29,20 @@ struct logger_reader; #define LOGGER_TIME_INIT_SIZE 1024 +/** + * @brief This structure contains all the information present in a time record. + */ +struct time_record { + /* Integertime of the records. */ + integertime_t int_time; + + /* Double time of the records. */ + double time; + + /* Offset in the file of the time records. */ + size_t offset; +}; + /** * @brief This structure contains all the time record. * @@ -44,14 +58,9 @@ struct logger_reader; * #time_array_get_index. */ struct time_array { - /* Integertime of the records. */ - integertime_t *int_time; - /* Double time of the records. */ - double *time; - - /* Offset in the file of the time records. */ - size_t *offset; + /* The complete list of time record */ + struct time_record *records; /* Number of element in the arrays. */ size_t size; diff --git a/logger/tests/testTimeArray.c b/logger/tests/testTimeArray.c index 602cdccad7b370c39f190bb3ae4fc345ccdebb25..f07f167496971f173ea27e6679350fe48f75465a 100644 --- a/logger/tests/testTimeArray.c +++ b/logger/tests/testTimeArray.c @@ -27,11 +27,14 @@ int main(int argc, char *argv[]) { + /* Check that we are really testing the reallocation */ if (NUMBER_OF_ELEMENT < LOGGER_TIME_INIT_SIZE) { error("Not testing the reallocation."); } + /* Fix the random seed in order to reproduce the results */ srand(100); + /* Initialize the time array */ struct time_array times; time_array_init(×); @@ -66,9 +69,9 @@ int main(int argc, char *argv[]) { /* Check the values obtained */ assert(i == ind); - assert(int_time == times.int_time[ind]); - assert(time == times.time[ind]); - assert(offset == times.offset[ind]); + assert(int_time == times.records[ind].int_time); + assert(time == times.records[ind].time); + assert(offset == times.records[ind].offset); }