@@ -485,9 +485,9 @@ static void process_commit(struct commit *commit, void *data)
pcd->current_commit = commit->object.oid;
}
-static void process_object(struct object *obj, const char *path, void *data)
+static void process_object(struct object *obj, const char *path, void *show_data, void *carry_data)
{
- struct process_commit_data *pcd = data;
+ struct process_commit_data *pcd = show_data;
if (oideq(&pcd->looking_for, &obj->oid) && !pcd->dst->len) {
reset_revision_walk();
@@ -3068,7 +3068,7 @@ static void show_commit_pack_hint(struct commit *commit, void *_data)
}
static void show_object_pack_hint(struct object *object, const char *name,
- void *_data)
+ void *show_data, void *carry_dataa)
{
struct object_entry *oe = packlist_find(&to_pack, &object->oid);
if (!oe)
@@ -3252,7 +3252,7 @@ static void show_commit(struct commit *commit, void *data)
propagate_island_marks(commit);
}
-static void show_object(struct object *obj, const char *name, void *data)
+static void show_object(struct object *obj, const char *name, void *show_data, void *carry_data)
{
add_preferred_base_object(name);
add_object_entry(&obj->oid, obj->type, name, 0);
@@ -3274,7 +3274,7 @@ static void show_object(struct object *obj, const char *name, void *data)
}
}
-static void show_object__ma_allow_any(struct object *obj, const char *name, void *data)
+static void show_object__ma_allow_any(struct object *obj, const char *name, void *show_data, void *carry_data)
{
assert(arg_missing_action == MA_ALLOW_ANY);
@@ -3285,10 +3285,10 @@ static void show_object__ma_allow_any(struct object *obj, const char *name, void
if (!has_object(the_repository, &obj->oid, 0))
return;
- show_object(obj, name, data);
+ show_object(obj, name, show_data, carry_data);
}
-static void show_object__ma_allow_promisor(struct object *obj, const char *name, void *data)
+static void show_object__ma_allow_promisor(struct object *obj, const char *name, void *show_data, void *carry_data)
{
assert(arg_missing_action == MA_ALLOW_PROMISOR);
@@ -3299,7 +3299,7 @@ static void show_object__ma_allow_promisor(struct object *obj, const char *name,
if (!has_object(the_repository, &obj->oid, 0) && is_promisor_object(&obj->oid))
return;
- show_object(obj, name, data);
+ show_object(obj, name, show_data, carry_data);
}
static int option_parse_missing_action(const struct option *opt,
@@ -3547,7 +3547,8 @@ static int get_object_list_from_bitmap(struct rev_info *revs)
static void record_recent_object(struct object *obj,
const char *name,
- void *data)
+ void *show_data,
+ void *carry_data)
{
oid_array_append(&recent_objects, &obj->oid);
}
@@ -266,7 +266,7 @@ static int finish_object(struct object *obj, const char *name, void *cb_data)
return 0;
}
-static void show_object(struct object *obj, const char *name, void *cb_data)
+static void show_object(struct object *obj, const char *name, void *cb_data, void *carry_data)
{
struct rev_list_info *info = cb_data;
struct rev_info *revs = info->revs;
@@ -60,7 +60,7 @@ static void process_blob(struct traversal_context *ctx,
if (r & LOFR_MARK_SEEN)
obj->flags |= SEEN;
if (r & LOFR_DO_SHOW)
- ctx->show_object(obj, path->buf, ctx->show_data);
+ ctx->show_object(obj, path->buf, ctx->show_data, NULL);
strbuf_setlen(path, pathlen);
}
@@ -191,7 +191,7 @@ static void process_tree(struct traversal_context *ctx,
if (r & LOFR_MARK_SEEN)
obj->flags |= SEEN;
if (r & LOFR_DO_SHOW)
- ctx->show_object(obj, base->buf, ctx->show_data);
+ ctx->show_object(obj, base->buf, ctx->show_data, NULL);
if (base->len)
strbuf_addch(base, '/');
@@ -207,7 +207,7 @@ static void process_tree(struct traversal_context *ctx,
if (r & LOFR_MARK_SEEN)
obj->flags |= SEEN;
if (r & LOFR_DO_SHOW)
- ctx->show_object(obj, base->buf, ctx->show_data);
+ ctx->show_object(obj, base->buf, ctx->show_data, NULL);
strbuf_setlen(base, baselen);
free_tree_buffer(tree);
@@ -335,7 +335,7 @@ static void traverse_trees_and_blobs(struct traversal_context *ctx,
continue;
if (obj->type == OBJ_TAG) {
obj->flags |= SEEN;
- ctx->show_object(obj, name, ctx->show_data);
+ ctx->show_object(obj, name, ctx->show_data, NULL);
continue;
}
if (!path)
@@ -6,7 +6,7 @@ struct object;
struct rev_info;
typedef void (*show_commit_fn)(struct commit *, void *);
-typedef void (*show_object_fn)(struct object *, const char *, void *);
+typedef void (*show_object_fn)(struct object *, const char *, void *, void *);
void traverse_commit_list(struct rev_info *, show_commit_fn, show_object_fn, void *);
typedef void (*show_edge_fn)(struct commit *);
@@ -459,9 +459,9 @@ struct bitmap_show_data {
struct bitmap *base;
};
-static void show_object(struct object *object, const char *name, void *data_)
+static void show_object(struct object *object, const char *name, void *show_data, void *carry_data)
{
- struct bitmap_show_data *data = data_;
+ struct bitmap_show_data *data = show_data;
int bitmap_pos;
bitmap_pos = bitmap_position(data->bitmap_git, &object->oid);
@@ -1268,9 +1268,9 @@ struct bitmap_test_data {
};
static void test_show_object(struct object *object, const char *name,
- void *data)
+ void *show_data, void *carry_data)
{
- struct bitmap_test_data *tdata = data;
+ struct bitmap_test_data *tdata = show_data;
int bitmap_pos;
bitmap_pos = bitmap_position(tdata->bitmap_git, &object->oid);
@@ -47,14 +47,14 @@ static int add_one_ref(const char *path, const struct object_id *oid,
* The traversal will have already marked us as SEEN, so we
* only need to handle any progress reporting here.
*/
-static void mark_object(struct object *obj, const char *name, void *data)
+static void mark_object(struct object *obj, const char *name, void *show_data, void *carry_data)
{
- update_progress(data);
+ update_progress(show_data);
}
-static void mark_commit(struct commit *c, void *data)
+static void mark_commit(struct commit *c, void *show_data)
{
- mark_object(&c->object, NULL, data);
+ mark_object(&c->object, NULL, show_data, NULL);
}
struct recent_data {
During the pack-objects process, "show_object" function will be called to find the object and show the process("show_object_fn" in "list-object.h"), the function definition contains three parameters: 1. struct object *obj(contains object type, flags, and oid). 2. const char *name(the object name). 3. void *show_data(function to show progress info). This commit adds a new parameter: "void *carry_data", the reason is mainly based on scalability and performance considerations when showing an object, space for time, avoid costly temporary calculations in the "show" phase. For example, carry the ownership relationship between blob or tree object and the referred commit to avoid redundant and expensive calculations. Signed-off-by: Teng Long <dyroneteng@gmail.com> --- builtin/describe.c | 4 ++-- builtin/pack-objects.c | 15 ++++++++------- builtin/rev-list.c | 2 +- list-objects.c | 8 ++++---- list-objects.h | 2 +- pack-bitmap.c | 8 ++++---- reachable.c | 8 ++++---- 7 files changed, 24 insertions(+), 23 deletions(-)