[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42194] trunk/blender/source/blender/ blenlib: BLI_mempool_findelem() only worked when no elements were freed, use the iterator for now.

Campbell Barton ideasman42 at gmail.com
Sun Nov 27 22:11:26 CET 2011


Revision: 42194
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42194
Author:   campbellbarton
Date:     2011-11-27 21:11:17 +0000 (Sun, 27 Nov 2011)
Log Message:
-----------
BLI_mempool_findelem() only worked when no elements were freed, use the iterator for now.

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_mempool.h
    trunk/blender/source/blender/blenlib/intern/BLI_mempool.c

Modified: trunk/blender/source/blender/blenlib/BLI_mempool.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_mempool.h	2011-11-27 19:35:46 UTC (rev 42193)
+++ trunk/blender/source/blender/blenlib/BLI_mempool.h	2011-11-27 21:11:17 UTC (rev 42194)
@@ -55,7 +55,7 @@
 void BLI_mempool_free(BLI_mempool *pool, void *addr);
 void BLI_mempool_destroy(BLI_mempool *pool);
 int BLI_mempool_count(BLI_mempool *pool);
-void *BLI_mempool_findelem(BLI_mempool *pool, const int index);
+void *BLI_mempool_findelem(BLI_mempool *pool, int index);
 
 /** iteration stuff.  note: this may easy to produce bugs with **/
 /*private structure*/

Modified: trunk/blender/source/blender/blenlib/intern/BLI_mempool.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/BLI_mempool.c	2011-11-27 19:35:46 UTC (rev 42193)
+++ trunk/blender/source/blender/blenlib/intern/BLI_mempool.c	2011-11-27 21:11:17 UTC (rev 42194)
@@ -241,19 +241,20 @@
 	}
 }
 
-void *BLI_mempool_findelem(BLI_mempool *pool, const int index)
+void *BLI_mempool_findelem(BLI_mempool *pool, int index)
 {
-	if ((index >= 0) && (index < pool->totused)) {
-		BLI_mempool_chunk *mpchunk;
-		int i= 0;
-
-		for (mpchunk = pool->chunks.first; mpchunk; mpchunk = mpchunk->next) {
-			if (index < i + pool->pchunk) {
-				return ((char *)mpchunk->data) + (pool->esize * (index - i));
-			}
-			i += pool->pchunk;
-		}
+	if (!pool->allow_iter) {
+		fprintf(stderr, "%s: Error! you can't iterate over this mempool!\n", __func__);
+		return NULL;
 	}
+	else if ((index >= 0) && (index < pool->totused)) {
+		/* we could have some faster mem chunk stepping code inline */
+		BLI_mempool_iter iter;
+		void *elem;
+		BLI_mempool_iternew(pool, &iter);
+		for (elem= BLI_mempool_iterstep(&iter); index-- != 0; elem= BLI_mempool_iterstep(&iter)) { };
+		return elem;
+	}
 
 	return NULL;
 }




More information about the Bf-blender-cvs mailing list