diff options
-rw-r--r-- | base/memento.c | 65 |
1 files changed, 43 insertions, 22 deletions
diff --git a/base/memento.c b/base/memento.c index ea809a51c..aa60999bb 100644 --- a/base/memento.c +++ b/base/memento.c @@ -385,33 +385,54 @@ struct Memento_BlkDetails typedef struct Memento_BlkHeader Memento_BlkHeader; -struct Memento_BlkHeader -{ - size_t rawsize; - int sequence; - int lastCheckedOK; - int flags; +#ifdef MEMENTO_DETAILS +#define MEMENTO_DETAIL_FIELDS \ + Memento_BlkDetails *details;\ + Memento_BlkDetails **details_tail; +#else +#define MEMENTO_DETAIL_FIELDS +#endif - const char *label; +#define MEMENTO_BLKHEADER_FIELDS \ + size_t rawsize; \ + int sequence; \ + int lastCheckedOK; \ + int flags; \ + \ + const char *label; \ + \ + /* Blocks are held in a linked list for LRU */ \ + Memento_BlkHeader *next; \ + /* Reused as 'parent' when printing nested list */ \ + Memento_BlkHeader *prev; \ + \ + /* Blocks are held in a splay tree for position. */ \ + Memento_BlkHeader *parent; \ + Memento_BlkHeader *left; \ + Memento_BlkHeader *right; \ + \ + /* Entries for nesting display calculations. Set \ + * to magic values at all other time. */ \ + Memento_BlkHeader *child; \ + Memento_BlkHeader *sibling; \ + \ + MEMENTO_DETAIL_FIELDS - /* Blocks are held in a linked list for LRU */ - Memento_BlkHeader *next; - Memento_BlkHeader *prev; /* Reused as 'parent' when printing nested list */ +typedef struct +{ + MEMENTO_BLKHEADER_FIELDS +} Memento_BlkHeader_unpadded; - /* Blocks are held in a splay tree for position. */ - Memento_BlkHeader *parent; - Memento_BlkHeader *left; - Memento_BlkHeader *right; +#define MEMENTO_BLKHEADER_UNPADDED_SIZE (sizeof(Memento_BlkHeader_unpadded)+Memento_PreSize) - /* Entries for nesting display calculations. Set to magic - * values at all other time. */ - Memento_BlkHeader *child; - Memento_BlkHeader *sibling; +struct Memento_BlkHeader +{ + MEMENTO_BLKHEADER_FIELDS -#ifdef MEMENTO_DETAILS - Memento_BlkDetails *details; - Memento_BlkDetails **details_tail; -#endif + /* Ensure that Memento_BlkHeader is a multiple of 32. This is required + * for setjmp/longjmp etc on many platforms. We want to ensure that + * we preserve the relative 32byte alignment to the underlying malloc. */ + char alignment_padding[32-(MEMENTO_BLKHEADER_UNPADDED_SIZE & 31)]; char preblk[Memento_PreSize]; }; |