diff options
author | Robin Watts <Robin.Watts@artifex.com> | 2023-04-05 16:26:32 +0100 |
---|---|---|
committer | Robin Watts <Robin.Watts@artifex.com> | 2023-04-05 18:00:49 +0100 |
commit | faf9c9b57b9d8a8e3f24fc83eb65ab740c2c0702 (patch) | |
tree | 8f670e4f80b49205ead8ee8ff5c0605a3c5ee2f9 | |
parent | 81eedb262e019faf2819cff89b23bc57fe776c21 (diff) | |
download | ghostpdl-faf9c9b57b9d8a8e3f24fc83eb65ab740c2c0702.tar.gz |
Memento: Ensure that Memento_BlkHeader is a multiple of 32 bytes.
This is so that Memento wrapped blocks get the same alignment % 32
as the underlying malloc blocks. This is important for setjmp
buffer usage on Windows (at least, probably linux too).
-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]; }; |