parent
2bd686db2b
commit
bb76ca8100
|
@ -46,16 +46,10 @@
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
|
||||||
#include <pthread.h>
|
|
||||||
|
|
||||||
#include "eio_private.h"
|
#include "eio_private.h"
|
||||||
|
|
||||||
#include "Eio.h"
|
#include "Eio.h"
|
||||||
|
|
||||||
static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
|
|
||||||
static Eina_Trash *trash = NULL;
|
|
||||||
static int trash_count = 0;
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_eio_file_heavy(Ecore_Thread *thread, void *data)
|
_eio_file_heavy(Ecore_Thread *thread, void *data)
|
||||||
{
|
{
|
||||||
|
@ -127,10 +121,13 @@ _eio_file_direct_heavy(Ecore_Thread *thread, void *data)
|
||||||
{
|
{
|
||||||
Eina_File_Direct_Info *send;
|
Eina_File_Direct_Info *send;
|
||||||
|
|
||||||
send = malloc(sizeof (Eina_File_Direct_Info));
|
send = malloc(sizeof (Eina_File_Direct_Info) + sizeof (struct dirent));
|
||||||
if (!send) continue;
|
if (!send) continue;
|
||||||
|
|
||||||
memcpy(send, info, sizeof (Eina_File_Direct_Info));
|
memcpy(send, info, sizeof (Eina_File_Direct_Info));
|
||||||
|
send->dirent = (struct dirent*)(send + 1);
|
||||||
|
memcpy((void*) send->dirent, info->dirent, sizeof (struct dirent));
|
||||||
|
|
||||||
ecore_thread_feedback(thread, send);
|
ecore_thread_feedback(thread, send);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -194,12 +191,7 @@ _eio_file_send(Ecore_Thread *thread, Eio_File_Progress *op, off_t current, off_t
|
||||||
if (op->progress_cb == NULL)
|
if (op->progress_cb == NULL)
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
pthread_mutex_lock(&lock);
|
progress = eio_progress_malloc();
|
||||||
progress = eina_trash_pop(&trash);
|
|
||||||
if (progress) trash_count--;
|
|
||||||
pthread_mutex_unlock(&lock);
|
|
||||||
|
|
||||||
if (!progress) progress = malloc(sizeof (Eio_Progress));
|
|
||||||
if (!progress) return ;
|
if (!progress) return ;
|
||||||
|
|
||||||
progress->current = current;
|
progress->current = current;
|
||||||
|
@ -215,13 +207,8 @@ static void
|
||||||
_eio_file_progress(Eio_Progress *progress, Eio_File_Progress *op)
|
_eio_file_progress(Eio_Progress *progress, Eio_File_Progress *op)
|
||||||
{
|
{
|
||||||
op->progress_cb((void *) op->common.data, progress);
|
op->progress_cb((void *) op->common.data, progress);
|
||||||
eina_stringshare_del(progress->source);
|
|
||||||
eina_stringshare_del(progress->dest);
|
|
||||||
|
|
||||||
pthread_mutex_lock(&lock);
|
eio_progress_free(progress);
|
||||||
eina_trash_push(&trash, progress);
|
|
||||||
trash_count++;
|
|
||||||
pthread_mutex_unlock(&lock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef MAP_HUGETLB
|
#ifndef MAP_HUGETLB
|
||||||
|
@ -505,8 +492,13 @@ _eio_file_move_error(void *data)
|
||||||
_eio_file_move_copy_error,
|
_eio_file_move_copy_error,
|
||||||
move);
|
move);
|
||||||
|
|
||||||
if (eio_cp) move->copy = eio_cp;
|
if (eio_cp)
|
||||||
return ;
|
{
|
||||||
|
move->copy = eio_cp;
|
||||||
|
|
||||||
|
move->progress.common.thread = ((Eio_File_Progress*)move->copy)->common.thread;
|
||||||
|
return ;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
eio_file_error(&move->progress.common);
|
eio_file_error(&move->progress.common);
|
||||||
|
|
|
@ -1,13 +1,39 @@
|
||||||
|
/* EIO - EFL data type library
|
||||||
|
* Copyright (C) 2010 Enlightenment Developers:
|
||||||
|
* Cedric Bail <cedric.bail@free.fr>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library;
|
||||||
|
* if not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
#include "eio_private.h"
|
#include "eio_private.h"
|
||||||
|
|
||||||
#include "Eio.h"
|
#include "Eio.h"
|
||||||
|
|
||||||
static int _eio_count = 0;
|
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;
|
||||||
|
|
||||||
EAPI int
|
EAPI int
|
||||||
eio_init(void)
|
eio_init(void)
|
||||||
{
|
{
|
||||||
|
@ -24,11 +50,51 @@ eio_init(void)
|
||||||
EAPI int
|
EAPI int
|
||||||
eio_shutdown(void)
|
eio_shutdown(void)
|
||||||
{
|
{
|
||||||
|
Eio_Progress *progress;
|
||||||
|
|
||||||
_eio_count--;
|
_eio_count--;
|
||||||
|
|
||||||
if (_eio_count > 0) return _eio_count;
|
if (_eio_count > 0) return _eio_count;
|
||||||
|
|
||||||
|
/* Cleanup progress pool */
|
||||||
|
EINA_TRASH_CLEAN(&trash, progress)
|
||||||
|
free(progress);
|
||||||
|
trash_count = 0;
|
||||||
|
|
||||||
ecore_shutdown();
|
ecore_shutdown();
|
||||||
eina_shutdown();
|
eina_shutdown();
|
||||||
return _eio_count;
|
return _eio_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Eio_Progress *
|
||||||
|
eio_progress_malloc(void)
|
||||||
|
{
|
||||||
|
Eio_Progress *progress;
|
||||||
|
|
||||||
|
pthread_mutex_lock(&lock);
|
||||||
|
progress = eina_trash_pop(&trash);
|
||||||
|
if (progress) trash_count--;
|
||||||
|
pthread_mutex_unlock(&lock);
|
||||||
|
|
||||||
|
if (!progress) progress = malloc(sizeof (Eio_Progress));
|
||||||
|
return progress;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
eio_progress_free(Eio_Progress *progress)
|
||||||
|
{
|
||||||
|
eina_stringshare_del(progress->source);
|
||||||
|
eina_stringshare_del(progress->dest);
|
||||||
|
|
||||||
|
if (trash_count >= EIO_PROGRESS_LIMIT)
|
||||||
|
{
|
||||||
|
free(progress);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&lock);
|
||||||
|
eina_trash_push(&trash, progress);
|
||||||
|
trash_count++;
|
||||||
|
pthread_mutex_unlock(&lock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -9,6 +9,9 @@
|
||||||
|
|
||||||
#include "Eio.h"
|
#include "Eio.h"
|
||||||
|
|
||||||
|
/* Keeping 32 Eio_File_Progress alive should be enought */
|
||||||
|
#define EIO_PROGRESS_LIMIT 32
|
||||||
|
|
||||||
/* Huge TLB == 16M on most system */
|
/* Huge TLB == 16M on most system */
|
||||||
#define EIO_PACKET_SIZE 65536
|
#define EIO_PACKET_SIZE 65536
|
||||||
#define EIO_PACKET_COUNT 256
|
#define EIO_PACKET_COUNT 256
|
||||||
|
@ -22,6 +25,8 @@ typedef struct _Eio_File_Stat Eio_File_Stat;
|
||||||
typedef struct _Eio_File_Progress Eio_File_Progress;
|
typedef struct _Eio_File_Progress Eio_File_Progress;
|
||||||
typedef struct _Eio_File_Move Eio_File_Move;
|
typedef struct _Eio_File_Move Eio_File_Move;
|
||||||
|
|
||||||
|
typedef struct _Eio_Dir_Copy Eio_Dir_Copy;
|
||||||
|
|
||||||
struct _Eio_File
|
struct _Eio_File
|
||||||
{
|
{
|
||||||
Ecore_Thread *thread;
|
Ecore_Thread *thread;
|
||||||
|
@ -97,6 +102,14 @@ struct _Eio_File_Move
|
||||||
Eio_File *copy;
|
Eio_File *copy;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct _Eio_Dir_Copy
|
||||||
|
{
|
||||||
|
Eio_File_Progress progress;
|
||||||
|
|
||||||
|
Eina_List *files;
|
||||||
|
Eina_List *dirs;
|
||||||
|
};
|
||||||
|
|
||||||
/* Be aware that ecore_thread_run could call cancel_cb if something goes wrong. */
|
/* Be aware that ecore_thread_run could call cancel_cb if something goes wrong. */
|
||||||
Eina_Bool eio_file_set(Eio_File *common,
|
Eina_Bool eio_file_set(Eio_File *common,
|
||||||
Eio_Done_Cb done_cb,
|
Eio_Done_Cb done_cb,
|
||||||
|
@ -119,4 +132,7 @@ Eina_Bool eio_long_file_set(Eio_File *common,
|
||||||
void eio_file_error(Eio_File *common);
|
void eio_file_error(Eio_File *common);
|
||||||
void eio_file_thread_error(Eio_File *common);
|
void eio_file_thread_error(Eio_File *common);
|
||||||
|
|
||||||
|
Eio_Progress *eio_progress_malloc(void);
|
||||||
|
void eio_progress_free(Eio_Progress *progress);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue