diff options
Diffstat (limited to 'src/object.c')
-rw-r--r-- | src/object.c | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/src/object.c b/src/object.c index 7891893a0..fce99153b 100644 --- a/src/object.c +++ b/src/object.c @@ -261,7 +261,7 @@ int git_object_new(git_object **object_out, git_repository *repo, git_otype type object->source.raw.type = type; - object->refcount++; + object->lru = ++repo->lru_counter; *object_out = object; return GIT_SUCCESS; } @@ -277,7 +277,8 @@ int git_object_lookup(git_object **object_out, git_repository *repo, const git_o object = git_hashtable_lookup(repo->objects, id); if (object != NULL) { *object_out = object; - GIT_OBJECT_INCREF(repo, object); + object->lru = ++repo->lru_counter; + object->can_free = 0; return GIT_SUCCESS; } @@ -330,7 +331,7 @@ int git_object_lookup(git_object **object_out, git_repository *repo, const git_o git_object__source_close(object); git_hashtable_insert(repo->objects, &object->id, object); - GIT_OBJECT_INCREF(repo, object); + object->lru = ++repo->lru_counter; *object_out = object; return GIT_SUCCESS; } @@ -412,17 +413,12 @@ void git_object_close(git_object *object) if (object == NULL) return; - if (--object->refcount <= 0) { - if (object->repo != NULL) { - if (object->in_memory) { - int idx = git_vector_search(&object->repo->memory_objects, object); - git_vector_remove(&object->repo->memory_objects, idx); - } else { - git_hashtable_remove(object->repo->objects, &object->id); - } - } - + if (object->in_memory) { + int idx = git_vector_search(&object->repo->memory_objects, object); + git_vector_remove(&object->repo->memory_objects, idx); git_object__free(object); + } else { + object->can_free = 1; } } |