summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/pool_func.hpp4
-rw-r--r--src/core/pool_type.hpp10
-rw-r--r--src/stdafx.h5
3 files changed, 17 insertions, 2 deletions
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