Re: [PATCH 092/194] object: move grafts to object parser

2018-02-06 Thread Stefan Beller
On Mon, Feb 5, 2018 at 8:07 PM, Eric Sunshine  wrote:
> On Mon, Feb 5, 2018 at 6:55 PM, Stefan Beller  wrote:
>> Grafts are only meaningful in the context of a single repository.
>> Therefore they cannot be global.
>>
>> Signed-off-by: Stefan Beller 
>> Signed-off-by: Jonathan Nieder 
>> ---
>> diff --git a/commit.c b/commit.c
>> @@ -121,20 +120,22 @@ int register_commit_graft(struct commit_graft *graft, 
>> int ignore_dups)
>> if (ignore_dups)
>> free(graft);
>> else {
>> -   free(commit_graft[pos]);
>> -   commit_graft[pos] = graft;
>> +   free(the_repository->parsed_objects.grafts[pos]);
>> +   the_repository->parsed_objects.grafts[pos] = graft;
>> diff --git a/object.h b/object.h
>> @@ -4,9 +4,13 @@
>>  struct object_parser {
>> struct object **obj_hash;
>> int nr_objs, obj_hash_size;
>> +
>> +   /* parent substitutions from .git/info/grafts and .git/shallow */
>> +   struct commit_graft **grafts;
>> +   int grafts_alloc, grafts_nr;
>>  };
>
> Do items moved to object_parser need to get freed when object_parser
> itself is freed? Is that happening in some other patch?

No, this patch supposedly should free the memory via
repo_free (which either does it itself or calls some specific free
for the grafts)

Thanks for finding the mem leak!
Stefan


Re: [PATCH 092/194] object: move grafts to object parser

2018-02-05 Thread Eric Sunshine
On Mon, Feb 5, 2018 at 6:55 PM, Stefan Beller  wrote:
> Grafts are only meaningful in the context of a single repository.
> Therefore they cannot be global.
>
> Signed-off-by: Stefan Beller 
> Signed-off-by: Jonathan Nieder 
> ---
> diff --git a/commit.c b/commit.c
> @@ -121,20 +120,22 @@ int register_commit_graft(struct commit_graft *graft, 
> int ignore_dups)
> if (ignore_dups)
> free(graft);
> else {
> -   free(commit_graft[pos]);
> -   commit_graft[pos] = graft;
> +   free(the_repository->parsed_objects.grafts[pos]);
> +   the_repository->parsed_objects.grafts[pos] = graft;
> diff --git a/object.h b/object.h
> @@ -4,9 +4,13 @@
>  struct object_parser {
> struct object **obj_hash;
> int nr_objs, obj_hash_size;
> +
> +   /* parent substitutions from .git/info/grafts and .git/shallow */
> +   struct commit_graft **grafts;
> +   int grafts_alloc, grafts_nr;
>  };

Do items moved to object_parser need to get freed when object_parser
itself is freed? Is that happening in some other patch?


[PATCH 092/194] object: move grafts to object parser

2018-02-05 Thread Stefan Beller
From: Jonathan Nieder 

Grafts are only meaningful in the context of a single repository.
Therefore they cannot be global.

Signed-off-by: Stefan Beller 
Signed-off-by: Jonathan Nieder 
---
 commit.c | 44 +++-
 object.h |  6 +-
 2 files changed, 28 insertions(+), 22 deletions(-)

diff --git a/commit.c b/commit.c
index 2137a0b9c6..2ad5537ed7 100644
--- a/commit.c
+++ b/commit.c
@@ -1,6 +1,7 @@
 #include "cache.h"
 #include "tag.h"
 #include "commit.h"
+#include "repository.h"
 #include "object-store.h"
 #include "pkt-line.h"
 #include "utf8.h"
@@ -98,9 +99,6 @@ static timestamp_t parse_commit_date(const char *buf, const 
char *tail)
return parse_timestamp(dateptr, NULL, 10);
 }
 
-static struct commit_graft **commit_graft;
-static int commit_graft_alloc, commit_graft_nr;
-
 static const unsigned char *commit_graft_sha1_access(size_t index, void *table)
 {
struct commit_graft **commit_graft_table = table;
@@ -109,7 +107,8 @@ static const unsigned char *commit_graft_sha1_access(size_t 
index, void *table)
 
 static int commit_graft_pos(const unsigned char *sha1)
 {
-   return sha1_pos(sha1, commit_graft, commit_graft_nr,
+   return sha1_pos(sha1, the_repository->parsed_objects.grafts,
+   the_repository->parsed_objects.grafts_nr,
commit_graft_sha1_access);
 }
 
@@ -121,20 +120,22 @@ int register_commit_graft(struct commit_graft *graft, int 
ignore_dups)
if (ignore_dups)
free(graft);
else {
-   free(commit_graft[pos]);
-   commit_graft[pos] = graft;
+   free(the_repository->parsed_objects.grafts[pos]);
+   the_repository->parsed_objects.grafts[pos] = graft;
}
return 1;
}
pos = -pos - 1;
-   ALLOC_GROW(commit_graft, commit_graft_nr + 1, commit_graft_alloc);
-   commit_graft_nr++;
-   if (pos < commit_graft_nr)
-   memmove(commit_graft + pos + 1,
-   commit_graft + pos,
-   (commit_graft_nr - pos - 1) *
-   sizeof(*commit_graft));
-   commit_graft[pos] = graft;
+   ALLOC_GROW(the_repository->parsed_objects.grafts,
+  the_repository->parsed_objects.grafts_nr + 1,
+  the_repository->parsed_objects.grafts_alloc);
+   the_repository->parsed_objects.grafts_nr++;
+   if (pos < the_repository->parsed_objects.grafts_nr)
+   memmove(the_repository->parsed_objects.grafts + pos + 1,
+   the_repository->parsed_objects.grafts + pos,
+   (the_repository->parsed_objects.grafts_nr - pos - 1) *
+   sizeof(*the_repository->parsed_objects.grafts));
+   the_repository->parsed_objects.grafts[pos] = graft;
return 0;
 }
 
@@ -216,14 +217,14 @@ struct commit_graft *lookup_commit_graft(const struct 
object_id *oid)
pos = commit_graft_pos(oid->hash);
if (pos < 0)
return NULL;
-   return commit_graft[pos];
+   return the_repository->parsed_objects.grafts[pos];
 }
 
 int for_each_commit_graft(each_commit_graft_fn fn, void *cb_data)
 {
int i, ret;
-   for (i = ret = 0; i < commit_graft_nr && !ret; i++)
-   ret = fn(commit_graft[i], cb_data);
+   for (i = ret = 0; i < the_repository->parsed_objects.grafts_nr && !ret; 
i++)
+   ret = fn(the_repository->parsed_objects.grafts[i], cb_data);
return ret;
 }
 
