Allocate cached_refs objects dynamically
authorMichael Haggerty <mhagger@alum.mit.edu>
Fri, 12 Aug 2011 22:36:27 +0000 (00:36 +0200)
committerJunio C Hamano <gitster@pobox.com>
Sun, 14 Aug 2011 22:18:52 +0000 (15:18 -0700)
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
refs.c

diff --git a/refs.c b/refs.c
index 10aebcc68908b36ad6d59dbd86c5c32f76399229..b325fc71fe473437e84513a91dd2eb7b057cdc6f 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -157,7 +157,7 @@ static struct cached_refs {
        char did_packed;
        struct ref_list *loose;
        struct ref_list *packed;
-} cached_refs, submodule_refs;
+} *cached_refs, *submodule_refs;
 static struct ref_list *current_ref;
 
 static struct ref_list *extra_refs;
@@ -181,6 +181,15 @@ static void clear_cached_refs(struct cached_refs *ca)
        ca->did_loose = ca->did_packed = 0;
 }
 
+struct cached_refs *create_cached_refs(void)
+{
+       struct cached_refs *refs;
+       refs = xmalloc(sizeof(struct cached_refs));
+       refs->did_loose = refs->did_packed = 0;
+       refs->loose = refs->packed = NULL;
+       return refs;
+}
+
 /*
  * Return a pointer to a cached_refs for the specified submodule. For
  * the main repository, use submodule==NULL. The returned structure
@@ -189,12 +198,17 @@ static void clear_cached_refs(struct cached_refs *ca)
  */
 static struct cached_refs *get_cached_refs(const char *submodule)
 {
-       if (!submodule)
-               return &cached_refs;
-       else {
-               /* For now, don't reuse the refs cache for submodules. */
-               clear_cached_refs(&submodule_refs);
-               return &submodule_refs;
+       if (!submodule) {
+               if (!cached_refs)
+                       cached_refs = create_cached_refs();
+               return cached_refs;
+       } else {
+               if (!submodule_refs)
+                       submodule_refs = create_cached_refs();
+               else
+                       /* For now, don't reuse the refs cache for submodules. */
+                       clear_cached_refs(submodule_refs);
+               return submodule_refs;
        }
 }