changeset 12009:5ac019d48a1b draft

(svn r16415) -Fix (r13008): some 64bit architectures require size_t to be aligned at 8-byte boundary, ensure it for MemBlock
author smatz <smatz@openttd.org>
date Sun, 24 May 2009 16:28:33 +0000
parents 066420f32d18
children d0bf08a7c260
files src/spritecache.cpp
diffstat 1 files changed, 14 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/spritecache.cpp
+++ b/src/spritecache.cpp
@@ -306,8 +306,18 @@
 	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 @@
 {
 	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;