+
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
_ecore_short_job(PH(thread))
{
Ecore_Pthread_Worker *work;
+ int cancel;
- while (_ecore_pending_job_threads)
+ LKL(_ecore_pending_job_threads_mutex);
+
+ if (!_ecore_pending_job_threads)
{
- int cancel;
-
+ LKU(_ecore_pending_job_threads_mutex);
+ return;
+ }
+
+ work = eina_list_data_get(_ecore_pending_job_threads);
+ _ecore_pending_job_threads = eina_list_remove_list(_ecore_pending_job_threads,
+ _ecore_pending_job_threads);
+
+ LKU(_ecore_pending_job_threads_mutex);
+
+ LKL(work->cancel_mutex);
+ cancel = work->cancel;
+ LKU(work->cancel_mutex);
+ work->self = thread;
+ if (!cancel)
+ work->u.short_run.func_blocking((void *) work->data, (Ecore_Thread*) work);
+
+ if (work->reschedule)
+ {
+ work->reschedule = EINA_FALSE;
+
LKL(_ecore_pending_job_threads_mutex);
-
- if (!_ecore_pending_job_threads)
- {
- LKU(_ecore_pending_job_threads_mutex);
- break;
- }
-
- work = eina_list_data_get(_ecore_pending_job_threads);
- _ecore_pending_job_threads = eina_list_remove_list(_ecore_pending_job_threads,
- _ecore_pending_job_threads);
-
+ _ecore_pending_job_threads = eina_list_append(_ecore_pending_job_threads, work);
LKU(_ecore_pending_job_threads_mutex);
-
- LKL(work->cancel_mutex);
- cancel = work->cancel;
- LKU(work->cancel_mutex);
- work->self = thread;
- if (!cancel)
- work->u.short_run.func_blocking((void *) work->data, (Ecore_Thread*) work);
-
- if (work->reschedule)
- {
- work->reschedule = EINA_FALSE;
-
- LKL(_ecore_pending_job_threads_mutex);
- _ecore_pending_job_threads = eina_list_append(_ecore_pending_job_threads, work);
- LKU(_ecore_pending_job_threads_mutex);
- }
- else
- {
- ecore_main_loop_thread_safe_call_async(_ecore_thread_handler, work);
- }
+ }
+ else
+ {
+ ecore_main_loop_thread_safe_call_async(_ecore_thread_handler, work);
}
}
_ecore_feedback_job(PH(thread))
{
Ecore_Pthread_Worker *work;
-
- while (_ecore_pending_job_threads_feedback)
+ int cancel;
+
+ LKL(_ecore_pending_job_threads_mutex);
+
+ if (!_ecore_pending_job_threads_feedback)
{
- int cancel;
-
+ LKU(_ecore_pending_job_threads_mutex);
+ return;
+ }
+
+ work = eina_list_data_get(_ecore_pending_job_threads_feedback);
+ _ecore_pending_job_threads_feedback = eina_list_remove_list(_ecore_pending_job_threads_feedback,
+ _ecore_pending_job_threads_feedback);
+
+ LKU(_ecore_pending_job_threads_mutex);
+
+ LKL(work->cancel_mutex);
+ cancel = work->cancel;
+ LKU(work->cancel_mutex);
+ work->self = thread;
+ if (!cancel)
+ work->u.feedback_run.func_heavy((void *) work->data, (Ecore_Thread *) work);
+
+ if (work->reschedule)
+ {
+ work->reschedule = EINA_FALSE;
+
LKL(_ecore_pending_job_threads_mutex);
-
- if (!_ecore_pending_job_threads_feedback)
- {
- LKU(_ecore_pending_job_threads_mutex);
- break;
- }
-
- work = eina_list_data_get(_ecore_pending_job_threads_feedback);
- _ecore_pending_job_threads_feedback = eina_list_remove_list(_ecore_pending_job_threads_feedback,
- _ecore_pending_job_threads_feedback);
-
+ _ecore_pending_job_threads_feedback = eina_list_append(_ecore_pending_job_threads_feedback, work);
LKU(_ecore_pending_job_threads_mutex);
-
- LKL(work->cancel_mutex);
- cancel = work->cancel;
- LKU(work->cancel_mutex);
- work->self = thread;
- if (!cancel)
- work->u.feedback_run.func_heavy((void *) work->data, (Ecore_Thread *) work);
-
- if (work->reschedule)
- {
- work->reschedule = EINA_FALSE;
-
- LKL(_ecore_pending_job_threads_mutex);
- _ecore_pending_job_threads_feedback = eina_list_append(_ecore_pending_job_threads_feedback, work);
- LKU(_ecore_pending_job_threads_mutex);
- }
- else
- {
- ecore_main_loop_thread_safe_call_async(_ecore_thread_handler, work);
- }
+ }
+ else
+ {
+ ecore_main_loop_thread_safe_call_async(_ecore_thread_handler, work);
}
}
eina_sched_prio_drop();
restart:
- if (_ecore_pending_job_threads) _ecore_short_job(PHS());
- if (_ecore_pending_job_threads_feedback) _ecore_feedback_job(PHS());
+ _ecore_short_job(PHS());
+ _ecore_feedback_job(PHS());
/* FIXME: Check if there is feedback running task todo, and switch to feedback run handler. */
#ifdef _WIN32
Sleep(1); /* around 50ms */
#else
- usleep(200);
+ usleep(50);
#endif
LKL(_ecore_pending_job_threads_mutex);
EINA_MAIN_LOOP_CHECK_RETURN;
if (num < 1) return;
/* avoid doing something hilarious by blocking dumb users */
- if (num >= (2 * eina_cpu_count())) return;
+ if (num >= (16 * eina_cpu_count())) num = 16 * eina_cpu_count();
_ecore_thread_count_max = num;
}