Michael Haggerty <mhagger@xxxxxxxxxxxx> writes: > Change the callers that were already passing copies to > add_object_array_with_mode() to either skip the copy, or (if the > memory needed to be allocated anyway) freeing the memory itself. > > A part of this commit effectively reverts > > 70d26c6e76 read_revisions_from_stdin: make copies for handle_revision_arg > > because the copying introduced by that commit (which is still > necessary) is now done at a deeper level. Good. Thanks for working on this. > > Signed-off-by: Michael Haggerty <mhagger@xxxxxxxxxxxx> > --- > bundle.c | 2 +- > object.c | 26 +++++++++++++++++++++++--- > object.h | 8 +++++++- > revision.c | 6 ++++-- > 4 files changed, 35 insertions(+), 7 deletions(-) > > diff --git a/bundle.c b/bundle.c > index 4b0e5cd..3d64311 100644 > --- a/bundle.c > +++ b/bundle.c > @@ -281,7 +281,7 @@ int create_bundle(struct bundle_header *header, const char *path, > if (!get_sha1_hex(buf.buf + 1, sha1)) { > struct object *object = parse_object_or_die(sha1, buf.buf); > object->flags |= UNINTERESTING; > - add_pending_object(&revs, object, xstrdup(buf.buf)); > + add_pending_object(&revs, object, buf.buf); > } > } else if (!get_sha1_hex(buf.buf, sha1)) { > struct object *object = parse_object_or_die(sha1, buf.buf); > diff --git a/object.c b/object.c > index 10b5349..e4ff714 100644 > --- a/object.c > +++ b/object.c > @@ -260,11 +260,18 @@ void add_object_array(struct object *obj, const char *name, struct object_array > add_object_array_with_mode(obj, name, array, S_IFINVALID); > } > > +/* > + * A zero-length string to which object_array_entry::name can be > + * initialized without requiring a malloc/free. > + */ > +char object_array_slopbuf[1]; > + > void add_object_array_with_mode(struct object *obj, const char *name, struct object_array *array, unsigned mode) > { > unsigned nr = array->nr; > unsigned alloc = array->alloc; > struct object_array_entry *objects = array->objects; > + struct object_array_entry *entry; > > if (nr >= alloc) { > alloc = (alloc + 32) * 2; > @@ -272,9 +279,16 @@ void add_object_array_with_mode(struct object *obj, const char *name, struct obj > array->alloc = alloc; > array->objects = objects; > } > - objects[nr].item = obj; > - objects[nr].name = name; > - objects[nr].mode = mode; > + entry = &objects[nr]; > + entry->item = obj; > + if (!name) > + entry->name = NULL; > + else if (!*name) > + /* Use our own empty string instead of allocating one: */ > + entry->name = object_array_slopbuf; > + else > + entry->name = xstrdup(name); > + entry->mode = mode; > array->nr = ++nr; > } > > @@ -289,6 +303,9 @@ void object_array_filter(struct object_array *array, > if (src != dst) > objects[dst] = objects[src]; > dst++; > + } else { > + if (objects[src].name != object_array_slopbuf) > + free(objects[src].name); > } > } > array->nr = dst; > @@ -319,6 +336,9 @@ void object_array_remove_duplicates(struct object_array *array) > if (src != array->nr) > objects[array->nr] = objects[src]; > array->nr++; > + } else { > + if (objects[src].name != object_array_slopbuf) > + free(objects[src].name); > } > } > } > diff --git a/object.h b/object.h > index 6c1c27f..2ff68c5 100644 > --- a/object.h > +++ b/object.h > @@ -11,7 +11,13 @@ struct object_array { > unsigned int alloc; > struct object_array_entry { > struct object *item; > - const char *name; > + /* > + * name or NULL. If non-NULL, the memory pointed to > + * is owned by this object *except* if it points at > + * object_array_slopbuf, which is a static copy of the > + * empty string. > + */ > + char *name; > unsigned mode; > } *objects; > }; > diff --git a/revision.c b/revision.c > index be73cb4..4aeda33 100644 > --- a/revision.c > +++ b/revision.c > @@ -88,7 +88,9 @@ void add_object(struct object *obj, > struct name_path *path, > const char *name) > { > - add_object_array(obj, path_name(path, name), p); > + char *pn = path_name(path, name); > + add_object_array(obj, pn, p); > + free(pn); > } > > static void mark_blob_uninteresting(struct blob *blob) > @@ -1288,7 +1290,7 @@ static void read_revisions_from_stdin(struct rev_info *revs, > } > die("options not supported in --stdin mode"); > } > - if (handle_revision_arg(xstrdup(sb.buf), revs, 0, > + if (handle_revision_arg(sb.buf, revs, 0, > REVARG_CANNOT_BE_FILENAME)) > die("bad revision '%s'", sb.buf); > } -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html