* eio: improve allocation code for eio_file_direct_ls.

SVN revision: 53262
This commit is contained in:
Cedric BAIL 2010-10-11 12:40:20 +00:00
parent 197fa433cb
commit cb8d2cf2f9
3 changed files with 76 additions and 30 deletions

View File

@ -120,7 +120,7 @@ _eio_file_direct_heavy(Ecore_Thread *thread, void *data)
{
Eina_File_Direct_Info *send;
send = malloc(sizeof (Eina_File_Direct_Info) + sizeof (struct dirent));
send = eio_direct_info_malloc();
if (!send) continue;
memcpy(send, info, sizeof (Eina_File_Direct_Info));
@ -145,7 +145,7 @@ _eio_file_direct_notify(Ecore_Thread *thread __UNUSED__, void *msg_data, void *d
async->main_cb((void*) async->ls.common.data, info);
free(info);
eio_direct_info_free(info);
}
static void

View File

@ -22,6 +22,7 @@
#endif
#include <pthread.h>
#include <dirent.h>
#include "eio_private.h"
@ -30,9 +31,18 @@
static int _eio_count = 0;
/* Progress pool */
static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
static Eina_Trash *trash = NULL;
static int trash_count = 0;
typedef struct _Eio_Alloc_Pool Eio_Alloc_Pool;
struct _Eio_Alloc_Pool
{
int count;
Eina_Trash *trash;
pthread_mutex_t lock;
};
static Eio_Alloc_Pool progress = { 0, NULL, PTHREAD_MUTEX_INITIALIZER };
static Eio_Alloc_Pool direct_info = { 0, NULL, PTHREAD_MUTEX_INITIALIZER };
EAPI int
eio_init(void)
@ -50,55 +60,75 @@ eio_init(void)
EAPI int
eio_shutdown(void)
{
Eio_Progress *progress;
Eina_File_Direct_Info *info;
Eio_Progress *pg;
_eio_count--;
if (_eio_count > 0) return _eio_count;
/* Cleanup progress pool */
EINA_TRASH_CLEAN(&trash, progress)
free(progress);
trash_count = 0;
/* Cleanup pool */
EINA_TRASH_CLEAN(&progress.trash, pg)
free(pg);
progress.count = 0;
EINA_TRASH_CLEAN(&direct_info.trash, info)
free(info);
direct_info.count = 0;
ecore_shutdown();
eina_shutdown();
return _eio_count;
}
Eio_Progress *
eio_progress_malloc(void)
static void *
_eio_pool_malloc(Eio_Alloc_Pool *pool, size_t sz)
{
Eio_Progress *progress;
void *result = NULL;
pthread_mutex_lock(&lock);
progress = eina_trash_pop(&trash);
if (progress) trash_count--;
pthread_mutex_unlock(&lock);
if (pool->count)
{
pthread_mutex_lock(&pool->lock);
result = eina_trash_pop(&pool->trash);
if (result) pool->count--;
pthread_mutex_unlock(&pool->lock);
}
if (!progress) progress = malloc(sizeof (Eio_Progress));
return progress;
if (!result) result = malloc(sz);
return result;
}
void
eio_progress_free(Eio_Progress *progress)
static void
_eio_pool_free(Eio_Alloc_Pool *pool, void *data)
{
eina_stringshare_del(progress->source);
eina_stringshare_del(progress->dest);
if (trash_count >= EIO_PROGRESS_LIMIT)
if (pool->count >= EIO_PROGRESS_LIMIT)
{
free(progress);
free(data);
}
else
{
pthread_mutex_lock(&lock);
eina_trash_push(&trash, progress);
trash_count++;
pthread_mutex_unlock(&lock);
pthread_mutex_lock(&pool->lock);
eina_trash_push(&pool->trash, data);
pool->count++;
pthread_mutex_unlock(&pool->lock);
}
}
Eio_Progress *
eio_progress_malloc(void)
{
return _eio_pool_malloc(&progress, sizeof (Eio_Progress));
}
void
eio_progress_free(Eio_Progress *data)
{
eina_stringshare_del(data->source);
eina_stringshare_del(data->dest);
_eio_pool_free(&progress, data);
}
void
eio_progress_send(Ecore_Thread *thread, Eio_File_Progress *op, off_t current, off_t max)
{
@ -120,3 +150,15 @@ eio_progress_send(Ecore_Thread *thread, Eio_File_Progress *op, off_t current, of
ecore_thread_feedback(thread, progress);
}
Eina_File_Direct_Info *
eio_direct_info_malloc(void)
{
return _eio_pool_malloc(&direct_info, sizeof (Eina_File_Direct_Info) + sizeof (struct dirent));
}
void
eio_direct_info_free(Eina_File_Direct_Info *data)
{
_eio_pool_free(&direct_info, data);
}

View File

@ -134,8 +134,12 @@ Eina_Bool eio_long_file_set(Eio_File *common,
void eio_file_error(Eio_File *common);
void eio_file_thread_error(Eio_File *common);
Eina_File_Direct_Info *eio_direct_info_malloc(void);
void eio_direct_info_free(Eina_File_Direct_Info *data);
Eio_Progress *eio_progress_malloc(void);
void eio_progress_free(Eio_Progress *progress);
void eio_progress_send(Ecore_Thread *thread, Eio_File_Progress *op,
off_t current, off_t max);
void eio_progress_cb(Eio_Progress *progress, Eio_File_Progress *op);