@@ -232,10 +233,11 @@ int unregister_shallow(const struct object_id *oid)
int pos = commit_graft_pos(oid->hash);
if (pos < 0)
return -1;
-   if (pos + 1 < commit_graft_nr)
-   MOVE_ARRAY(commit_graft + pos, commit_graft + pos + 1,
-  commit_graft_nr - pos - 1);
-   commit_graft_nr--;
+   if (pos + 1 < the_repository->parsed_objects.grafts_nr)
+   MOVE_ARRAY(the_repository->parsed_objects.grafts + pos,
+  the_repository->parsed_objects.grafts + pos + 1,
+  the_repository->parsed_objects.grafts_nr - pos - 1);
+   the_repository->parsed_objects.grafts_nr--;
return 0;
 }
 
diff --git a/object.h b/object.h
index 727a03ebd6..b667404f88 100644
--- a/object.h
+++ b/object.h
@@ -4,9 +4,13 @@
 struct object_parser {
struct object **obj_hash;
int nr_objs, obj_hash_size;
+
+   /* parent substitutions from .git/info/grafts and .git/shallow */
+   struct commit_graft **grafts;
+   int grafts_alloc, grafts_nr;
 };
 
-#define OBJECT_PARSER_INIT { NULL, 0, 0 }
+#define OBJECT_PARSER_INIT { NULL, 0, 0, NULL, 0, 0 }
 
 struct object_list {
struct object *item;
-- 
2.15.1.433.g936d1b9894.dirty