[systemd-devel] [PATCH 21/26] hashmap: rewrite the implementation

Michal Schmidt mschmidt at redhat.com
Wed Oct 22 05:38:30 PDT 2014


On 10/20/2014 08:42 PM, Lennart Poettering wrote:
> On Thu, 16.10.14 09:50, Michal Schmidt (mschmidt at redhat.com) wrote:
>> +/* Fields that all hashmap/set types must have */
>> +struct HashmapBase {
>> +        const struct hash_ops *hash_ops;  /* hash and compare ops to use */
>> +
>> +        union _packed_ {
>> +                struct indirect_storage indirect; /* if  has_indirect */
>> +                struct direct_storage direct;     /* if !has_indirect */
>> +        };
>> +
>> +        uint8_t type:2;             /* HASHMAP_TYPE_* */
> 
> Should probably be a named enum (see above)
> 
>> +        uint8_t has_indirect:1;     /* whether indirect storage is
>> used */
> 
> Should really be a "bool", no?

Interestingly, changing this confuses pahole greatly.
With all the three bitfields declared as uint8_t pahole showed the struct
layout sanely:

struct HashmapBase {
	const struct hash_ops  *   hash_ops;             /*     0     8 */
	union {
		struct indirect_storage indirect;        /*          39 */
		struct direct_storage direct;            /*          39 */
	};                                               /*     8    39 */
	uint8_t                    type:2;               /*    47: 6  1 */
	uint8_t                    has_indirect:1;       /*    47: 5  1 */
	uint8_t                    n_direct_entries:3;   /*    47: 2  1 */

	/* size: 48, cachelines: 1, members: 5 */
	/* bit_padding: 2 bits */
	/* last cacheline: 48 bytes */
};

With "type" changed to a named enum, "has_indirect" to bool,
and "n_direct_entries" to unsigned, pahole says:

base_type__name_to_size: base_type __unknown__
base_type__name_to_size: base_type __unknown__
die__process_inline_expansion: tag not supported (INVALID)!
base_type__name_to_size: base_type __unknown__
...
struct HashmapBase {
	const struct hash_ops  *   hash_ops;             /*     0     8 */
	union {
		struct indirect_storage indirect;        /*          39 */
		struct direct_storage direct;            /*          39 */
	};                                               /*     8    39 */

	/* Bitfield combined with next fields */

	enum HashmapType           type:2;               /*    44: 6  4 */

	/* XXX 22 bits hole, try to pack */
	/* Bitfield combined with next fields */

	_Bool                      has_indirect:1;       /*    47: 5  1 */

	/* Bitfield combined with previous fields */

	__unknown__                n_direct_entries:3;   /*    44: 2  0 */

	/* size: 48, cachelines: 1, members: 5 */
	/* bit holes: 1, sum bit holes: 22 bits */
	/* padding: 4 */
	/* bit_padding: 252 bits */
	/* last cacheline: 48 bytes */

	/* BRAIN FART ALERT! 48 != 48 + 0(holes), diff = 0 */

};

But as far as I can tell, generated code looks OK and it still runs
fine, so I won't worry about it.

Michal


More information about the systemd-devel mailing list