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

Re: [PATCH 9/9] commit-reach.h: add missing declarations (hdr-check)

From
Ramsay Jones <ramsay@ramsayjones.plus.com>
Date
Sep 20, 2018, 15:35 UTC
Message-ID
<2809251f-6eba-b0ac-68fe-b972809ccff7@ramsayjones.plus.com>
In-Reply-To
<eb77d563-8b3e-9b00-59b8-b050e6378c69@gmail.com>
On 20/09/18 00:38, Derrick Stolee wrote:
Show 20 quoted lines
> On 9/18/2018 8:15 PM, Ramsay Jones wrote:
>> Signed-off-by: Ramsay Jones <ramsay@ramsayjones.plus.com>
>> ---
>>   commit-reach.h | 5 +++--
>>   1 file changed, 3 insertions(+), 2 deletions(-)
>>
>> diff --git a/commit-reach.h b/commit-reach.h
>> index 7d313e2975..f41d8f6ba3 100644
>> --- a/commit-reach.h
>> +++ b/commit-reach.h
>> @@ -1,12 +1,13 @@
>>   #ifndef __COMMIT_REACH_H__
>>   #define __COMMIT_REACH_H__
>>   +#include "commit.h"
>>   #include "commit-slab.h"
>>   -struct commit;
>>   struct commit_list;
>> -struct contains_cache;
> 
> Interesting that you needed all of commit.h here, and these 'struct commit' and 'struct contains_cache' were not enough. Was there a reason you needed the entire header file instead of just adding a missing struct declaration?

Actually, the original version of this patch didn't add that include! I changed my mind just before sending this series out, since I felt the original patch was conflating two issues.

The reason for the #include of 'commit.h' in this patch, but not with my original patch, has to to with the inline functions used in the commit-slab implementation. My original patch used the 'commit-slab-{decl,impl}.h' header files to sidestep the need for the definition of 'struct commit'.

I have included an 'RFC on-top' patch below to show you what I had in mind. NOTE: I had not finished writing the commit message and you could argue that the 'implement' macro should go in the ref-filter.c file, since that is were the contains_cache is 'defined and initialised'. I had not intended to send this to the list ... :-D

Note that, if you compile with optimizations disabled, then run this script:

  $ cat -n dup-static.sh
       1 #!/bin/sh
       2 
       3 nm $1 | grep ' t ' | cut -d' ' -f3 | sort | uniq -c |
       4 	sort -rn | grep -v '      1'
  $ 
  $ ./dup-static.sh git | grep contains
       24 init_contains_cache_with_stride
       24 init_contains_cache
       24 contains_cache_peek
       24 contains_cache_at_peek
       24 contains_cache_at
       24 clear_contains_cache
  $ 
  
you will find 24 copies of the commit-slab routines for the
contains_cache. Of course, when you enable optimizations again,
these duplicate static functions (mostly) disappear. (Two static
functions remain, the rest are actually inlined at -O2).

However, if you apply the patch below, you end up with all of the functions in the contains_cache commit-slab implementation as external functions. Some of those functions are never called, so it's not necessarily a win ... ;-)

ATB, Ramsay Jones

-- >8 --
Subject: [PATCH] commit-reach: use a shared commit-slab for the contains_cache

Commit a9f1f1f9f8 ("commit-slab.h: code split", 2018-05-19) separated the commit-slab interface from its implementation, to allow for the definition of a public commit-slab data structure. This enabled us to avoid including the commit-slab implementation in a header file, which could result in the replication of the commit-slab functions in each compilation unit in which it was included.

Signed-off-by: Ramsay Jones <ramsay@ramsayjones.plus.com>
---
 commit-reach.c | 3 +++
 commit-reach.h | 6 +++---
 2 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/commit-reach.c b/commit-reach.c
index 622eeb313d..7223cacdd1 100644
--- a/commit-reach.c
+++ b/commit-reach.c
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "commit.h"
+#include "commit-slab-impl.h"
 #include "commit-graph.h"
 #include "decorate.h"
 #include "prio-queue.h"
@@ -18,6 +19,8 @@
 
 static const unsigned all_flags = (PARENT1 | PARENT2 | STALE | RESULT);
 
+implement_shared_commit_slab(contains_cache, enum contains_result);
+
 static int queue_has_nonstale(struct prio_queue *queue)
 {
 	int i;
diff --git a/commit-reach.h b/commit-reach.h
index f41d8f6ba3..acf3b2d188 100644
--- a/commit-reach.h
+++ b/commit-reach.h
@@ -1,9 +1,9 @@
 #ifndef __COMMIT_REACH_H__
 #define __COMMIT_REACH_H__
 
-#include "commit.h"
-#include "commit-slab.h"
+#include "commit-slab-decl.h"
 
+struct commit;
 struct commit_list;
 struct ref_filter;
 struct object_id;
@@ -55,7 +55,7 @@ enum contains_result {
 	CONTAINS_YES
 };
 
-define_commit_slab(contains_cache, enum contains_result);
+define_shared_commit_slab(contains_cache, enum contains_result);
 
 int commit_contains(struct ref_filter *filter, struct commit *commit,
 		    struct commit_list *list, struct contains_cache *cache);
-- 
2.19.0
Previous: Derrick StoleeNext: Derrick Stolee
Message 3 of 4 in “commit-reach.h: add missing declarations (hdr-check)”
  1. 9/9 commit-reach.h: add missing declarations (hdr-check)Ramsay Jones, Sep 19, 2018
  2. Derrick StoleeSep 19, 2018
  3. Ramsay JonesSep 20, 2018
  4. Derrick StoleeSep 21, 2018

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.