Using mempool improve cache locality and speed list manipulation like sort.
authorcedric <cedric>
Tue, 30 Sep 2008 16:48:28 +0000 (16:48 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Tue, 30 Sep 2008 16:48:28 +0000 (16:48 +0000)
git-svn-id: http://svn.enlightenment.org/svn/e/trunk/PROTO/eina@36363 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/eina_list.c

index 22e0f10..dc1ad8a 100644 (file)
@@ -66,6 +66,7 @@
 
 #include "eina_error.h"
 #include "eina_list.h"
+#include "eina_mempool.h"
 #include "eina_private.h"
 
 /*============================================================================*
@@ -128,14 +129,16 @@ struct _Eina_Accessor_List
 };
 
 static int _eina_list_init_count = 0;
+static Eina_Mempool *_eina_list_mp = NULL;
+static Eina_Mempool *_eina_list_accounting_mp = NULL;
 
 static inline Eina_List_Accounting*
 _eina_list_mempool_accounting_new(__UNUSED__ Eina_List *list)
 {
    Eina_List_Accounting *tmp;
 
-   tmp = malloc(sizeof (Eina_List_Accounting));
-   if (!tmp) eina_error_set(EINA_ERROR_OUT_OF_MEMORY);
+   tmp = eina_mempool_alloc(_eina_list_accounting_mp, sizeof (Eina_List_Accounting));
+   if (!tmp) return NULL;
 
    EINA_MAGIC_SET(tmp, EINA_MAGIC_LIST_ACCOUNTING);
 
@@ -146,7 +149,8 @@ _eina_list_mempool_accounting_free(Eina_List_Accounting *accounting)
 {
    EINA_MAGIC_CHECK_LIST_ACCOUNTING(accounting);
 
-   MAGIC_FREE(accounting);
+   EINA_MAGIC_SET(accounting, EINA_MAGIC_NONE);
+   eina_mempool_free(_eina_list_accounting_mp, accounting);
 }
 
 static inline Eina_List*
@@ -154,8 +158,8 @@ _eina_list_mempool_list_new(__UNUSED__ Eina_List *list)
 {
    Eina_List *tmp;
 
-   tmp = malloc(sizeof (Eina_List));
-   if (!tmp) eina_error_set(EINA_ERROR_OUT_OF_MEMORY);
+   tmp = eina_mempool_alloc(_eina_list_mp, sizeof (Eina_List));
+   if (!tmp) return NULL;
 
    EINA_MAGIC_SET(tmp, EINA_MAGIC_LIST);
 
@@ -170,7 +174,8 @@ _eina_list_mempool_list_free(Eina_List *list)
    if (list->accounting->count == 0)
      _eina_list_mempool_accounting_free(list->accounting);
 
-   MAGIC_FREE(list);
+   EINA_MAGIC_SET(list, EINA_MAGIC_NONE);
+   eina_mempool_free(_eina_list_mp, list);
 }
 
 static Eina_List *
@@ -404,6 +409,12 @@ eina_list_init(void)
      {
        eina_error_init();
        eina_magic_string_init();
+       eina_mempool_init();
+
+       _eina_list_mp = eina_mempool_new("chained_mempool", "list", NULL,
+                                       sizeof (Eina_List), 320);
+       _eina_list_accounting_mp = eina_mempool_new("chained_mempool", "list_accounting", NULL,
+                                                  sizeof (Eina_List_Accounting), 80);
 
        eina_magic_string_set(EINA_MAGIC_ITERATOR,
                             "Eina Iterator");
@@ -440,8 +451,12 @@ eina_list_shutdown(void)
 
    if (!_eina_list_init_count)
      {
-       eina_magic_string_shutdown();
-       eina_error_shutdown();
+       eina_mempool_delete(_eina_list_accounting_mp);
+       eina_mempool_delete(_eina_list_mp);
+
+       eina_mempool_shutdown();
+       eina_magic_string_shutdown();
+       eina_error_shutdown();
      }
 
    return _eina_list_init_count;