(svn r10747) -Codechange: add a variable that points to some index in the pool that is not beyond the first free pool item. It does not necessarily point to the first free item, but it reduces allocation time as it does not have to start at the first item in the pool to find the first free item.
authorrubidium
Thu, 02 Aug 2007 10:47:00 +0000
changeset 7378 7e7a9122b7b1
parent 7377 b6479e048c6e
child 7379 5afd3c499c4d
(svn r10747) -Codechange: add a variable that points to some index in the pool that is not beyond the first free pool item. It does not necessarily point to the first free item, but it reduces allocation time as it does not have to start at the first item in the pool to find the first free item.
src/oldpool.cpp
src/oldpool.h
--- a/src/oldpool.cpp	Thu Aug 02 08:47:56 2007 +0000
+++ b/src/oldpool.cpp	Thu Aug 02 10:47:00 2007 +0000
@@ -33,6 +33,7 @@
 	this->total_items = 0;
 	this->current_blocks = 0;
 	this->blocks = NULL;
+	this->first_free_index = 0;
 }
 
 /**
--- a/src/oldpool.h	Thu Aug 02 08:47:56 2007 +0000
+++ b/src/oldpool.h	Thu Aug 02 10:47:00 2007 +0000
@@ -42,6 +42,7 @@
 	uint total_items;           ///< How many items we now have in this pool
 
 public:
+	uint first_free_index;      ///< The index of the first free pool item in this pool
 	byte **blocks;              ///< An array of blocks (one block hold all the items)
 
 	/**
@@ -170,6 +171,7 @@
 	 */
 	virtual ~PoolItem()
 	{
+		if (this->index < Tpool->first_free_index) Tpool->first_free_index = this->index;
 	}
 
 	/**
@@ -259,8 +261,9 @@
 	 */
 	static T *AllocateRaw()
 	{
-		for (T *t = Tpool->Get(0); t != NULL; t = (t->index + 1U < Tpool->GetSize()) ? Tpool->Get(t->index + 1U) : NULL) {
+		for (T *t = Tpool->Get(Tpool->first_free_index); t != NULL; t = (t->index + 1U < Tpool->GetSize()) ? Tpool->Get(t->index + 1U) : NULL) {
 			if (!t->IsValid()) {
+				Tpool->first_free_index = t->index;
 				Tid index = t->index;
 
 				memset(t, 0, sizeof(T));