forked from enlightenment/efl
* eio: improve allocation code for eio_file_direct_ls.
SVN revision: 53262
This commit is contained in:
parent
197fa433cb
commit
cb8d2cf2f9
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue