From fbfb0ffbf24b7ea2630b4b3caee63d09964da75b Mon Sep 17 00:00:00 2001 From: smatz Date: Wed, 9 Feb 2011 18:55:51 +0000 Subject: (svn r22041) -Codechange: add a check that we called PoolItem::CanAllocateItem() before actually allocating it --- src/core/pool_func.hpp | 4 ++++ src/core/pool_type.hpp | 10 ++++++++-- src/stdafx.h | 5 +++++ 3 files changed, 17 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/core/pool_func.hpp b/src/core/pool_func.hpp index 2f87d3de2..299aee86c 100644 --- a/src/core/pool_func.hpp +++ b/src/core/pool_func.hpp @@ -123,6 +123,10 @@ DEFINE_POOL_METHOD(void *)::GetNew(size_t size) { size_t index = this->FindFirstFree(); +#ifdef OTTD_ASSERT + assert(this->checked != 0); + this->checked--; +#endif /* OTTD_ASSERT */ if (index == NO_FREE_ITEM) { error("%s: no more free items", this->name); } diff --git a/src/core/pool_type.hpp b/src/core/pool_type.hpp index 49876976f..395aa8438 100644 --- a/src/core/pool_type.hpp +++ b/src/core/pool_type.hpp @@ -32,7 +32,9 @@ struct Pool { size_t first_free; ///< No item with index lower than this is free (doesn't say anything about this one!) size_t first_unused; ///< This and all higher indexes are free (doesn't say anything about first_unused-1 !) size_t items; ///< Number of used indexes (non-NULL) - +#ifdef OTTD_ASSERT + size_t checked; ///< Number of items we checked for +#endif /* OTTD_ASSERT */ bool cleaning; ///< True if cleaning pool (deleting all items) Titem **data; ///< Pointer to array of pointers to Titem @@ -69,7 +71,11 @@ struct Pool { */ FORCEINLINE bool CanAllocate(size_t n = 1) { - return this->items <= Tmax_size - n; + bool ret = this->items <= Tmax_size - n; +#ifdef OTTD_ASSERT + this->checked = ret ? n : 0; +#endif /* OTTD_ASSERT */ + return ret; } /** diff --git a/src/stdafx.h b/src/stdafx.h index 0c7507ff8..b226e44f4 100644 --- a/src/stdafx.h +++ b/src/stdafx.h @@ -409,6 +409,11 @@ void NORETURN CDECL error(const char *str, ...) WARN_FORMAT(1, 2); #define assert(expression) if (!(expression)) error("Assertion failed at line %i of %s: %s", __LINE__, __FILE__, #expression); #endif +/* Asserts are enabled if NDEBUG isn't defined, or if we are using MSVC and WITH_ASSERT is defined. */ +#if !defined(NDEBUG) || (defined(_MSC_VER) && defined(WITH_ASSERT)) + #define OTTD_ASSERT +#endif + #if defined(MORPHOS) || defined(__NDS__) || defined(__DJGPP__) /* MorphOS and NDS don't have C++ conformant _stricmp... */ #define _stricmp stricmp -- cgit v1.2.3-54-g00ecf