# HG changeset patch # User smatz # Date 2011-02-09 18:55:51 # Node ID 768e62fab51cdfae47ef8ab631b9e133300d9274 # Parent e67ef8f3768611940ec8f5cf3571f3bb4ad817b8 (svn r22041) -Codechange: add a check that we called PoolItem::CanAllocateItem() before actually allocating it diff --git a/src/core/pool_func.hpp b/src/core/pool_func.hpp --- a/src/core/pool_func.hpp +++ b/src/core/pool_func.hpp @@ -123,6 +123,10 @@ DEFINE_POOL_METHOD(void *)::GetNew(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 --- 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 --- a/src/stdafx.h +++ b/src/stdafx.h @@ -409,6 +409,11 @@ void NORETURN CDECL error(const char *st #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