diff --git a/src/obiavl.c b/src/obiavl.c index 6f79fe3..cfc0320 100644 --- a/src/obiavl.c +++ b/src/obiavl.c @@ -477,23 +477,25 @@ int grow_avl(OBIDMS_avl_p avl) // TODO Lock when needed size_t new_data_size; size_t header_size; int avl_file_descriptor; - char* avl_file_name; +// char* avl_file_name; - // Get the avl file name - avl_file_name = build_avl_file_name((avl->header)->avl_name); - if (avl_file_name == NULL) - return -1; +// // Get the avl file name +// avl_file_name = build_avl_file_name((avl->header)->avl_name); +// if (avl_file_name == NULL) +// return -1; +// +// // Open the avl file +// avl_file_descriptor = openat(avl->dir_fd, avl_file_name, O_RDWR); +// if (avl_file_descriptor < 0) +// { +// obi_set_errno(OBI_AVL_ERROR); +// obidebug(1, "\nError opening an AVL tree file"); +// free(avl_file_name); +// return -1; +// } +// free(avl_file_name); - // Open the avl file - avl_file_descriptor = openat(avl->dir_fd, avl_file_name, O_RDWR); - if (avl_file_descriptor < 0) - { - obi_set_errno(OBI_AVL_ERROR); - obidebug(1, "\nError opening an AVL tree file"); - free(avl_file_name); - return -1; - } - free(avl_file_name); + avl_file_descriptor = avl->avl_fd; // Calculate the new file size old_data_size = (avl->header)->avl_size; @@ -542,7 +544,7 @@ int grow_avl(OBIDMS_avl_p avl) // TODO Lock when needed // Set the new avl size (avl->header)->avl_size = new_data_size; - close(avl_file_descriptor); + //close(avl_file_descriptor); return 0; } @@ -555,23 +557,25 @@ int grow_avl_data(OBIDMS_avl_p avl) // TODO Lock when needed index_t new_data_size; size_t header_size; int avl_data_file_descriptor; - char* avl_data_file_name; +// char* avl_data_file_name; +// +// // Get the avl data file name +// avl_data_file_name = build_avl_data_file_name((avl->header)->avl_name); +// if (avl_data_file_name == NULL) +// return -1; +// +// // Open the avl data file +// avl_data_file_descriptor = openat(avl->dir_fd, avl_data_file_name, O_RDWR); +// if (avl_data_file_descriptor < 0) +// { +// obi_set_errno(OBI_AVL_ERROR); +// obidebug(1, "\nError opening an AVL tree data file"); +// free(avl_data_file_name); +// return -1; +// } +// free(avl_data_file_name); - // Get the avl data file name - avl_data_file_name = build_avl_data_file_name((avl->header)->avl_name); - if (avl_data_file_name == NULL) - return -1; - - // Open the avl data file - avl_data_file_descriptor = openat(avl->dir_fd, avl_data_file_name, O_RDWR); - if (avl_data_file_descriptor < 0) - { - obi_set_errno(OBI_AVL_ERROR); - obidebug(1, "\nError opening an AVL tree data file"); - free(avl_data_file_name); - return -1; - } - free(avl_data_file_name); + avl_data_file_descriptor = avl->data_fd; // Calculate the new file size old_data_size = ((avl->data)->header)->data_size_max; @@ -620,7 +624,7 @@ int grow_avl_data(OBIDMS_avl_p avl) // TODO Lock when needed // Initialize new data to 0 memset(((avl->data)->data)+old_data_size, 0, new_data_size - old_data_size); - close(avl_data_file_descriptor); + //close(avl_data_file_descriptor); return 0; } @@ -1090,7 +1094,7 @@ OBIDMS_avl_p obi_create_avl(OBIDMS_p dms, const char* avl_name) // Initialize all bits to 0 memset(avl_data->data, 0, (avl_data->header)->data_size_max); - close(avl_data_file_descriptor); + //close(avl_data_file_descriptor); // Create the AVL tree file @@ -1190,7 +1194,10 @@ OBIDMS_avl_p obi_create_avl(OBIDMS_p dms, const char* avl_name) (avl->header)->creation_date = time(NULL); strcpy((avl->header)->avl_name, avl_name); - close(avl_file_descriptor); + //close(avl_file_descriptor); + + avl->avl_fd = avl_file_descriptor; + avl->data_fd = avl_data_file_descriptor; // Add in the list of opened AVL trees *(((dms->opened_avls)->avls)+((dms->opened_avls)->nb_opened_avls)) = avl; @@ -1297,7 +1304,7 @@ OBIDMS_avl_p obi_open_avl(OBIDMS_p dms, const char* avl_name) return NULL; } - close(avl_data_file_descriptor); + //close(avl_data_file_descriptor); // Open the AVL tree file @@ -1383,7 +1390,9 @@ OBIDMS_avl_p obi_open_avl(OBIDMS_p dms, const char* avl_name) avl->directory = dms->avl_directory; avl->dir_fd = avl_dir_file_descriptor; - close(avl_file_descriptor); + //close(avl_file_descriptor); + avl->avl_fd = avl_file_descriptor; + avl->data_fd = avl_data_file_descriptor; // Add in the list of opened AVL trees *(((dms->opened_avls)->avls)+((dms->opened_avls)->nb_opened_avls)) = avl; @@ -1435,6 +1444,9 @@ int obi_close_avl(OBIDMS_avl_p avl) ret_val = -1; } + close(avl->avl_fd); + close(avl->data_fd); + free(avl); } diff --git a/src/obiavl.h b/src/obiavl.h index bc4e918..3641fd6 100644 --- a/src/obiavl.h +++ b/src/obiavl.h @@ -130,6 +130,12 @@ typedef struct OBIDMS_avl { int dir_fd; /**< The file descriptor of the directory entry * usable to refer and scan the AVL tree directory. */ + int avl_fd; /**< The file descriptor of the file + * to refer and scan the AVL tree. + */ + int data_fd; /**< The file descriptor of the file + * to refer and scan the data referred to by the AVL tree. + */ size_t counter; /**< Indicates by how many threads/programs (TODO) the AVL tree is used. */ } OBIDMS_avl_t, *OBIDMS_avl_p; diff --git a/src/obidmscolumn_str.c b/src/obidmscolumn_str.c index c92ca1d..bcc30fd 100644 --- a/src/obidmscolumn_str.c +++ b/src/obidmscolumn_str.c @@ -12,6 +12,7 @@ #include #include +#include #include "obidmscolumn.h" #include "obiview.h" @@ -60,6 +61,30 @@ int obi_column_set_obistr_with_elt_idx(OBIDMS_column_p column, index_t line_nb, if (value_b == NULL) return -1; + if (!(line_nb%100000)) + { + //fprintf(stderr, "\nbleeeh"); + // Unmap and remap the AVL + if (munmap((column->avl)->tree, ((((column->avl)->header)->nb_items_max) * sizeof(AVL_node_t))) < 0) + return -1; + if (munmap(((column->avl)->data)->data, (((column->avl)->data)->header)->data_size_max) < 0) + return -1; + (column->avl)->tree = mmap(NULL, + (((column->avl)->header)->nb_items_max) * sizeof(AVL_node_t), // TODO store avl_size_max + PROT_READ | PROT_WRITE, + MAP_SHARED, + (column->avl)->avl_fd, + ((column->avl)->header)->header_size + ); + ((column->avl)->data)->data = mmap(NULL, + (((column->avl)->data)->header)->data_size_max, + PROT_READ | PROT_WRITE, + MAP_SHARED, + (column->avl)->data_fd, + (((column->avl)->data)->header)->header_size + ); + } + // Add in the AVL tree idx = obi_avl_add(column->avl, value_b); if (idx == -1)