From: Jeff King <peff@peff.net>
To: git@vger.kernel.org
Cc: Junio C Hamano <gitster@pobox.com>,
Christian Couder <chriscool@tuxfamily.org>,
Jakub Narebski <jnareb@gmail.com>,
Eric Sunshine <sunshine@sunshineco.com>
Subject: [PATCH 08/15] provide helpers to access the commit buffer
Date: Mon, 9 Jun 2014 14:11:59 -0400 [thread overview]
Message-ID: <20140609181158.GH20315@sigill.intra.peff.net> (raw)
In-Reply-To: <20140609180236.GA24644@sigill.intra.peff.net>
Many sites look at commit->buffer to get more detailed
information than what is in the parsed commit struct.
However, we sometimes drop commit->buffer to save memory,
in which case the caller would need to read the object
afresh. Some callers do this (leading to duplicated code),
and others do not (which opens the possibility of a segfault
if somebody else frees the buffer).
Let's provide a pair of helpers, "get" and "unuse", that let
callers easily get the buffer. They will use the cached
buffer when possible, and otherwise load from disk using
read_sha1_file.
Note that we also need to add a "get_cached" variant which
returns NULL when we do not have a cached buffer. At first
glance this seems to defeat the purpose of "get", which is
to always provide a return value. However, some log code
paths actually use the NULL-ness of commit->buffer as a
boolean flag to decide whether to try to printing the
commit. At least for now, we want to continue supporting
that use.
Signed-off-by: Jeff King <peff@peff.net>
---
commit.c | 28 ++++++++++++++++++++++++++++
commit.h | 21 +++++++++++++++++++++
2 files changed, 49 insertions(+)
diff --git a/commit.c b/commit.c
index 5cc52e0..b9ecae0 100644
--- a/commit.c
+++ b/commit.c
@@ -250,6 +250,34 @@ void set_commit_buffer(struct commit *commit, void *buffer)
commit->buffer = buffer;
}
+const void *get_cached_commit_buffer(const struct commit *commit)
+{
+ return commit->buffer;
+}
+
+const void *get_commit_buffer(const struct commit *commit)
+{
+ const void *ret = get_cached_commit_buffer(commit);
+ if (!ret) {
+ enum object_type type;
+ unsigned long size;
+ ret = read_sha1_file(commit->object.sha1, &type, &size);
+ if (!ret)
+ die("cannot read commit object %s",
+ sha1_to_hex(commit->object.sha1));
+ if (type != OBJ_COMMIT)
+ die("expected commit for %s, got %s",
+ sha1_to_hex(commit->object.sha1), typename(type));
+ }
+ return ret;
+}
+
+void unuse_commit_buffer(const struct commit *commit, const void *buffer)
+{
+ if (commit->buffer != buffer)
+ free((void *)buffer);
+}
+
void free_commit_buffer(struct commit *commit)
{
free(commit->buffer);
diff --git a/commit.h b/commit.h
index 5cc0bf3..67caf92 100644
--- a/commit.h
+++ b/commit.h
@@ -58,6 +58,27 @@ void parse_commit_or_die(struct commit *item);
void set_commit_buffer(struct commit *, void *buffer);
/*
+ * Get any cached object buffer associated with the commit. Returns NULL
+ * if none. The resulting memory should not be freed.
+ */
+const void *get_cached_commit_buffer(const struct commit *);
+
+/*
+ * Get the commit's object contents, either from cache or by reading the object
+ * from disk. The resulting memory should not be modified, and must be given
+ * to unuse_commit_buffer when the caller is done.
+ */
+const void *get_commit_buffer(const struct commit *);
+
+/*
+ * Tell the commit subsytem that we are done with a particular commit buffer.
+ * The commit and buffer should be the input and return value, respectively,
+ * from an earlier call to get_commit_buffer. The buffer may or may not be
+ * freed by this call; callers should not access the memory afterwards.
+ */
+void unuse_commit_buffer(const struct commit *, const void *buffer);
+
+/*
* Free any cached object buffer associated with the commit.
*/
void free_commit_buffer(struct commit *);
--
2.0.0.729.g520999f
next prev parent reply other threads:[~2014-06-09 18:12 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-09 18:02 [PATCH 0/15] store length of commit->buffer Jeff King
2014-06-09 18:09 ` [PATCH 01/15] alloc: include any-object allocations in alloc_report Jeff King
2014-06-09 18:09 ` [PATCH 02/15] commit: push commit_index update into alloc_commit_node Jeff King
2014-06-10 21:31 ` Junio C Hamano
2014-06-09 18:10 ` [PATCH 03/15] do not create "struct commit" with xcalloc Jeff King
2014-06-10 21:35 ` Junio C Hamano
2014-06-10 21:49 ` Jeff King
2014-06-09 18:10 ` [PATCH 04/15] logmsg_reencode: return const buffer Jeff King
2014-06-10 1:36 ` Eric Sunshine
2014-06-09 18:10 ` [PATCH 05/15] sequencer: use logmsg_reencode in get_message Jeff King
2014-06-10 21:40 ` Junio C Hamano
2014-06-10 21:50 ` Jeff King
2014-06-09 18:11 ` [PATCH 06/15] provide a helper to free commit buffer Jeff King
2014-06-09 18:11 ` [PATCH 07/15] provide a helper to set the " Jeff King
2014-06-09 18:11 ` Jeff King [this message]
2014-06-10 8:00 ` [PATCH 08/15] provide helpers to access " Eric Sunshine
2014-06-09 18:12 ` [PATCH 09/15] use get_cached_commit_buffer where appropriate Jeff King
2014-06-09 18:12 ` [PATCH 10/15] use get_commit_buffer to avoid duplicate code Jeff King
2014-06-10 8:01 ` Eric Sunshine
2014-06-10 20:34 ` Jeff King
2014-06-09 18:13 ` [PATCH 11/15] convert logmsg_reencode to get_commit_buffer Jeff King
2014-06-09 18:13 ` [PATCH 12/15] use get_commit_buffer everywhere Jeff King
2014-06-09 22:40 ` Junio C Hamano
2014-06-10 0:02 ` Jeff King
2014-06-10 0:22 ` Jeff King
2014-06-10 16:06 ` Junio C Hamano
2014-06-10 21:27 ` Jeff King
2014-06-09 18:15 ` [PATCH 13/15] commit-slab: provide a static initializer Jeff King
2014-06-09 18:15 ` [PATCH 14/15] commit: convert commit->buffer to a slab Jeff King
2014-06-09 18:15 ` [PATCH 15/15] commit: record buffer length in cache Jeff King
2014-06-10 5:12 ` Christian Couder
2014-06-10 5:27 ` Jeff King
2014-06-10 20:33 ` Jeff King
2014-06-10 21:30 ` Christian Couder
2014-06-10 21:35 ` [PATCH v2 0/17] store length of commit->buffer Jeff King
2014-06-10 21:36 ` [PATCH 01/17] commit_tree: take a pointer/len pair rather than a const strbuf Jeff King
2014-06-10 21:38 ` [PATCH 02/17] replace dangerous uses of strbuf_attach Jeff King
2014-06-10 21:38 ` [PATCH 03/17] alloc: include any-object allocations in alloc_report Jeff King
2014-06-10 21:39 ` [PATCH 04/17] commit: push commit_index update into alloc_commit_node Jeff King
2014-06-10 21:39 ` [PATCH 05/17] do not create "struct commit" with xcalloc Jeff King
2014-06-10 21:39 ` [PATCH 06/17] logmsg_reencode: return const buffer Jeff King
2014-06-10 21:39 ` [PATCH 07/17] sequencer: use logmsg_reencode in get_message Jeff King
2014-06-10 21:40 ` [PATCH 08/17] provide a helper to free commit buffer Jeff King
2014-06-12 18:22 ` Junio C Hamano
2014-06-12 20:08 ` Jeff King
2014-06-12 22:05 ` Jeff King
2014-06-10 21:40 ` [PATCH 09/17] provide a helper to set the " Jeff King
2014-06-10 21:40 ` [PATCH 10/17] provide helpers to access " Jeff King
2014-06-10 21:40 ` [PATCH 11/17] use get_cached_commit_buffer where appropriate Jeff King
2014-06-10 21:41 ` [PATCH 12/17] use get_commit_buffer to avoid duplicate code Jeff King
2014-06-10 21:41 ` [PATCH 13/17] convert logmsg_reencode to get_commit_buffer Jeff King
2014-06-10 21:41 ` [PATCH 14/17] use get_commit_buffer everywhere Jeff King
2014-06-10 21:42 ` [PATCH 15/17] commit-slab: provide a static initializer Jeff King
2014-06-12 18:15 ` Junio C Hamano
2014-06-12 19:51 ` Jeff King
2014-06-10 21:43 ` [PATCH 16/17] commit: convert commit->buffer to a slab Jeff King
2014-06-10 21:44 ` [PATCH 17/17] commit: record buffer length in cache Jeff King
2014-06-10 21:46 ` [PATCH v2 0/17] store length of commit->buffer Jeff King
2014-06-12 17:22 ` Junio C Hamano
2014-06-13 6:32 ` [PATCH v2] reuse cached commit buffer when parsing signatures Jeff King
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140609181158.GH20315@sigill.intra.peff.net \
--to=peff@peff.net \
--cc=chriscool@tuxfamily.org \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jnareb@gmail.com \
--cc=sunshine@sunshineco.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).