diff options
author | ZyX <kp-pav@yandex.ru> | 2015-08-29 00:52:34 +0300 |
---|---|---|
committer | ZyX <kp-pav@yandex.ru> | 2015-10-08 22:01:06 +0300 |
commit | 690d280fa8d7fd98969fa3fc5bae09a2cd928da6 (patch) | |
tree | 1e2a7dd3a44d790d84a8c2c890e88c29c26d09e1 | |
parent | 29a3e972ded23b2a3f960c572c1c69e98646ae67 (diff) | |
download | rneovim-690d280fa8d7fd98969fa3fc5bae09a2cd928da6.tar.gz rneovim-690d280fa8d7fd98969fa3fc5bae09a2cd928da6.tar.bz2 rneovim-690d280fa8d7fd98969fa3fc5bae09a2cd928da6.zip |
shada: Save an allocation when writing local marks
-rw-r--r-- | src/nvim/shada.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/src/nvim/shada.c b/src/nvim/shada.c index 197c3e4dcd..190e5a6cbe 100644 --- a/src/nvim/shada.c +++ b/src/nvim/shada.c @@ -2282,7 +2282,6 @@ static inline ShaDaWriteResult shada_read_when_writing( k = kh_put(file_marks, &wms->file_marks, fname, &kh_ret); FileMarks *const filemarks = &kh_val(&wms->file_marks, k); if (kh_ret > 0) { - kh_key(&wms->file_marks, k) = xstrdup(fname); memset(filemarks, 0, sizeof(*filemarks)); } if (entry.timestamp > filemarks->greatest_timestamp) { @@ -2298,7 +2297,22 @@ static inline ShaDaWriteResult shada_read_when_writing( filemarks->additional_marks[filemarks->additional_marks_size - 1] = entry; } else { - COMPARE_WITH_ENTRY(&filemarks->marks[idx], entry); + PossiblyFreedShadaEntry *const wms_entry = &filemarks->marks[idx]; + if (wms_entry->data.type != kSDItemMissing) { + if (wms_entry->data.timestamp >= entry.timestamp) { + shada_free_shada_entry(&entry); + break; + } + if (wms_entry->can_free_entry) { + if (kh_key(&wms->file_marks, k) + == wms_entry->data.data.filemark.fname) { + kh_key(&wms->file_marks, k) = entry.data.filemark.fname; + } + shada_free_shada_entry(&wms_entry->data); + } + } + wms_entry->can_free_entry = true; + wms_entry->data = entry; } } else { #define FREE_POSSIBLY_FREED_SHADA_ENTRY(entry) \ @@ -2700,7 +2714,6 @@ static ShaDaWriteResult shada_write(ShaDaWriteDef *const sd_writer, k = kh_put(file_marks, &wms->file_marks, fname, &kh_ret); FileMarks *const filemarks = &kh_val(&wms->file_marks, k); if (kh_ret > 0) { - kh_key(&wms->file_marks, k) = xstrdup(fname); memset(filemarks, 0, sizeof(*filemarks)); } do { @@ -2807,7 +2820,6 @@ static ShaDaWriteResult shada_write(ShaDaWriteDef *const sd_writer, i++) { if (kh_exist(&wms->file_marks, i)) { *cur_file_marks++ = &kh_val(&wms->file_marks, i); - xfree((void *) kh_key(&wms->file_marks, i)); } } qsort((void *) all_file_markss, file_markss_size, sizeof(*all_file_markss), |