Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Clarification of code comments and reality in malloc.h #6

Open
brett-walker opened this issue Feb 3, 2018 · 0 comments
Open

Clarification of code comments and reality in malloc.h #6

brett-walker opened this issue Feb 3, 2018 · 0 comments

Comments

@brett-walker
Copy link

brett-walker commented Feb 3, 2018

Hi Devs,

I've been doing some deep code diving and I seem to have found a discrepancy between code comments and reality. This difference could hint at a bug or performance degradation, but I doubt it. I thought to ask to get clarification.

In malloc.h, the comments and definition for arena_header, ARENA_PADDING and free_arena_header are:

/*
* This structure should be a power of two. This becomes the
* alignment unit.
*/
struct arena_header {
malloc_tag_t tag;
size_t attrs; /* Bits 0..1: Type
2..3: Heap,
4..31: MSB of the size */
struct free_arena_header *next, *prev;
#ifdef DEBUG_MALLOC
unsigned long _pad[3];
unsigned int magic;
#endif
};
/* Pad to 2*sizeof(struct arena_header) */
#define ARENA_PADDING ((2 * sizeof(struct arena_header)) - \
(sizeof(struct arena_header) + \
sizeof(struct free_arena_header *) + \
sizeof(struct free_arena_header *)))
/*
* This structure should be no more than twice the size of the
* previous structure.
*/
struct free_arena_header {
struct arena_header a;
struct free_arena_header *next_free, *prev_free;
size_t _pad[ARENA_PADDING];
};

In my environment, the size of int and pointer are both 32-bits (x86 32-bits). When compiled with DEBUG_MALLOC undefined; I get

sizeof(arena_header) == 16
sizeof(free_arena_header) == 56

Which disagrees with the comments. The comments do make a lot of sense to ensure good alignment. To make the code agree with the comments (the easier option); the definition of ARENA_PADDING needs to be altered to:

#define ARENA_PADDING (((2 * sizeof(struct arena_header)) - \
		       (sizeof(struct arena_header) + \
			sizeof(struct free_arena_header *) +	\
			sizeof(struct free_arena_header *))) / sizeof(size_t))

This includes a reduction in the size of the padding by the unit size of the padding, i.e sizeof(size_t). Given that this is the memory sub-system, this small change could have a significant impact.

What are your thoughts?

Feedback most welcome,
Brett

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant