forked from enlightenment/efl
[eio] reorganize code like eina, clean up doc
SVN revision: 53688
This commit is contained in:
parent
6b588fbef6
commit
3a5d43ea9c
|
@ -73,7 +73,17 @@ extern "C" {
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef enum _Eio_File_Op
|
/**
|
||||||
|
* @typedef Eio_File_Op
|
||||||
|
* Input/Output operations on files.
|
||||||
|
*/
|
||||||
|
typedef enum _Eio_File_Op Eio_File_Op;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @enum _Eio_File_Op
|
||||||
|
* Input/Output operations on files.
|
||||||
|
*/
|
||||||
|
enum _Eio_File_Op
|
||||||
{
|
{
|
||||||
EIO_FILE_COPY, /**< IO operation is about a specific file copy */
|
EIO_FILE_COPY, /**< IO operation is about a specific file copy */
|
||||||
EIO_FILE_MOVE, /**< IO operation is about a specific file move */
|
EIO_FILE_MOVE, /**< IO operation is about a specific file move */
|
||||||
|
@ -82,10 +92,19 @@ typedef enum _Eio_File_Op
|
||||||
EIO_UNLINK, /**< IO operation is about a destroying a path (source will point to base path to be destroyed and dest to path destroyed by this IO */
|
EIO_UNLINK, /**< IO operation is about a destroying a path (source will point to base path to be destroyed and dest to path destroyed by this IO */
|
||||||
EIO_FILE_GETPWNAM, /**< IO operation is trying to get uid from user name */
|
EIO_FILE_GETPWNAM, /**< IO operation is trying to get uid from user name */
|
||||||
EIO_FILE_GETGRNAM /**< IO operation is trying to get gid from user name */
|
EIO_FILE_GETGRNAM /**< IO operation is trying to get gid from user name */
|
||||||
} Eio_File_Op;
|
};
|
||||||
|
|
||||||
typedef struct _Eio_File Eio_File; /**< Generic asynchronous IO reference */
|
/**
|
||||||
typedef struct _Eio_Progress Eio_Progress; /**< Progress information on a specific operation */
|
* @typedef Eio_File
|
||||||
|
*Generic asynchronous IO reference.
|
||||||
|
*/
|
||||||
|
typedef struct _Eio_File Eio_File;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef Eio_Progress
|
||||||
|
* Progress information on a specific operation.
|
||||||
|
*/
|
||||||
|
typedef struct _Eio_Progress Eio_Progress;
|
||||||
|
|
||||||
typedef Eina_Bool (*Eio_Filter_Cb)(void *data, const char *file);
|
typedef Eina_Bool (*Eio_Filter_Cb)(void *data, const char *file);
|
||||||
typedef void (*Eio_Main_Cb)(void *data, const char *file);
|
typedef void (*Eio_Main_Cb)(void *data, const char *file);
|
||||||
|
|
|
@ -19,6 +19,14 @@
|
||||||
#include "eio_private.h"
|
#include "eio_private.h"
|
||||||
#include "Eio.h"
|
#include "Eio.h"
|
||||||
|
|
||||||
|
/*============================================================================*
|
||||||
|
* Local *
|
||||||
|
*============================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @cond LOCAL
|
||||||
|
*/
|
||||||
|
|
||||||
static int
|
static int
|
||||||
eio_strcmp(const void *a, const void *b)
|
eio_strcmp(const void *a, const void *b)
|
||||||
{
|
{
|
||||||
|
@ -537,6 +545,20 @@ _eio_dir_rmrf_heavy(Ecore_Thread *thread, void *data)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @endcond
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*============================================================================*
|
||||||
|
* Global *
|
||||||
|
*============================================================================*/
|
||||||
|
|
||||||
|
|
||||||
|
/*============================================================================*
|
||||||
|
* API *
|
||||||
|
*============================================================================*/
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @addtogroup Eio_Group Asynchronous Inout/Output library
|
* @addtogroup Eio_Group Asynchronous Inout/Output library
|
||||||
*
|
*
|
||||||
|
|
|
@ -21,6 +21,14 @@
|
||||||
#include "eio_private.h"
|
#include "eio_private.h"
|
||||||
#include "Eio.h"
|
#include "Eio.h"
|
||||||
|
|
||||||
|
/*============================================================================*
|
||||||
|
* Local *
|
||||||
|
*============================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @cond LOCAL
|
||||||
|
*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_eio_file_heavy(Ecore_Thread *thread, void *data)
|
_eio_file_heavy(Ecore_Thread *thread, void *data)
|
||||||
{
|
{
|
||||||
|
@ -154,14 +162,6 @@ _eio_file_write(int fd, void *mem, ssize_t length)
|
||||||
return EINA_TRUE;
|
return EINA_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
eio_progress_cb(Eio_Progress *progress, Eio_File_Progress *op)
|
|
||||||
{
|
|
||||||
op->progress_cb((void *) op->common.data, progress);
|
|
||||||
|
|
||||||
eio_progress_free(progress);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef MAP_HUGETLB
|
#ifndef MAP_HUGETLB
|
||||||
# define MAP_HUGETLB 0
|
# define MAP_HUGETLB 0
|
||||||
#endif
|
#endif
|
||||||
|
@ -254,63 +254,6 @@ _eio_file_copy_splice(Ecore_Thread *thread, Eio_File_Progress *op, int in, int o
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Eina_Bool
|
|
||||||
eio_file_copy_do(Ecore_Thread *thread, Eio_File_Progress *copy)
|
|
||||||
{
|
|
||||||
struct stat buf;
|
|
||||||
int result = -1;
|
|
||||||
int in = -1;
|
|
||||||
int out = -1;
|
|
||||||
|
|
||||||
in = open(copy->source, O_RDONLY);
|
|
||||||
if (in < 0)
|
|
||||||
{
|
|
||||||
eio_file_thread_error(©->common, thread);
|
|
||||||
return EINA_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
As we need file size for progression information and both copy method
|
|
||||||
call fstat (better than stat as it avoid race condition).
|
|
||||||
*/
|
|
||||||
if (fstat(in, &buf) < 0)
|
|
||||||
goto on_error;
|
|
||||||
|
|
||||||
/* open write */
|
|
||||||
out = open(copy->dest, O_WRONLY | O_CREAT | O_TRUNC, buf.st_mode);
|
|
||||||
if (out < 0)
|
|
||||||
goto on_error;
|
|
||||||
|
|
||||||
#ifdef EFL_HAVE_SPLICE
|
|
||||||
/* fast file copy code using Linux splice API */
|
|
||||||
result = _eio_file_copy_splice(thread, copy, in, out, buf.st_size);
|
|
||||||
if (result == 0)
|
|
||||||
goto on_error;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* classic copy method using mmap and write */
|
|
||||||
if (result == -1 && !_eio_file_copy_mmap(thread, copy, in, out, buf.st_size))
|
|
||||||
goto on_error;
|
|
||||||
|
|
||||||
/* change access right to match source */
|
|
||||||
if (fchmod(out, buf.st_mode) != 0)
|
|
||||||
goto on_error;
|
|
||||||
|
|
||||||
close(out);
|
|
||||||
close(in);
|
|
||||||
|
|
||||||
return EINA_TRUE;
|
|
||||||
|
|
||||||
on_error:
|
|
||||||
eio_file_thread_error(©->common, thread);
|
|
||||||
|
|
||||||
if (in >= 0) close(in);
|
|
||||||
if (out >= 0) close(out);
|
|
||||||
if (out >= 0)
|
|
||||||
unlink(copy->dest);
|
|
||||||
return EINA_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_eio_file_copy_heavy(Ecore_Thread *thread, void *data)
|
_eio_file_copy_heavy(Ecore_Thread *thread, void *data)
|
||||||
{
|
{
|
||||||
|
@ -482,6 +425,92 @@ _eio_file_move_error(void *data)
|
||||||
_eio_file_move_free(move);
|
_eio_file_move_free(move);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @endcond
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*============================================================================*
|
||||||
|
* Global *
|
||||||
|
*============================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @cond LOCAL
|
||||||
|
*/
|
||||||
|
|
||||||
|
void
|
||||||
|
eio_progress_cb(Eio_Progress *progress, Eio_File_Progress *op)
|
||||||
|
{
|
||||||
|
op->progress_cb((void *) op->common.data, progress);
|
||||||
|
|
||||||
|
eio_progress_free(progress);
|
||||||
|
}
|
||||||
|
|
||||||
|
Eina_Bool
|
||||||
|
eio_file_copy_do(Ecore_Thread *thread, Eio_File_Progress *copy)
|
||||||
|
{
|
||||||
|
struct stat buf;
|
||||||
|
int result = -1;
|
||||||
|
int in = -1;
|
||||||
|
int out = -1;
|
||||||
|
|
||||||
|
in = open(copy->source, O_RDONLY);
|
||||||
|
if (in < 0)
|
||||||
|
{
|
||||||
|
eio_file_thread_error(©->common, thread);
|
||||||
|
return EINA_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
As we need file size for progression information and both copy method
|
||||||
|
call fstat (better than stat as it avoid race condition).
|
||||||
|
*/
|
||||||
|
if (fstat(in, &buf) < 0)
|
||||||
|
goto on_error;
|
||||||
|
|
||||||
|
/* open write */
|
||||||
|
out = open(copy->dest, O_WRONLY | O_CREAT | O_TRUNC, buf.st_mode);
|
||||||
|
if (out < 0)
|
||||||
|
goto on_error;
|
||||||
|
|
||||||
|
#ifdef EFL_HAVE_SPLICE
|
||||||
|
/* fast file copy code using Linux splice API */
|
||||||
|
result = _eio_file_copy_splice(thread, copy, in, out, buf.st_size);
|
||||||
|
if (result == 0)
|
||||||
|
goto on_error;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* classic copy method using mmap and write */
|
||||||
|
if (result == -1 && !_eio_file_copy_mmap(thread, copy, in, out, buf.st_size))
|
||||||
|
goto on_error;
|
||||||
|
|
||||||
|
/* change access right to match source */
|
||||||
|
if (fchmod(out, buf.st_mode) != 0)
|
||||||
|
goto on_error;
|
||||||
|
|
||||||
|
close(out);
|
||||||
|
close(in);
|
||||||
|
|
||||||
|
return EINA_TRUE;
|
||||||
|
|
||||||
|
on_error:
|
||||||
|
eio_file_thread_error(©->common, thread);
|
||||||
|
|
||||||
|
if (in >= 0) close(in);
|
||||||
|
if (out >= 0) close(out);
|
||||||
|
if (out >= 0)
|
||||||
|
unlink(copy->dest);
|
||||||
|
return EINA_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @endcond
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*============================================================================*
|
||||||
|
* API *
|
||||||
|
*============================================================================*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @addtogroup Eio_Group Asynchronous Inout/Output library
|
* @addtogroup Eio_Group Asynchronous Inout/Output library
|
||||||
|
|
|
@ -19,7 +19,13 @@
|
||||||
#include "eio_private.h"
|
#include "eio_private.h"
|
||||||
#include "Eio.h"
|
#include "Eio.h"
|
||||||
|
|
||||||
static int _eio_count = 0;
|
/*============================================================================*
|
||||||
|
* Local *
|
||||||
|
*============================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @cond LOCAL
|
||||||
|
*/
|
||||||
|
|
||||||
/* Progress pool */
|
/* Progress pool */
|
||||||
typedef struct _Eio_Alloc_Pool Eio_Alloc_Pool;
|
typedef struct _Eio_Alloc_Pool Eio_Alloc_Pool;
|
||||||
|
@ -32,9 +38,112 @@ struct _Eio_Alloc_Pool
|
||||||
pthread_mutex_t lock;
|
pthread_mutex_t lock;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int _eio_count = 0;
|
||||||
|
|
||||||
static Eio_Alloc_Pool progress = { 0, NULL, PTHREAD_MUTEX_INITIALIZER };
|
static Eio_Alloc_Pool progress = { 0, NULL, PTHREAD_MUTEX_INITIALIZER };
|
||||||
static Eio_Alloc_Pool direct_info = { 0, NULL, PTHREAD_MUTEX_INITIALIZER };
|
static Eio_Alloc_Pool direct_info = { 0, NULL, PTHREAD_MUTEX_INITIALIZER };
|
||||||
|
|
||||||
|
static void *
|
||||||
|
_eio_pool_malloc(Eio_Alloc_Pool *pool, size_t sz)
|
||||||
|
{
|
||||||
|
void *result = NULL;
|
||||||
|
|
||||||
|
if (pool->count)
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&pool->lock);
|
||||||
|
result = eina_trash_pop(&pool->trash);
|
||||||
|
if (result) pool->count--;
|
||||||
|
pthread_mutex_unlock(&pool->lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!result) result = malloc(sz);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_eio_pool_free(Eio_Alloc_Pool *pool, void *data)
|
||||||
|
{
|
||||||
|
if (pool->count >= EIO_PROGRESS_LIMIT)
|
||||||
|
{
|
||||||
|
free(data);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&pool->lock);
|
||||||
|
eina_trash_push(&pool->trash, data);
|
||||||
|
pool->count++;
|
||||||
|
pthread_mutex_unlock(&pool->lock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @endcond
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*============================================================================*
|
||||||
|
* Global *
|
||||||
|
*============================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @cond LOCAL
|
||||||
|
*/
|
||||||
|
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
Eio_Progress *progress;
|
||||||
|
|
||||||
|
if (op->progress_cb == NULL)
|
||||||
|
return ;
|
||||||
|
|
||||||
|
progress = eio_progress_malloc();
|
||||||
|
if (!progress) return ;
|
||||||
|
|
||||||
|
progress->op = op->op;
|
||||||
|
progress->current = current;
|
||||||
|
progress->max = max;
|
||||||
|
progress->percent = (float) current * 100.0 / (float) max;
|
||||||
|
progress->source = eina_stringshare_ref(op->source);
|
||||||
|
progress->dest = eina_stringshare_ref(op->dest);
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @endcond
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*============================================================================*
|
||||||
|
* API *
|
||||||
|
*============================================================================*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @addtogroup Eio_Group Asynchronous Inout/Output library
|
* @addtogroup Eio_Group Asynchronous Inout/Output library
|
||||||
|
@ -87,87 +196,6 @@ eio_shutdown(void)
|
||||||
return _eio_count;
|
return _eio_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *
|
|
||||||
_eio_pool_malloc(Eio_Alloc_Pool *pool, size_t sz)
|
|
||||||
{
|
|
||||||
void *result = NULL;
|
|
||||||
|
|
||||||
if (pool->count)
|
|
||||||
{
|
|
||||||
pthread_mutex_lock(&pool->lock);
|
|
||||||
result = eina_trash_pop(&pool->trash);
|
|
||||||
if (result) pool->count--;
|
|
||||||
pthread_mutex_unlock(&pool->lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!result) result = malloc(sz);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_eio_pool_free(Eio_Alloc_Pool *pool, void *data)
|
|
||||||
{
|
|
||||||
if (pool->count >= EIO_PROGRESS_LIMIT)
|
|
||||||
{
|
|
||||||
free(data);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
Eio_Progress *progress;
|
|
||||||
|
|
||||||
if (op->progress_cb == NULL)
|
|
||||||
return ;
|
|
||||||
|
|
||||||
progress = eio_progress_malloc();
|
|
||||||
if (!progress) return ;
|
|
||||||
|
|
||||||
progress->op = op->op;
|
|
||||||
progress->current = current;
|
|
||||||
progress->max = max;
|
|
||||||
progress->percent = (float) current * 100.0 / (float) max;
|
|
||||||
progress->source = eina_stringshare_ref(op->source);
|
|
||||||
progress->dest = eina_stringshare_ref(op->dest);
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -21,78 +21,13 @@
|
||||||
#include "eio_private.h"
|
#include "eio_private.h"
|
||||||
#include "Eio.h"
|
#include "Eio.h"
|
||||||
|
|
||||||
void
|
/*============================================================================*
|
||||||
eio_file_error(Eio_File *common)
|
* Local *
|
||||||
{
|
*============================================================================*/
|
||||||
if (common->error_cb)
|
|
||||||
common->error_cb(common->error, (void*) common->data);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
/**
|
||||||
eio_file_thread_error(Eio_File *common, Ecore_Thread *thread)
|
* @cond LOCAL
|
||||||
{
|
|
||||||
common->error = errno;
|
|
||||||
ecore_thread_cancel(thread);
|
|
||||||
}
|
|
||||||
|
|
||||||
Eina_Bool
|
|
||||||
eio_long_file_set(Eio_File *common,
|
|
||||||
Eio_Done_Cb done_cb,
|
|
||||||
Eio_Error_Cb error_cb,
|
|
||||||
const void *data,
|
|
||||||
Ecore_Thread_Heavy_Cb heavy_cb,
|
|
||||||
Ecore_Thread_Notify_Cb notify_cb,
|
|
||||||
Ecore_Cb end_cb,
|
|
||||||
Ecore_Cb cancel_cb)
|
|
||||||
{
|
|
||||||
Ecore_Thread *thread;
|
|
||||||
|
|
||||||
common->done_cb = done_cb;
|
|
||||||
common->error_cb = error_cb;
|
|
||||||
common->data = data;
|
|
||||||
common->error = 0;
|
|
||||||
common->thread = NULL;
|
|
||||||
|
|
||||||
/* Be aware that ecore_thread_run could call cancel_cb if something goes wrong.
|
|
||||||
This means that common would be destroyed if thread == NULL.
|
|
||||||
*/
|
*/
|
||||||
thread = ecore_thread_feedback_run(heavy_cb,
|
|
||||||
notify_cb,
|
|
||||||
end_cb,
|
|
||||||
cancel_cb,
|
|
||||||
common,
|
|
||||||
EINA_TRUE);
|
|
||||||
if (thread) common->thread = thread;
|
|
||||||
return !!thread;
|
|
||||||
}
|
|
||||||
|
|
||||||
Eina_Bool
|
|
||||||
eio_file_set(Eio_File *common,
|
|
||||||
Eio_Done_Cb done_cb,
|
|
||||||
Eio_Error_Cb error_cb,
|
|
||||||
const void *data,
|
|
||||||
Ecore_Thread_Heavy_Cb job_cb,
|
|
||||||
Ecore_Cb end_cb,
|
|
||||||
Ecore_Cb cancel_cb)
|
|
||||||
{
|
|
||||||
Ecore_Thread *thread;
|
|
||||||
|
|
||||||
common->done_cb = done_cb;
|
|
||||||
common->error_cb = error_cb;
|
|
||||||
common->data = data;
|
|
||||||
common->error = 0;
|
|
||||||
common->thread = NULL;
|
|
||||||
|
|
||||||
/* Be aware that ecore_thread_run could call cancel_cb if something goes wrong.
|
|
||||||
This means that common would be destroyed if thread == NULL.
|
|
||||||
*/
|
|
||||||
thread = ecore_thread_run(job_cb, end_cb, cancel_cb, common);
|
|
||||||
|
|
||||||
if (thread) common->thread = thread;
|
|
||||||
return !!thread;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --- */
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_eio_file_mkdir(Ecore_Thread *thread, void *data)
|
_eio_file_mkdir(Ecore_Thread *thread, void *data)
|
||||||
|
@ -297,6 +232,98 @@ _eio_file_chown_error(void *data)
|
||||||
_eio_chown_free(ch);
|
_eio_chown_free(ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @endcond
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*============================================================================*
|
||||||
|
* Global *
|
||||||
|
*============================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @cond LOCAL
|
||||||
|
*/
|
||||||
|
|
||||||
|
void
|
||||||
|
eio_file_error(Eio_File *common)
|
||||||
|
{
|
||||||
|
if (common->error_cb)
|
||||||
|
common->error_cb(common->error, (void*) common->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
eio_file_thread_error(Eio_File *common, Ecore_Thread *thread)
|
||||||
|
{
|
||||||
|
common->error = errno;
|
||||||
|
ecore_thread_cancel(thread);
|
||||||
|
}
|
||||||
|
|
||||||
|
Eina_Bool
|
||||||
|
eio_long_file_set(Eio_File *common,
|
||||||
|
Eio_Done_Cb done_cb,
|
||||||
|
Eio_Error_Cb error_cb,
|
||||||
|
const void *data,
|
||||||
|
Ecore_Thread_Heavy_Cb heavy_cb,
|
||||||
|
Ecore_Thread_Notify_Cb notify_cb,
|
||||||
|
Ecore_Cb end_cb,
|
||||||
|
Ecore_Cb cancel_cb)
|
||||||
|
{
|
||||||
|
Ecore_Thread *thread;
|
||||||
|
|
||||||
|
common->done_cb = done_cb;
|
||||||
|
common->error_cb = error_cb;
|
||||||
|
common->data = data;
|
||||||
|
common->error = 0;
|
||||||
|
common->thread = NULL;
|
||||||
|
|
||||||
|
/* Be aware that ecore_thread_run could call cancel_cb if something goes wrong.
|
||||||
|
This means that common would be destroyed if thread == NULL.
|
||||||
|
*/
|
||||||
|
thread = ecore_thread_feedback_run(heavy_cb,
|
||||||
|
notify_cb,
|
||||||
|
end_cb,
|
||||||
|
cancel_cb,
|
||||||
|
common,
|
||||||
|
EINA_TRUE);
|
||||||
|
if (thread) common->thread = thread;
|
||||||
|
return !!thread;
|
||||||
|
}
|
||||||
|
|
||||||
|
Eina_Bool
|
||||||
|
eio_file_set(Eio_File *common,
|
||||||
|
Eio_Done_Cb done_cb,
|
||||||
|
Eio_Error_Cb error_cb,
|
||||||
|
const void *data,
|
||||||
|
Ecore_Thread_Heavy_Cb job_cb,
|
||||||
|
Ecore_Cb end_cb,
|
||||||
|
Ecore_Cb cancel_cb)
|
||||||
|
{
|
||||||
|
Ecore_Thread *thread;
|
||||||
|
|
||||||
|
common->done_cb = done_cb;
|
||||||
|
common->error_cb = error_cb;
|
||||||
|
common->data = data;
|
||||||
|
common->error = 0;
|
||||||
|
common->thread = NULL;
|
||||||
|
|
||||||
|
/* Be aware that ecore_thread_run could call cancel_cb if something goes wrong.
|
||||||
|
This means that common would be destroyed if thread == NULL.
|
||||||
|
*/
|
||||||
|
thread = ecore_thread_run(job_cb, end_cb, cancel_cb, common);
|
||||||
|
|
||||||
|
if (thread) common->thread = thread;
|
||||||
|
return !!thread;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @endcond
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*============================================================================*
|
||||||
|
* API *
|
||||||
|
*============================================================================*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @addtogroup Eio_Group Asynchronous Inout/Output library
|
* @addtogroup Eio_Group Asynchronous Inout/Output library
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue