Merge pull request #637 from nulltoken/issue/odb-refcount

Fix git_repository_set_odb() refcount issue
This commit is contained in:
Vicent Martí 2012-04-23 17:25:11 -07:00
commit 4795807ad5
3 changed files with 38 additions and 0 deletions

View File

@ -552,6 +552,7 @@ void git_repository_set_odb(git_repository *repo, git_odb *odb)
repo->_odb = odb;
GIT_REFCOUNT_OWN(repo->_odb, repo);
GIT_REFCOUNT_INC(odb);
}
int git_repository_index__weakptr(git_index **out, git_repository *repo)

View File

@ -68,3 +68,19 @@ void test_repo_getters__head_orphan(void)
git_reference_free(ref);
git_repository_free(repo);
}
void test_repo_getters__retrieving_the_odb_honors_the_refcount(void)
{
git_odb *odb;
git_repository *repo;
cl_git_pass(git_repository_open(&repo, "testrepo.git"));
cl_git_pass(git_repository_odb(&odb, repo));
cl_assert(((git_refcount *)odb)->refcount == 2);
git_repository_free(repo);
cl_assert(((git_refcount *)odb)->refcount == 1);
git_odb_free(odb);
}

View File

@ -57,3 +57,24 @@ void test_repo_setters__setting_a_new_index_on_a_repo_which_has_already_loaded_o
*/
repo = NULL;
}
void test_repo_setters__setting_a_new_odb_on_a_repo_which_already_loaded_one_properly_honors_the_refcount(void)
{
git_odb *new_odb;
cl_git_pass(git_odb_open(&new_odb, "./testrepo.git/objects"));
cl_assert(((git_refcount *)new_odb)->refcount == 1);
git_repository_set_odb(repo, new_odb);
cl_assert(((git_refcount *)new_odb)->refcount == 2);
git_repository_free(repo);
cl_assert(((git_refcount *)new_odb)->refcount == 1);
git_odb_free(new_odb);
/*
* Ensure the cleanup method won't try to free the repo as it's already been taken care of
*/
repo = NULL;
}