git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 4/6] object-file: drop oid field from find_cached_object() return value

From
Jeff King <peff@peff.net>
Date
Nov 18, 2024, 09:55 UTC
Message-ID
<20241118095515.GD3992317@coredump.intra.peff.net>
In-Reply-To
<20241118095423.GA3990835@coredump.intra.peff.net>

The pretend_object_file() function adds to an array mapping oids to object contents, which are later retrieved with find_cached_object(). We naturally need to store the oid for each entry, since it's the lookup key.

But find_cached_object() also returns a hard-coded empty_tree object. There we don't care about its oid field and instead compare against the_hash_algo->empty_tree. The oid field is left as all-zeroes.

This all works, but it means that the cached_object struct we return from find_cached_object() may or may not have a valid oid field, depend whether it is the hard-coded tree or came from pretend_object_file().

Nobody looks at the field, so there's no bug. But let's future-proof it by returning only the object contents themselves, not the oid. We'll continue to call this "struct cached_object", and the array entry mapping the key to those contents will be a "cached_object_entry".

This would also let us swap out the array for a better data structure (like a hashmap) if we chose, but there's not much point. The only code that adds an entry is git-blame, which adds at most a single entry per process.

Signed-off-by: Jeff King <peff@peff.net>
---
 object-file.c | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)
diff --git a/object-file.c b/object-file.c
index 4d4280543e..67a6731066 100644
--- a/object-file.c
+++ b/object-file.c
@@ -317,27 +317,28 @@ int hash_algo_by_length(int len)
  * to write them into the object store (e.g. a browse-only
  * application).
  */
-static struct cached_object {
+static struct cached_object_entry {
 	struct object_id oid;
-	enum object_type type;
-	const void *buf;
-	unsigned long size;
+	struct cached_object {
+		enum object_type type;
+		const void *buf;
+		unsigned long size;
+	} value;
 } *cached_objects;
 static int cached_object_nr, cached_object_alloc;
 
 static struct cached_object *find_cached_object(const struct object_id *oid)
 {
 	static struct cached_object empty_tree = {
-		/* no oid needed; we'll look it up manually based on the_hash_algo */
 		.type = OBJ_TREE,
 		.buf = "",
 	};
 	int i;
-	struct cached_object *co = cached_objects;
+	struct cached_object_entry *co = cached_objects;
 
 	for (i = 0; i < cached_object_nr; i++, co++) {
 		if (oideq(&co->oid, oid))
-			return co;
+			return &co->value;
 	}
 	if (oideq(oid, the_hash_algo->empty_tree))
 		return &empty_tree;
@@ -1850,7 +1851,7 @@ int oid_object_info(struct repository *r,
 int pretend_object_file(void *buf, unsigned long len, enum object_type type,
 			struct object_id *oid)
 {
-	struct cached_object *co;
+	struct cached_object_entry *co;
 	char *co_buf;
 
 	hash_object_file(the_hash_algo, buf, len, type, oid);
@@ -1859,11 +1860,11 @@ int pretend_object_file(void *buf, unsigned long len, enum object_type type,
 		return 0;
 	ALLOC_GROW(cached_objects, cached_object_nr + 1, cached_object_alloc);
 	co = &cached_objects[cached_object_nr++];
-	co->size = len;
-	co->type = type;
+	co->value.size = len;
+	co->value.type = type;
 	co_buf = xmalloc(len);
 	memcpy(co_buf, buf, len);
-	co->buf = co_buf;
+	co->value.buf = co_buf;
 	oidcpy(&co->oid, oid);
 	return 0;
 }
-- 
2.47.0.547.g778689293a
Previous: Jeff KingNext: Jeff King
Message 21 of 25 in “-Wunterminated-string-initialization warning with GCC 15 in object-file.c”
  1. Sam JamesNov 17, 2024
  2. Jeff KingNov 17, 2024
  3. 1/5 object-file: prefer array-of-bytes initializer for hash literalsJeff King, Nov 17, 2024
  4. René ScharfeNov 17, 2024
  5. Jeff KingNov 18, 2024
  6. 2/5 object-file: drop confusing oid initializer of empty_tree structJeff King, Nov 17, 2024
  7. 3/5 object-file: move empty_tree struct into find_cached_object()Jeff King, Nov 17, 2024
  8. Patrick SteinhardtNov 18, 2024
  9. Jeff KingNov 18, 2024
  10. 4/5 object-file: drop oid field from find_cached_object() return valueJeff King, Nov 17, 2024
  11. 5/5 object-file: inline empty tree and blob literalsJeff King, Nov 17, 2024
  12. Patrick SteinhardtNov 18, 2024
  13. brian m. carlsonNov 17, 2024
  14. Jeff KingNov 18, 2024
  15. Sam JamesNov 18, 2024
  16. Patrick SteinhardtNov 18, 2024
  17. 0/6 -Wunterminated-string-initialization warning + cleanupsJeff King, Nov 18, 2024
  18. 1/6 object-file: prefer array-of-bytes initializer for hash literalsJeff King, Nov 18, 2024
  19. 2/6 object-file: drop confusing oid initializer of empty_tree structJeff King, Nov 18, 2024
  20. 3/6 object-file: move empty_tree struct into find_cached_object()Jeff King, Nov 18, 2024
  21. 4/6 object-file: drop oid field from find_cached_object() return valueJeff King, Nov 18, 2024
  22. 5/6 object-file: treat cached_object values as constJeff King, Nov 18, 2024
  23. 6/6 object-file: inline empty tree and blob literalsJeff King, Nov 18, 2024
  24. Patrick SteinhardtNov 18, 2024
  25. Junio C HamanoNov 18, 2024

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.