mirror of
https://github.com/JGRennison/OpenTTD-patches.git
synced 2024-10-31 15:20:10 +00:00
(svn r16415) -Fix (r13008): some 64bit architectures require size_t to be aligned at 8-byte boundary, ensure it for MemBlock
This commit is contained in:
parent
6e06e82bc4
commit
b86ab81030
@ -306,8 +306,18 @@ void DupSprite(SpriteID old_spr, SpriteID new_spr)
|
||||
scnew->warned = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* S_FREE_MASK is used to mask-out lower bits of MemBlock::size
|
||||
* If they are non-zero, the block is free.
|
||||
* S_FREE_MASK has to ensure MemBlock is correctly aligned -
|
||||
* it means 8B (S_FREE_MASK == 7) on 64bit systems!
|
||||
*/
|
||||
static const size_t S_FREE_MASK = sizeof(size_t) - 1;
|
||||
|
||||
#define S_FREE_MASK 1
|
||||
/* to make sure nobody adds things to MemBlock without checking S_FREE_MASK first */
|
||||
assert_compile(sizeof(MemBlock) == sizeof(size_t));
|
||||
/* make sure it's a power of two */
|
||||
assert_compile((sizeof(size_t) & (sizeof(size_t) - 1)) == 0);
|
||||
|
||||
static inline MemBlock *NextBlock(MemBlock *block)
|
||||
{
|
||||
@ -439,9 +449,9 @@ void *AllocSprite(size_t mem_req)
|
||||
{
|
||||
mem_req += sizeof(MemBlock);
|
||||
|
||||
/* Align this to an uint32 boundary. This also makes sure that the 2 least
|
||||
* bits are not used, so we could use those for other things. */
|
||||
mem_req = Align(mem_req, sizeof(uint32));
|
||||
/* Align this to correct boundary. This also makes sure at least one
|
||||
* bit is not used, so we can use it for other things. */
|
||||
mem_req = Align(mem_req, S_FREE_MASK + 1);
|
||||
|
||||
for (;;) {
|
||||
MemBlock *s;
|
||||
|
Loading…
Reference in New Issue
Block a user