From: Karsten Blees <karsten.blees@gmail.com>
To: Jeff King <peff@peff.net>
Cc: git@vger.kernel.org
Subject: Re: struct hashmap_entry packing
Date: Tue, 29 Jul 2014 22:40:12 +0200 [thread overview]
Message-ID: <53D806AC.3070806@gmail.com> (raw)
In-Reply-To: <20140728171743.GA1927@peff.net>
Am 28.07.2014 19:17, schrieb Jeff King:
> Hi Karsten,
>
> The hashmap_entry documentation claims:
>
> `struct hashmap_entry`::
>
> An opaque structure representing an entry in the hash table,
> which must be used as first member of user data structures.
> Ideally it should be followed by an int-sized member to prevent
> unused memory on 64-bit systems due to alignment.
>
> I'm not sure if the statement about alignment is true. If I have a
> struct like:
>
> struct magic {
> struct hashmap_entry map;
> int x;
> };
>
> the statement above implies that I should be able to fit this into only
> 16 bytes on an LP64 system. But I can't convince gcc to do it. And I
> think that makes sense, if you consider code like:
>
> memset(&magic.map, 0, sizeof(struct hashmap_entry));
>
> The sizeof() has to be the same regardless of whether the hashmap_entry
> is standalone or in another struct, and therefore must be padded up to
> 16 bytes. If we stored "x" in that padding in the combined struct, it
> would be overwritten by our memset.
>
The struct-packing patch was ultimately dropped because there was no way
to reliably make it work on all platforms. See [1] for discussion, [2] for
the final, 'most compatible' version.
> Am I missing anything? If this is the case, we should probably drop that
> bit from the documentation.
Hmmm. Now that we have "__attribute__((packed))" in pack-bitmap.h, perhaps
we should do the same for stuct hashmap_entry? (Which was the original
proposal anyway...). Only works for GCC, but that should cover most builds
/ platforms.
Btw.: Using struct-packing on 'struct bitmap_disk_entry' means that the
binary format of .bitmap files is incompatible between GCC and other
builds, correct?
> It's possible that we could get around it by
> embedding the hashmap_entry elements directly into the parent struct,
Already tried that, see [3].
[1] http://article.gmane.org/gmane.comp.version-control.git/239069
[2] http://article.gmane.org/gmane.comp.version-control.git/241865
[3] http://article.gmane.org/gmane.comp.version-control.git/239435
next prev parent reply other threads:[~2014-07-29 20:40 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-28 17:17 struct hashmap_entry packing Jeff King
2014-07-29 20:40 ` Karsten Blees [this message]
2014-08-01 22:37 ` Jeff King
2014-08-01 23:10 ` [PATCH] pack-bitmap: do not use gcc packed attribute Jeff King
2014-08-01 23:12 ` Jeff King
2014-08-04 19:19 ` Karsten Blees
2014-08-05 18:38 ` Vicent Martí
2014-08-05 18:47 ` Jeff King
2014-08-06 18:58 ` Karsten Blees
2014-08-06 19:32 ` Junio C Hamano
2014-08-04 19:20 ` struct hashmap_entry packing Karsten Blees
2014-08-05 18:51 ` 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=53D806AC.3070806@gmail.com \
--to=karsten.blees@gmail.com \
--cc=git@vger.kernel.org \
--cc=peff@peff.net \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.