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

Re: [PATCH 12/13] refs.c: use a bit for ref_update have_old

From
Torsten Bögershausen <tboegi@web.de>
Date
Dec 4, 2014, 16:10 UTC
Message-ID
<5480875D.6050803@web.de>
In-Reply-To
<1417681763-32334-13-git-send-email-sbeller@google.com>

On 12/04/2014 09:29 AM, Stefan Beller wrote: Somewhat short commit message, especially the motivation is missing.

What do we gain with this patch ? In the struct the compiler needs to layout 2*20 bytes for the sha's. It follows an int, typically 4 bytes. It follows another int, now with one bit. Then we have the pointer "struct ref_lock *lock", which needs to be aligned on 4 byte boundary for a 32 bit processor, or an 8 byte boundary for a 64 bit machine.

Our "1 bit int" is padded with 31 bits. We do not gain anything in memory consumption. (unless we declare int flags to be 31 bits, and the compiler may join "have_old" and "flags" together into one int in memory.

But there is a price to pay: The generated code to fiddle out the bits from an int becomes more complicated. You need to fetch the memory from one int, mask and shift. Some processors can do this, out of my mind some ARM can, some can not.

We need to run the compiler to look at the generated code of course.
 
Show 23 quoted lines
> Signed-off-by: Stefan Beller <sbeller@google.com>
> ---
> 
> Notes:
>     Also a patch, which hasn't been posted on the mailing list before.
> 
>  refs.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/refs.c b/refs.c
> index b54b5b3..2942227 100644
> --- a/refs.c
> +++ b/refs.c
> @@ -3532,7 +3532,7 @@ struct ref_update {
>  	unsigned char new_sha1[20];
>  	unsigned char old_sha1[20];
>  	int flags; /* REF_NODEREF? */
> -	int have_old; /* 1 if old_sha1 is valid, 0 otherwise */
> +	int have_old:1; /* 1 if old_sha1 is valid, 0 otherwise */
>  	struct ref_lock *lock;
>  	int type;
>  	char *msg;
> 
Previous: Stefan BellerNext: Andreas Schwab
Message 14 of 25 in “[PATCHv3 00/13] the refs-transactions-reflog series”
  1. Stefan BellerDec 4, 2014
  2. 01/13 refs.c: make ref_transaction_create a wrapper for ref_transaction_updateStefan Beller, Dec 4, 2014
  3. 02/13 refs.c: make ref_transaction_delete a wrapper for ref_transaction_updateStefan Beller, Dec 4, 2014
  4. 03/13 refs.c: add a function to append a reflog entry to a fdStefan Beller, Dec 4, 2014
  5. 04/13 refs.c: rename the transaction functionsStefan Beller, Dec 4, 2014
  6. 05/13 refs.c: rename transaction.updates to transaction.ref_updatesStefan Beller, Dec 4, 2014
  7. 06/13 refs.c: add a transaction function to truncate or append a reflog entryStefan Beller, Dec 4, 2014
  8. 07/13 reflog.c: use a reflog transaction when writing during expireStefan Beller, Dec 4, 2014
  9. 08/13 refs.c: rename log_ref_setup to create_reflogStefan Beller, Dec 4, 2014
  10. 09/13 refs.c: remove unlock_ref/close_ref/commit_ref from the refs apiStefan Beller, Dec 4, 2014
  11. 10/13 refs.c: remove lock_any_ref_for_updateStefan Beller, Dec 4, 2014
  12. 11/13 refs.c: don't expose the internal struct ref_lock in the header fileStefan Beller, Dec 4, 2014
  13. 12/13 refs.c: use a bit for ref_update have_oldStefan Beller, Dec 4, 2014
  14. Torsten BögershausenDec 4, 2014
  15. Andreas SchwabDec 4, 2014
  16. 13/13 refs.c: allow deleting refs with a broken sha1Stefan Beller, Dec 4, 2014
  17. Michael HaggertyDec 4, 2014
  18. Jonathan NiederDec 4, 2014
  19. Jonathan NiederDec 4, 2014
  20. Stefan BellerDec 4, 2014
  21. Michael HaggertyDec 4, 2014
  22. Junio C HamanoDec 4, 2014
  23. Junio C HamanoDec 4, 2014
  24. Stefan BellerDec 4, 2014
  25. Jonathan NiederDec 4, 2014

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.