* eina_rectangle: Add a local cache to rectangle creation.

SVN revision: 41856
This commit is contained in:
Cedric BAIL 2009-08-18 13:35:33 +00:00
parent dfac5a2a59
commit 0b7407905c
1 changed files with 66 additions and 6 deletions

View File

@ -31,6 +31,7 @@
#include "eina_safety_checks.h"
#include "eina_mempool.h"
#include "eina_list.h"
#include "eina_trash.h"
/*============================================================================*
* Local *
@ -43,6 +44,8 @@
#define EINA_RECTANGLE_POOL_MAGIC 0x1578FCB0
#define EINA_RECTANGLE_ALLOC_MAGIC 0x1578FCB1
#define BUCKET_THRESHOLD 110
typedef struct _Eina_Rectangle_Alloc Eina_Rectangle_Alloc;
struct _Eina_Rectangle_Pool
@ -51,6 +54,9 @@ struct _Eina_Rectangle_Pool
Eina_List *empty;
void *data;
Eina_Trash *bucket;
unsigned int bucket_count;
unsigned int references;
int w;
int h;
@ -82,6 +88,9 @@ static int _eina_rectangle_init_count = 0;
static Eina_Mempool *_eina_rectangle_alloc_mp = NULL;
static Eina_Mempool *_eina_rectangle_mp = NULL;
static Eina_Trash *_eina_rectangles = NULL;
static unsigned int _eina_rectangles_count = 0;
static int
_eina_rectangle_cmp(const Eina_Rectangle *r1, const Eina_Rectangle *r2)
{
@ -285,12 +294,18 @@ eina_rectangle_init(void)
EAPI int
eina_rectangle_shutdown(void)
{
Eina_Rectangle *del;
--_eina_rectangle_init_count;
if (_eina_rectangle_init_count) return _eina_rectangle_init_count;
eina_list_shutdown();
while (del = eina_trash_pop(&_eina_rectangles))
eina_mempool_free(_eina_rectangle_mp, del);
_eina_rectangles_count = 0;
eina_mempool_del(_eina_rectangle_alloc_mp);
eina_mempool_del(_eina_rectangle_mp);
@ -305,7 +320,15 @@ eina_rectangle_new(int x, int y, int w, int h)
{
Eina_Rectangle *rect;
rect = eina_mempool_malloc(_eina_rectangle_mp, sizeof (Eina_Rectangle));
if (_eina_rectangles)
{
rect = eina_trash_pop(&_eina_rectangles);
_eina_rectangles_count--;
}
else
{
rect = eina_mempool_malloc(_eina_rectangle_mp, sizeof (Eina_Rectangle));
}
if (!rect) return NULL;
EINA_RECTANGLE_SET(rect, x, y, w, h);
@ -317,7 +340,16 @@ EAPI void
eina_rectangle_free(Eina_Rectangle *rect)
{
EINA_SAFETY_ON_NULL_RETURN(rect);
eina_mempool_free(_eina_rectangle_mp, rect);
if (_eina_rectangles_count > BUCKET_THRESHOLD)
{
eina_mempool_free(_eina_rectangle_mp, rect);
}
else
{
eina_trash_push(&_eina_rectangles, rect);
_eina_rectangles_count++;
}
}
EAPI Eina_Rectangle_Pool *
@ -334,6 +366,8 @@ eina_rectangle_pool_new(int w, int h)
new->sorted = EINA_FALSE;
new->w = w;
new->h = h;
new->bucket = NULL;
new->bucket_count = 0;
EINA_MAGIC_SET(new, EINA_RECTANGLE_POOL_MAGIC);
@ -356,6 +390,12 @@ eina_rectangle_pool_free(Eina_Rectangle_Pool *pool)
eina_mempool_free(_eina_rectangle_alloc_mp, del);
}
while (pool->bucket)
{
del = eina_trash_pop(&pool->bucket);
eina_mempool_free(_eina_rectangle_alloc_mp, del);
}
MAGIC_FREE(pool);
}
@ -390,8 +430,16 @@ eina_rectangle_pool_request(Eina_Rectangle_Pool *pool, int w, int h)
if (x == -1) return NULL;
pool->sorted = EINA_FALSE;
new = eina_mempool_malloc(_eina_rectangle_alloc_mp,
sizeof (Eina_Rectangle_Alloc) + sizeof (Eina_Rectangle));
if (pool->bucket_count > 0)
{
new = eina_trash_pop(&pool->bucket);
pool->bucket_count--;
}
else
{
new = eina_mempool_malloc(_eina_rectangle_alloc_mp,
sizeof (Eina_Rectangle_Alloc) + sizeof (Eina_Rectangle));
}
if (!new) return NULL;
rect = (Eina_Rectangle*) (new + 1);
@ -428,8 +476,20 @@ eina_rectangle_pool_release(Eina_Rectangle *rect)
era->pool->sorted = EINA_FALSE;
}
EINA_MAGIC_SET(era, EINA_MAGIC_NONE);
eina_mempool_free(_eina_rectangle_alloc_mp, era);
if (era->pool->bucket_count < BUCKET_THRESHOLD)
{
Eina_Rectangle_Pool *pool;
pool = era->pool;
pool->bucket_count++;
eina_trash_push(&pool->bucket, era);
}
else
{
EINA_MAGIC_SET(era, EINA_MAGIC_NONE);
eina_mempool_free(_eina_rectangle_alloc_mp, era);
}
}
EAPI Eina_Rectangle_Pool *