summaryrefslogtreecommitdiff
path: root/refs
diff options
context:
space:
mode:
authorMichael Haggerty <mhagger@alum.mit.edu>2017-09-25 08:00:15 (GMT)
committerJunio C Hamano <gitster@pobox.com>2017-09-25 09:02:46 (GMT)
commit9dd389f3d8d220d764beaca7237ac33de5de81c7 (patch)
treed01ba487af7daf60b7376a22303675cc5557a3d1 /refs
parentba1c052fa616eb93a654375e8b9d59daa47c28a8 (diff)
downloadgit-9dd389f3d8d220d764beaca7237ac33de5de81c7.zip
git-9dd389f3d8d220d764beaca7237ac33de5de81c7.tar.gz
git-9dd389f3d8d220d764beaca7237ac33de5de81c7.tar.bz2
packed_ref_store: get rid of the `ref_cache` entirely
Now that everything has been changed to read what it needs directly out of the `packed-refs` file, `packed_ref_store` doesn't need to maintain a `ref_cache` at all. So get rid of it. First of all, this will save a lot of memory and lots of little allocations. Instead of needing to store complicated parsed data structures in memory, we just mmap the file (potentially sharing memory with other processes) and parse only what we need. Moreover, since the mmapped access to the file reads only the parts of the file that it needs, this might save reading all of the data from disk at all (at least if the file starts out sorted). Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'refs')
-rw-r--r--refs/packed-backend.c29
1 files changed, 2 insertions, 27 deletions
diff --git a/refs/packed-backend.c b/refs/packed-backend.c
index dbbba45..3829e9c 100644
--- a/refs/packed-backend.c
+++ b/refs/packed-backend.c
@@ -45,8 +45,6 @@ struct packed_ref_cache {
*/
struct packed_ref_store *refs;
- struct ref_cache *cache;
-
/* Is the `packed-refs` file currently mmapped? */
int mmapped;
@@ -148,7 +146,6 @@ static void release_packed_ref_buffer(struct packed_ref_cache *packed_refs)
static int release_packed_ref_cache(struct packed_ref_cache *packed_refs)
{
if (!--packed_refs->referrers) {
- free_ref_cache(packed_refs->cache);
stat_validity_clear(&packed_refs->validity);
release_packed_ref_buffer(packed_refs);
free(packed_refs);
@@ -719,15 +716,10 @@ static const char *find_reference_location(struct packed_ref_cache *cache,
static struct packed_ref_cache *read_packed_refs(struct packed_ref_store *refs)
{
struct packed_ref_cache *packed_refs = xcalloc(1, sizeof(*packed_refs));
- struct ref_dir *dir;
- struct ref_iterator *iter;
int sorted = 0;
- int ok;
packed_refs->refs = refs;
acquire_packed_ref_cache(packed_refs);
- packed_refs->cache = create_ref_cache(NULL, NULL);
- packed_refs->cache->root->flag &= ~REF_INCOMPLETE;
packed_refs->peeled = PEELED_NONE;
if (!load_contents(packed_refs))
@@ -800,23 +792,6 @@ static struct packed_ref_cache *read_packed_refs(struct packed_ref_store *refs)
packed_refs->eof = buf_copy + size;
}
- dir = get_ref_dir(packed_refs->cache->root);
- iter = mmapped_ref_iterator_begin(
- packed_refs,
- packed_refs->buf + packed_refs->header_len,
- packed_refs->eof);
- while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
- struct ref_entry *entry =
- create_ref_entry(iter->refname, iter->oid, iter->flags);
-
- if ((iter->flags & REF_KNOWS_PEELED))
- ref_iterator_peel(iter, &entry->u.value.peeled);
- add_ref_entry(dir, entry);
- }
-
- if (ok != ITER_DONE)
- die("error reading packed-refs file %s", refs->path);
-
return packed_refs;
}
@@ -975,8 +950,8 @@ static struct ref_iterator *packed_ref_iterator_begin(
else
start = packed_refs->buf + packed_refs->header_len;
- iter->iter0 = mmapped_ref_iterator_begin(
- packed_refs, start, packed_refs->eof);
+ iter->iter0 = mmapped_ref_iterator_begin(packed_refs,
+ start, packed_refs->eof);
iter->flags = flags;