diff options
author | Russell Belfer <rb@github.com> | 2013-12-13 00:11:38 +0400 |
---|---|---|
committer | Russell Belfer <rb@github.com> | 2013-12-13 00:11:38 +0400 |
commit | 9cfce2735d77f4d8b6005e62349dd97c0c6de5ab (patch) | |
tree | b538c09a7d7d6285f218a052019332ac02bb314c /src | |
parent | 11bd7a034ba9046a7ba601c446e937377d507065 (diff) |
Cleanups, renames, and leak fixes
This renames git_vector_free_all to the better git_vector_free_deep
and also contains a couple of memory leak fixes based on valgrind
checks. The fixes are specifically: failure to free global dir
path variables when not compiled with threading on and failure to
free filters from the filter registry that had not be initialized
fully.
Diffstat (limited to 'src')
-rw-r--r-- | src/blame.c | 2 | ||||
-rw-r--r-- | src/checkout.c | 2 | ||||
-rw-r--r-- | src/diff.c | 2 | ||||
-rw-r--r-- | src/diff_tform.c | 4 | ||||
-rw-r--r-- | src/fileops.c | 13 | ||||
-rw-r--r-- | src/filter.c | 2 | ||||
-rw-r--r-- | src/indexer.c | 4 | ||||
-rw-r--r-- | src/iterator.c | 2 | ||||
-rw-r--r-- | src/merge.c | 2 | ||||
-rw-r--r-- | src/pathspec.c | 2 | ||||
-rw-r--r-- | src/push.c | 2 | ||||
-rw-r--r-- | src/remote.c | 4 | ||||
-rw-r--r-- | src/status.c | 2 | ||||
-rw-r--r-- | src/transports/http.c | 2 | ||||
-rw-r--r-- | src/vector.c | 2 | ||||
-rw-r--r-- | src/vector.h | 2 |
16 files changed, 28 insertions, 21 deletions
diff --git a/src/blame.c b/src/blame.c index f10ed409a..a1357415a 100644 --- a/src/blame.c +++ b/src/blame.c @@ -139,7 +139,7 @@ void git_blame_free(git_blame *blame) free_hunk(hunk); git_vector_free(&blame->hunks); - git_vector_free_all(&blame->paths); + git_vector_free_deep(&blame->paths); git_array_clear(blame->line_index); diff --git a/src/checkout.c b/src/checkout.c index f7dd052c7..0f30d16f3 100644 --- a/src/checkout.c +++ b/src/checkout.c @@ -1765,7 +1765,7 @@ static void checkout_data_clear(checkout_data *data) git_vector_free(&data->removes); git_pool_clear(&data->pool); - git_vector_free_all(&data->conflicts); + git_vector_free_deep(&data->conflicts); git__free(data->pfx); data->pfx = NULL; diff --git a/src/diff.c b/src/diff.c index 83adc2a8c..7f2e58c0c 100644 --- a/src/diff.c +++ b/src/diff.c @@ -476,7 +476,7 @@ static int diff_list_apply_options( static void diff_list_free(git_diff *diff) { - git_vector_free_all(&diff->deltas); + git_vector_free_deep(&diff->deltas); git_pathspec__vfree(&diff->pathspec); git_pool_clear(&diff->pool); diff --git a/src/diff_tform.c b/src/diff_tform.c index da4bdb3f5..263a64d12 100644 --- a/src/diff_tform.c +++ b/src/diff_tform.c @@ -209,7 +209,7 @@ int git_diff_merge(git_diff *onto, const git_diff *from) git_pool_strdup_safe(&onto->pool, onto->opts.new_prefix); } - git_vector_free_all(&onto_new); + git_vector_free_deep(&onto_new); git_pool_clear(&onto_pool); return error; @@ -440,7 +440,7 @@ static int apply_splits_and_deletes( return 0; on_error: - git_vector_free_all(&onto); + git_vector_free_deep(&onto); return -1; } diff --git a/src/fileops.c b/src/fileops.c index 98dcd3269..a60689f3f 100644 --- a/src/fileops.c +++ b/src/fileops.c @@ -615,6 +615,8 @@ static git_futils_dirs_guess_cb git_futils__dir_guess[GIT_FUTILS_DIR__MAX] = { git_futils_guess_template_dirs, }; +static int git_futils__dirs_shutdown_set = 0; + void git_futils_dirs_global_shutdown(void) { int i; @@ -631,8 +633,6 @@ int git_futils_dirs_global_init(void) for (i = 0; !error && i < GIT_FUTILS_DIR__MAX; i++) error = git_futils_dirs_get(&path, i); - git__on_shutdown(git_futils_dirs_global_shutdown); - return error; } @@ -652,9 +652,16 @@ int git_futils_dirs_get(const git_buf **out, git_futils_dir_t which) GITERR_CHECK_ERROR(git_futils_check_selector(which)); - if (!git_buf_len(&git_futils__dirs[which])) + if (!git_buf_len(&git_futils__dirs[which])) { + /* prepare shutdown if we're going to need it */ + if (!git_futils__dirs_shutdown_set) { + git__on_shutdown(git_futils_dirs_global_shutdown); + git_futils__dirs_shutdown_set = 1; + } + GITERR_CHECK_ERROR( git_futils__dir_guess[which](&git_futils__dirs[which])); + } *out = &git_futils__dirs[which]; return 0; diff --git a/src/filter.c b/src/filter.c index 9f866fe88..ff81eb14e 100644 --- a/src/filter.c +++ b/src/filter.c @@ -69,7 +69,7 @@ static void filter_registry_shutdown(void) return; git_vector_foreach(®->filters, pos, fdef) { - if (fdef->initialized && fdef->filter && fdef->filter->shutdown) { + if (fdef->filter && fdef->filter->shutdown) { fdef->filter->shutdown(fdef->filter); fdef->initialized = false; } diff --git a/src/indexer.c b/src/indexer.c index 718c69814..6132571cc 100644 --- a/src/indexer.c +++ b/src/indexer.c @@ -1010,7 +1010,7 @@ void git_indexer_free(git_indexer *idx) if (idx == NULL) return; - git_vector_free_all(&idx->objects); + git_vector_free_deep(&idx->objects); if (idx->pack) { struct git_pack_entry *pentry; @@ -1020,7 +1020,7 @@ void git_indexer_free(git_indexer *idx) git_oidmap_free(idx->pack->idx_cache); } - git_vector_free_all(&idx->deltas); + git_vector_free_deep(&idx->deltas); git_packfile_free(idx->pack); git_filebuf_cleanup(&idx->pack_file); git__free(idx); diff --git a/src/iterator.c b/src/iterator.c index 118bbb880..0e7d0db85 100644 --- a/src/iterator.c +++ b/src/iterator.c @@ -920,7 +920,7 @@ static fs_iterator_frame *fs_iterator__alloc_frame(fs_iterator *fi) static void fs_iterator__free_frame(fs_iterator_frame *ff) { - git_vector_free_all(&ff->entries); + git_vector_free_deep(&ff->entries); git__free(ff); } diff --git a/src/merge.c b/src/merge.c index 5640be56b..d6db19243 100644 --- a/src/merge.c +++ b/src/merge.c @@ -2383,7 +2383,7 @@ done: git_index_set_caps(index_repo, index_repo_caps); git_index_free(index_repo); - git_vector_free_all(&paths); + git_vector_free_deep(&paths); return error; } diff --git a/src/pathspec.c b/src/pathspec.c index f16e19f47..bad8dacdb 100644 --- a/src/pathspec.c +++ b/src/pathspec.c @@ -102,7 +102,7 @@ int git_pathspec__vinit( /* free data from the pathspec vector */ void git_pathspec__vfree(git_vector *vspec) { - git_vector_free_all(vspec); + git_vector_free_deep(vspec); } struct pathspec_match_context { diff --git a/src/push.c b/src/push.c index adba880df..dd77864a5 100644 --- a/src/push.c +++ b/src/push.c @@ -541,7 +541,7 @@ static int queue_objects(git_push *push) error = 0; on_error: - git_vector_free_all(&commits); + git_vector_free_deep(&commits); return error; } diff --git a/src/remote.c b/src/remote.c index 689de230a..294a8709d 100644 --- a/src/remote.c +++ b/src/remote.c @@ -1138,7 +1138,7 @@ int git_remote_list(git_strarray *remotes_list, git_repository *repo) cfg, "^remote\\..*\\.(push)?url$", remote_list_cb, &list); if (error < 0) { - git_vector_free_all(&list); + git_vector_free_deep(&list); return error; } @@ -1617,7 +1617,7 @@ static int copy_refspecs(git_strarray *array, git_remote *remote, unsigned int p return 0; on_error: - git_vector_free_all(&refspecs); + git_vector_free_deep(&refspecs); return -1; } diff --git a/src/status.c b/src/status.c index 9bde8fb57..7a1472d8d 100644 --- a/src/status.c +++ b/src/status.c @@ -367,7 +367,7 @@ void git_status_list_free(git_status_list *status) git_diff_free(status->head2idx); git_diff_free(status->idx2wd); - git_vector_free_all(&status->paired); + git_vector_free_deep(&status->paired); git__memzero(status, sizeof(*status)); git__free(status); diff --git a/src/transports/http.c b/src/transports/http.c index 0e1bbf60d..c6aaeb9cf 100644 --- a/src/transports/http.c +++ b/src/transports/http.c @@ -404,7 +404,7 @@ static void clear_parser_state(http_subtransport *t) git__free(t->location); t->location = NULL; - git_vector_free_all(&t->www_authenticate); + git_vector_free_deep(&t->www_authenticate); } static int write_chunk(gitno_socket *socket, const char *buffer, size_t len) diff --git a/src/vector.c b/src/vector.c index b1ea89606..050e032a0 100644 --- a/src/vector.c +++ b/src/vector.c @@ -77,7 +77,7 @@ void git_vector_free(git_vector *v) v->_alloc_size = 0; } -void git_vector_free_all(git_vector *v) +void git_vector_free_deep(git_vector *v) { size_t i; diff --git a/src/vector.h b/src/vector.h index defe22466..d318463c6 100644 --- a/src/vector.h +++ b/src/vector.h @@ -23,7 +23,7 @@ typedef struct git_vector { int git_vector_init(git_vector *v, size_t initial_size, git_vector_cmp cmp); void git_vector_free(git_vector *v); -void git_vector_free_all(git_vector *v); /* free each entry and self */ +void git_vector_free_deep(git_vector *v); /* free each entry and self */ void git_vector_clear(git_vector *v); int git_vector_dup(git_vector *v, const git_vector *src, git_vector_cmp cmp); void git_vector_swap(git_vector *a, git_vector *b); |