ecore: use Eina_Thread in Ecore_Thread.

SVN revision: 78227
This commit is contained in:
Cedric BAIL 2012-10-19 05:49:48 +00:00
parent 52cf5dce93
commit e882b94434
3 changed files with 12 additions and 105 deletions

View File

@ -1014,3 +1014,7 @@
2012-10-16 Christopher Michael
* Update Ecore_Wayland to build & work with newest wayland (0.99) from git
2012-10-19 Cedric Bail
* Use Eina_Thread for Ecore_Thread.

View File

@ -46,6 +46,7 @@ Removal:
* 8bpp evas engine support removed (API still there, but inactive).
Improvements:
* Use Eina_Thread for Ecore_Thread.
Ecore 1.7.0

View File

@ -37,6 +37,12 @@
# define LRWKRL(x) eina_rwlock_take_read(&(x));
# define LRWKU(x) eina_rwlock_release(&(x));
# define PH(x) Eina_Thread x
# define PHE(x, y) eina_thread_equal(x, y)
# define PHS() eina_thread_self()
# define PHC(x, f, d) eina_thread_create(&(x), EINA_THREAD_BACKGROUND, EINA_TRUE, (void *)f, d)
# define PHJ(x) eina_thread_join(x)
# ifdef EFL_HAVE_POSIX_THREADS
# include <pthread.h>
# ifdef __linux__
@ -47,99 +53,12 @@
# include <errno.h>
# endif
# define PH(x) pthread_t x
# define PHE(x, y) pthread_equal(x, y)
# define PHS() pthread_self()
# define PHC(x, f, d) pthread_create(&(x), NULL, (void *)f, d)
# define PHJ(x) pthread_join(x, NULL)
# define PHA(x) pthread_cancel(x)
# else /* EFL_HAVE_WIN32_THREADS */
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
# undef WIN32_LEAN_AND_MEAN
typedef struct
{
HANDLE thread;
void *val;
} win32_thread;
static Eina_List *_ecore_thread_win32_threads = NULL;
static Eina_Lock _ecore_thread_win32_lock;
# define PH(x) win32_thread * x
# define PHE(x, y) ((x) == (y))
static win32_thread *
_ecore_thread_win32_self()
{
win32_thread *t;
Eina_List *l;
LKL(_ecore_thread_win32_lock);
EINA_LIST_FOREACH(_ecore_thread_win32_threads, l, t)
if (t->thread == GetCurrentThread())
{
LKU(_ecore_thread_win32_lock);
return t;
}
LKU(_ecore_thread_win32_lock);
return NULL;
}
# define PHS() _ecore_thread_win32_self()
static int
_ecore_thread_win32_create(win32_thread **x,
LPTHREAD_START_ROUTINE f,
void *d)
{
win32_thread *t;
t = (win32_thread *)calloc(1, sizeof(win32_thread));
if (!t)
return -1;
LKL(_ecore_thread_win32_lock);
(t)->thread = CreateThread(NULL, 0, f, d, 0, NULL);
if (!t->thread)
{
free(t);
LKU(_ecore_thread_win32_lock);
return -1;
}
t->val = d;
*x = t;
_ecore_thread_win32_threads = eina_list_append(_ecore_thread_win32_threads, t);
LKU(_ecore_thread_win32_lock);
return 0;
}
# define PHC(x, f, d) _ecore_thread_win32_create(&(x), (LPTHREAD_START_ROUTINE)f, d)
static int
_ecore_thread_win32_join(win32_thread *x,
void **res)
{
if (!PHE(x, PHS()))
{
WaitForSingleObject(x->thread, INFINITE);
CloseHandle(x->thread);
}
if (res) *res = x->val;
_ecore_thread_win32_threads = eina_list_remove(_ecore_thread_win32_threads, x);
free(x);
return 0;
}
# define PHJ(x) _ecore_thread_win32_join(x, NULL)
# define PHA(x) TerminateThread(x->thread, 0)
# endif
#endif
@ -524,13 +443,6 @@ _ecore_feedback_job(PH(thread))
static void *
_ecore_direct_worker(Ecore_Pthread_Worker *work)
{
#ifdef EFL_POSIX_THREADS
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
#endif
eina_sched_prio_drop();
work->self = PHS();
if (work->message_run)
work->u.message_run.func_main((void *) work->data, (Ecore_Thread *) work);
@ -548,13 +460,6 @@ _ecore_direct_worker(Ecore_Pthread_Worker *work)
static void *
_ecore_thread_worker(void *data __UNUSED__)
{
#ifdef EFL_POSIX_THREADS
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
#endif
eina_sched_prio_drop();
restart:
_ecore_short_job(PHS());
_ecore_feedback_job(PHS());
@ -788,10 +693,7 @@ ecore_thread_run(Ecore_Thread_Cb func_blocking,
if (work->func_cancel)
work->func_cancel((void *) work->data, (Ecore_Thread *) work);
CDD(work->cond);
LKD(work->mutex);
LKD(work->cancel_mutex);
free(work);
_ecore_thread_worker_free(work);
work = NULL;
}
LKU(_ecore_pending_job_threads_mutex);