From 90c62155d65a6bec5c2c293c8ece0b22173f63a3 Mon Sep 17 00:00:00 2001 From: Stefan Beller Date: Fri, 23 Mar 2018 18:20:55 +0100 Subject: repository: introduce raw object store field MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The raw object store field will contain any objects needed for access to objects in a given repository. This patch introduces the raw object store and populates it with the `objectdir`, which used to be part of the repository struct. As the struct gains members, we'll also populate the function to clear the memory for these members. In a later step, we'll introduce a struct object_parser, that will complement the object parsing in a repository struct: The raw object parser is the layer that will provide access to raw object content, while the higher level object parser code will parse raw objects and keeps track of parenthood and other object relationships using 'struct object'. For now only add the lower level to the repository struct. Signed-off-by: Stefan Beller Signed-off-by: Jonathan Nieder Signed-off-by: Nguyễn Thái Ngọc Duy Signed-off-by: Junio C Hamano --- object.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'object.c') diff --git a/object.c b/object.c index 9e6f9ff20b..6ddd61242c 100644 --- a/object.c +++ b/object.c @@ -4,6 +4,7 @@ #include "tree.h" #include "commit.h" #include "tag.h" +#include "object-store.h" static struct object **obj_hash; static int nr_objs, obj_hash_size; @@ -445,3 +446,16 @@ void clear_commit_marks_all(unsigned int flags) obj->flags &= ~flags; } } + +struct raw_object_store *raw_object_store_new(void) +{ + struct raw_object_store *o = xmalloc(sizeof(*o)); + + memset(o, 0, sizeof(*o)); + return o; +} +void raw_object_store_clear(struct raw_object_store *o) +{ + FREE_AND_NULL(o->objectdir); + FREE_AND_NULL(o->alternate_db); +} -- cgit v1.2.3 From 97501e933a6d4d5a8567dbbb44fa3b4bff2ea298 Mon Sep 17 00:00:00 2001 From: Stefan Beller Date: Fri, 23 Mar 2018 18:20:58 +0100 Subject: object-store: free alt_odb_list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Free the memory and reset alt_odb_{list, tail} to NULL. Signed-off-by: Stefan Beller Signed-off-by: Nguyễn Thái Ngọc Duy Signed-off-by: Junio C Hamano --- object.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'object.c') diff --git a/object.c b/object.c index 6ddd61242c..581347b535 100644 --- a/object.c +++ b/object.c @@ -454,8 +454,30 @@ struct raw_object_store *raw_object_store_new(void) memset(o, 0, sizeof(*o)); return o; } + +static void free_alt_odb(struct alternate_object_database *alt) +{ + strbuf_release(&alt->scratch); + oid_array_clear(&alt->loose_objects_cache); + free(alt); +} + +static void free_alt_odbs(struct raw_object_store *o) +{ + while (o->alt_odb_list) { + struct alternate_object_database *next; + + next = o->alt_odb_list->next; + free_alt_odb(o->alt_odb_list); + o->alt_odb_list = next; + } +} + void raw_object_store_clear(struct raw_object_store *o) { FREE_AND_NULL(o->objectdir); FREE_AND_NULL(o->alternate_db); + + free_alt_odbs(o); + o->alt_odb_tail = NULL; } -- cgit v1.2.3 From a80d72db2a73174b3f22142eb2014b33696fd795 Mon Sep 17 00:00:00 2001 From: Stefan Beller Date: Fri, 23 Mar 2018 18:20:59 +0100 Subject: object-store: move packed_git and packed_git_mru to object store MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In a process with multiple repositories open, packfile accessors should be associated to a single repository and not shared globally. Move packed_git and packed_git_mru into the_repository and adjust callers to reflect this. [nd: while at there, wrap access to these two fields in get_packed_git() and get_packed_git_mru(). This allows us to lazily initialize these fields without caller doing that explicitly] Signed-off-by: Stefan Beller Signed-off-by: Jonathan Nieder Signed-off-by: Nguyễn Thái Ngọc Duy Signed-off-by: Junio C Hamano --- object.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'object.c') diff --git a/object.c b/object.c index 581347b535..04631ee841 100644 --- a/object.c +++ b/object.c @@ -452,6 +452,7 @@ struct raw_object_store *raw_object_store_new(void) struct raw_object_store *o = xmalloc(sizeof(*o)); memset(o, 0, sizeof(*o)); + INIT_LIST_HEAD(&o->packed_git_mru); return o; } @@ -480,4 +481,10 @@ void raw_object_store_clear(struct raw_object_store *o) free_alt_odbs(o); o->alt_odb_tail = NULL; + + INIT_LIST_HEAD(&o->packed_git_mru); + /* + * TODO: call close_all_packs once migrated to + * take an object store argument + */ } -- cgit v1.2.3 From d0b59866223f7ef0dcd07bff857f651cd921bc02 Mon Sep 17 00:00:00 2001 From: Stefan Beller Date: Fri, 23 Mar 2018 18:21:00 +0100 Subject: object-store: close all packs upon clearing the object store MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stefan Beller Signed-off-by: Junio C Hamano Signed-off-by: Nguyễn Thái Ngọc Duy Signed-off-by: Junio C Hamano --- object.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'object.c') diff --git a/object.c b/object.c index 04631ee841..4c2cf7ff5d 100644 --- a/object.c +++ b/object.c @@ -5,6 +5,7 @@ #include "commit.h" #include "tag.h" #include "object-store.h" +#include "packfile.h" static struct object **obj_hash; static int nr_objs, obj_hash_size; @@ -483,8 +484,6 @@ void raw_object_store_clear(struct raw_object_store *o) o->alt_odb_tail = NULL; INIT_LIST_HEAD(&o->packed_git_mru); - /* - * TODO: call close_all_packs once migrated to - * take an object store argument - */ + close_all_packs(o); + o->packed_git = NULL; } -- cgit v1.2.3