ecore: do count threads only in the main loop.
NOTE: for an unknow reason I always get the wrong number of threads when doing the computation from the thread. Even if I use volatile and mutex. So to avoid that move that stuff in the main loop. It increase the complexity of the code, but at least it work. SVN revision: 60767
This commit is contained in:
parent
0ba8b7a39b
commit
5d473313b0
|
@ -345,6 +345,7 @@ struct _Ecore_Pthread_Worker
|
||||||
Eina_Bool feedback_run : 1;
|
Eina_Bool feedback_run : 1;
|
||||||
Eina_Bool kill : 1;
|
Eina_Bool kill : 1;
|
||||||
Eina_Bool reschedule : 1;
|
Eina_Bool reschedule : 1;
|
||||||
|
Eina_Bool no_queue : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef EFL_HAVE_THREADS
|
#ifdef EFL_HAVE_THREADS
|
||||||
|
@ -394,6 +395,9 @@ static Eina_Bool have_main_loop_thread = 0;
|
||||||
static Eina_Trash *_ecore_thread_worker_trash = NULL;
|
static Eina_Trash *_ecore_thread_worker_trash = NULL;
|
||||||
static int _ecore_thread_worker_count = 0;
|
static int _ecore_thread_worker_count = 0;
|
||||||
|
|
||||||
|
static void *_ecore_thread_worker(Ecore_Pthread_Data *pth);
|
||||||
|
static Ecore_Pthread_Worker *_ecore_thread_worker_new(void);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_ecore_thread_worker_free(Ecore_Pthread_Worker *worker)
|
_ecore_thread_worker_free(Ecore_Pthread_Worker *worker)
|
||||||
{
|
{
|
||||||
|
@ -435,13 +439,41 @@ _ecore_thread_pipe_del(void *data __UNUSED__, int type __UNUSED__, void *event _
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_ecore_thread_end(Ecore_Pthread_Data *pth, __UNUSED__ Ecore_Thread *work)
|
_ecore_thread_end(Ecore_Pthread_Data *pth, Ecore_Thread *work)
|
||||||
{
|
{
|
||||||
|
Ecore_Pthread_Worker *worker = (Ecore_Pthread_Worker *) work;
|
||||||
Ecore_Pipe *p;
|
Ecore_Pipe *p;
|
||||||
|
|
||||||
|
if (!worker->message_run || !worker->feedback_run || (worker->feedback_run && !worker->no_queue))
|
||||||
|
_ecore_thread_count--;
|
||||||
|
|
||||||
if (PHJ(pth->thread, p) != 0)
|
if (PHJ(pth->thread, p) != 0)
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
|
if (eina_list_count(_ecore_pending_job_threads) > 0
|
||||||
|
&& (unsigned int) _ecore_thread_count < eina_list_count(_ecore_pending_job_threads)
|
||||||
|
&& _ecore_thread_count < _ecore_thread_count_max)
|
||||||
|
{
|
||||||
|
/* One more thread should be created. */
|
||||||
|
INF("spawning threads because of still pending jobs.");
|
||||||
|
|
||||||
|
pth->death_job = _ecore_thread_worker_new();
|
||||||
|
if (!pth->p || !pth->death_job) goto end;
|
||||||
|
|
||||||
|
eina_threads_init();
|
||||||
|
|
||||||
|
if (PHC(pth->thread, _ecore_thread_worker, pth) == 0)
|
||||||
|
{
|
||||||
|
_ecore_thread_count++;
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
eina_threads_shutdown();
|
||||||
|
|
||||||
|
end:
|
||||||
|
if (pth->death_job) _ecore_thread_worker_free(pth->death_job);
|
||||||
|
}
|
||||||
|
|
||||||
_ecore_active_job_threads = eina_list_remove(_ecore_active_job_threads, pth);
|
_ecore_active_job_threads = eina_list_remove(_ecore_active_job_threads, pth);
|
||||||
|
|
||||||
ecore_event_add(ECORE_THREAD_PIPE_DEL, pth->p, _ecore_thread_pipe_free, NULL);
|
ecore_event_add(ECORE_THREAD_PIPE_DEL, pth->p, _ecore_thread_pipe_free, NULL);
|
||||||
|
@ -662,10 +694,6 @@ _ecore_thread_worker(Ecore_Pthread_Data *pth)
|
||||||
|
|
||||||
eina_sched_prio_drop();
|
eina_sched_prio_drop();
|
||||||
|
|
||||||
LKL(_ecore_pending_job_threads_mutex);
|
|
||||||
_ecore_thread_count++;
|
|
||||||
LKU(_ecore_pending_job_threads_mutex);
|
|
||||||
|
|
||||||
restart:
|
restart:
|
||||||
if (_ecore_pending_job_threads) _ecore_short_job(pth->p);
|
if (_ecore_pending_job_threads) _ecore_short_job(pth->p);
|
||||||
if (_ecore_pending_job_threads_feedback) _ecore_feedback_job(pth->p, pth->thread);
|
if (_ecore_pending_job_threads_feedback) _ecore_feedback_job(pth->p, pth->thread);
|
||||||
|
@ -693,7 +721,6 @@ _ecore_thread_worker(Ecore_Pthread_Data *pth)
|
||||||
LKU(_ecore_pending_job_threads_mutex);
|
LKU(_ecore_pending_job_threads_mutex);
|
||||||
goto restart;
|
goto restart;
|
||||||
}
|
}
|
||||||
_ecore_thread_count--;
|
|
||||||
LKU(_ecore_pending_job_threads_mutex);
|
LKU(_ecore_pending_job_threads_mutex);
|
||||||
|
|
||||||
work = pth->death_job;
|
work = pth->death_job;
|
||||||
|
@ -906,7 +933,10 @@ ecore_thread_run(Ecore_Thread_Cb func_blocking,
|
||||||
eina_threads_init();
|
eina_threads_init();
|
||||||
|
|
||||||
if (PHC(pth->thread, _ecore_thread_worker, pth) == 0)
|
if (PHC(pth->thread, _ecore_thread_worker, pth) == 0)
|
||||||
return (Ecore_Thread *) work;
|
{
|
||||||
|
_ecore_thread_count++;
|
||||||
|
return (Ecore_Thread *) work;
|
||||||
|
}
|
||||||
|
|
||||||
eina_threads_shutdown();
|
eina_threads_shutdown();
|
||||||
|
|
||||||
|
@ -1129,11 +1159,14 @@ EAPI Ecore_Thread *ecore_thread_feedback_run(Ecore_Thread_Cb func_heavy,
|
||||||
|
|
||||||
worker->u.feedback_run.direct_pipe = _ecore_thread_pipe_get();
|
worker->u.feedback_run.direct_pipe = _ecore_thread_pipe_get();
|
||||||
worker->u.feedback_run.direct_worker = _ecore_thread_worker_new();
|
worker->u.feedback_run.direct_worker = _ecore_thread_worker_new();
|
||||||
|
worker->no_queue = EINA_TRUE;
|
||||||
|
|
||||||
if (PHC(t, _ecore_direct_worker, worker) == 0)
|
if (PHC(t, _ecore_direct_worker, worker) == 0)
|
||||||
return (Ecore_Thread *) worker;
|
return (Ecore_Thread *) worker;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
worker->no_queue = EINA_FALSE;
|
||||||
|
|
||||||
LKL(_ecore_pending_job_threads_mutex);
|
LKL(_ecore_pending_job_threads_mutex);
|
||||||
_ecore_pending_job_threads_feedback = eina_list_append(_ecore_pending_job_threads_feedback, worker);
|
_ecore_pending_job_threads_feedback = eina_list_append(_ecore_pending_job_threads_feedback, worker);
|
||||||
|
|
||||||
|
@ -1156,7 +1189,10 @@ EAPI Ecore_Thread *ecore_thread_feedback_run(Ecore_Thread_Cb func_heavy,
|
||||||
eina_threads_init();
|
eina_threads_init();
|
||||||
|
|
||||||
if (PHC(pth->thread, _ecore_thread_worker, pth) == 0)
|
if (PHC(pth->thread, _ecore_thread_worker, pth) == 0)
|
||||||
return (Ecore_Thread *) worker;
|
{
|
||||||
|
_ecore_thread_count++;
|
||||||
|
return (Ecore_Thread *) worker;
|
||||||
|
}
|
||||||
|
|
||||||
eina_threads_shutdown();
|
eina_threads_shutdown();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue