static pthread_cond_t _ecore_thread_global_hash_cond = PTHREAD_COND_INITIALIZER;
static pthread_t main_loop_thread;
static Eina_Bool have_main_loop_thread = 0;
+
static void
_ecore_thread_data_free(void *data)
{
Ecore_Pipe *p = event;
ecore_pipe_del(p);
+ eina_threads_shutdown();
}
static Eina_Bool
if (pthread_join(pth->thread, (void **) &p) != 0)
return ;
- eina_threads_shutdown();
-
_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);
}
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_remove_list(_ecore_pending_job_threads,
+ _ecore_pending_job_threads);
pthread_mutex_unlock(&_ecore_pending_job_threads_mutex);
}
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_remove_list(_ecore_pending_job_threads_feedback,
+ _ecore_pending_job_threads_feedback);
pthread_mutex_unlock(&_ecore_pending_job_threads_mutex);
_ecore_thread_count++;
pthread_mutex_unlock(&_ecore_pending_job_threads_mutex);
- on_error:
+ restart:
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)
{
pthread_mutex_unlock(&_ecore_pending_job_threads_mutex);
- goto on_error;
+ goto restart;
}
if (_ecore_pending_job_threads_feedback)
{
pthread_mutex_unlock(&_ecore_pending_job_threads_mutex);
- goto on_error;
+ goto restart;
}
+ pthread_mutex_unlock(&_ecore_pending_job_threads_mutex);
- _ecore_thread_count--;
+ /* Sleep a little to prevent premature death */
+ usleep(200);
+ pthread_mutex_lock(&_ecore_pending_job_threads_mutex);
+ if (_ecore_pending_job_threads)
+ {
+ pthread_mutex_unlock(&_ecore_pending_job_threads_mutex);
+ goto restart;
+ }
+ if (_ecore_pending_job_threads_feedback)
+ {
+ pthread_mutex_unlock(&_ecore_pending_job_threads_mutex);
+ goto restart;
+ }
+ _ecore_thread_count--;
pthread_mutex_unlock(&_ecore_pending_job_threads_mutex);
work = malloc(sizeof (Ecore_Pthread_Worker));
free(work);
}
+ EINA_LIST_FREE(_ecore_pending_job_threads_feedback, work)
+ {
+ if (work->func_cancel)
+ work->func_cancel((void *)work->data);
+ free(work);
+ }
+
pthread_mutex_unlock(&_ecore_pending_job_threads_mutex);
EINA_LIST_FREE(_ecore_active_job_threads, pth)
if (pth)
{
if (pth->p) ecore_pipe_del(pth->p);
+ pth->p = NULL;
free(pth);
}
if (_ecore_thread_count == 0)
{
+ pthread_mutex_lock(&_ecore_pending_job_threads_mutex);
+ _ecore_pending_job_threads = eina_list_remove(_ecore_pending_job_threads, work);
+ pthread_mutex_unlock(&_ecore_pending_job_threads_mutex);
+
if (work->func_cancel)
work->func_cancel((void *) work->data);
free(work);
work->func_cancel((void *) work->data);
free(work);
- eina_threads_shutdown();
-
return EINA_TRUE;
}
}
work->func_cancel((void *) work->data);
free(work);
- eina_threads_shutdown();
-
return EINA_TRUE;
}
}
if (_ecore_thread_count == 0)
{
+ pthread_mutex_lock(&_ecore_pending_job_threads_mutex);
+ _ecore_pending_job_threads_feedback = eina_list_remove(_ecore_pending_job_threads_feedback,
+ worker);
+ pthread_mutex_unlock(&_ecore_pending_job_threads_mutex);
+
if (func_cancel) func_cancel((void *) data);
if (worker)