[io] Cutting down on system calls in trie_read
This commit is contained in:
83
src/trie.c
83
src/trie.c
@@ -987,38 +987,45 @@ trie_t *trie_read(FILE *file) {
|
|||||||
|
|
||||||
uint32_t signature;
|
uint32_t signature;
|
||||||
|
|
||||||
if (!file_read_uint32(file, &signature))
|
if (!file_read_uint32(file, &signature)) {
|
||||||
goto exit_file_read;
|
goto exit_file_read;
|
||||||
|
}
|
||||||
|
|
||||||
if (signature != TRIE_SIGNATURE)
|
if (signature != TRIE_SIGNATURE) {
|
||||||
goto exit_file_read;
|
goto exit_file_read;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t alphabet_size;
|
uint32_t alphabet_size;
|
||||||
|
|
||||||
if (!file_read_uint32(file, &alphabet_size))
|
if (!file_read_uint32(file, &alphabet_size)) {
|
||||||
goto exit_file_read;
|
goto exit_file_read;
|
||||||
|
}
|
||||||
|
|
||||||
log_debug("alphabet_size=%d\n", alphabet_size);
|
log_debug("alphabet_size=%d\n", alphabet_size);
|
||||||
if (alphabet_size > NUM_CHARS)
|
if (alphabet_size > NUM_CHARS)
|
||||||
goto exit_file_read;
|
goto exit_file_read;
|
||||||
|
|
||||||
if (!file_read_chars(file, (char *)alphabet, alphabet_size))
|
if (!file_read_chars(file, (char *)alphabet, alphabet_size)) {
|
||||||
goto exit_file_read;
|
goto exit_file_read;
|
||||||
|
}
|
||||||
|
|
||||||
trie_t *trie = trie_new_empty(alphabet, alphabet_size);
|
trie_t *trie = trie_new_empty(alphabet, alphabet_size);
|
||||||
if (!trie)
|
if (!trie) {
|
||||||
goto exit_file_read;
|
goto exit_file_read;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t num_keys;
|
uint32_t num_keys;
|
||||||
if (!file_read_uint32(file, &num_keys))
|
if (!file_read_uint32(file, &num_keys)) {
|
||||||
goto exit_file_read;
|
goto exit_file_read;
|
||||||
|
}
|
||||||
|
|
||||||
trie->num_keys = num_keys;
|
trie->num_keys = num_keys;
|
||||||
|
|
||||||
uint32_t num_nodes;
|
uint32_t num_nodes;
|
||||||
|
|
||||||
if (!file_read_uint32(file, &num_nodes))
|
if (!file_read_uint32(file, &num_nodes)) {
|
||||||
goto exit_trie_created;
|
goto exit_trie_created;
|
||||||
|
}
|
||||||
|
|
||||||
log_debug("num_nodes=%d\n", num_nodes);
|
log_debug("num_nodes=%d\n", num_nodes);
|
||||||
trie_node_array_resize(trie->nodes, num_nodes);
|
trie_node_array_resize(trie->nodes, num_nodes);
|
||||||
@@ -1026,45 +1033,69 @@ trie_t *trie_read(FILE *file) {
|
|||||||
int32_t base;
|
int32_t base;
|
||||||
int32_t check;
|
int32_t check;
|
||||||
trie_node_t node;
|
trie_node_t node;
|
||||||
for (i = 0; i < num_nodes; i++) {
|
|
||||||
if (!file_read_uint32(file, (uint32_t *)&base) ||
|
|
||||||
!file_read_uint32(file, (uint32_t *)&check))
|
|
||||||
goto exit_trie_created;
|
|
||||||
|
|
||||||
node.base = base;
|
unsigned char *buf;
|
||||||
node.check = check;
|
size_t buf_size = num_nodes * sizeof(uint32_t) * 2;
|
||||||
trie_node_array_push(trie->nodes, node);
|
buf = malloc(buf_size);
|
||||||
|
|
||||||
|
unsigned char *buf_ptr;
|
||||||
|
|
||||||
|
if (file_read_chars(file, (char *)buf, buf_size)) {
|
||||||
|
buf_ptr = buf;
|
||||||
|
for (i = 0; i < num_nodes; i++) {
|
||||||
|
node.base = (int32_t)file_deserialize_uint32(buf_ptr);
|
||||||
|
buf_ptr += sizeof(uint32_t);
|
||||||
|
node.check = (int32_t)file_deserialize_uint32(buf_ptr);
|
||||||
|
buf_ptr += sizeof(uint32_t);
|
||||||
|
|
||||||
|
trie_node_array_push(trie->nodes, node);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(buf);
|
||||||
|
buf = NULL;
|
||||||
|
|
||||||
uint32_t num_data_nodes;
|
uint32_t num_data_nodes;
|
||||||
if (!file_read_uint32(file, &num_data_nodes))
|
if (!file_read_uint32(file, &num_data_nodes)) {
|
||||||
goto exit_trie_created;
|
goto exit_trie_created;
|
||||||
|
}
|
||||||
|
|
||||||
trie_data_array_resize(trie->data, num_data_nodes);
|
trie_data_array_resize(trie->data, num_data_nodes);
|
||||||
log_debug("num_data_nodes=%d\n", num_data_nodes);
|
log_debug("num_data_nodes=%d\n", num_data_nodes);
|
||||||
|
|
||||||
uint32_t tail_ptr;
|
|
||||||
uint32_t data;
|
|
||||||
trie_data_node_t data_node;
|
trie_data_node_t data_node;
|
||||||
|
|
||||||
for (i = 0; i < num_data_nodes; i++) {
|
buf_size = num_data_nodes * sizeof(uint32_t) * 2;
|
||||||
if (!file_read_uint32(file, &tail_ptr) ||
|
buf = malloc(buf_size);
|
||||||
!file_read_uint32(file, &data))
|
if (buf == NULL) {
|
||||||
goto exit_trie_created;
|
goto exit_trie_created;
|
||||||
data_node.tail = tail_ptr;
|
|
||||||
data_node.data = data;
|
|
||||||
trie_data_array_push(trie->data, data_node);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (file_read_chars(file, (char *)buf, buf_size)) {
|
||||||
|
buf_ptr = buf;
|
||||||
|
for (i = 0; i < num_data_nodes; i++) {
|
||||||
|
data_node.tail = (int32_t)file_deserialize_uint32(buf_ptr);
|
||||||
|
buf_ptr += sizeof(uint32_t);
|
||||||
|
data_node.data = (int32_t)file_deserialize_uint32(buf_ptr);
|
||||||
|
buf_ptr += sizeof(uint32_t);
|
||||||
|
|
||||||
|
trie_data_array_push(trie->data, data_node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(buf);
|
||||||
|
|
||||||
uint32_t tail_len;
|
uint32_t tail_len;
|
||||||
if (!file_read_uint32(file, &tail_len))
|
if (!file_read_uint32(file, &tail_len)) {
|
||||||
goto exit_trie_created;
|
goto exit_trie_created;
|
||||||
|
}
|
||||||
|
|
||||||
uchar_array_resize(trie->tail, tail_len);
|
uchar_array_resize(trie->tail, tail_len);
|
||||||
trie->tail->n = tail_len;
|
trie->tail->n = tail_len;
|
||||||
|
|
||||||
if (!file_read_chars(file, (char *)trie->tail->a, tail_len))
|
if (!file_read_chars(file, (char *)trie->tail->a, tail_len)) {
|
||||||
goto exit_trie_created;
|
goto exit_trie_created;
|
||||||
|
}
|
||||||
|
|
||||||
return trie;
|
return trie;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user