- ecore_imf_context_input_panel_caps_lock_mode_set()
- ecore_imf_context_input_panel_caps_lock_mode_get()
+Fixes:
+ * ecore_thread:
+ - ecore_thread_feedback_run now handle try_no_queue the way it logically should.
+ - prevent double free that could cause crash when an Ecore_Thread stop.
+
Improvements:
* ecore:
- most allocations moved to mempools
static void *
_ecore_direct_worker(Ecore_Pthread_Worker *work)
{
+ Ecore_Pthread_Worker *end;
Ecore_Pthread_Data *pth;
#ifdef EFL_POSIX_THREADS
else
work->u.feedback_run.func_heavy((void *) work->data, (Ecore_Thread *) work);
- ecore_main_loop_thread_safe_call_async(_ecore_thread_handler, work);
-
if (work->message_run)
- work = work->u.message_run.direct_worker;
+ {
+ end = work->u.message_run.direct_worker;
+ work->u.message_run.direct_worker = NULL;
+ }
else
- work = work->u.feedback_run.direct_worker;
- if (!work)
+ {
+ end = work->u.feedback_run.direct_worker;
+ work->u.feedback_run.direct_worker = NULL;
+ }
+
+ ecore_main_loop_thread_safe_call_async(_ecore_thread_handler, work);
+
+ if (!end)
{
free(pth);
return NULL;
}
- work->data = pth;
- work->u.short_run.func_blocking = NULL;
- work->func_end = (void *)_ecore_thread_end;
- work->func_cancel = NULL;
- work->cancel = EINA_FALSE;
- work->feedback_run = EINA_FALSE;
- work->message_run = EINA_FALSE;
- work->no_queue = EINA_FALSE;
- work->kill = EINA_FALSE;
- work->hash = NULL;
- LKI(work->mutex);
- CDI(work->cond, work->mutex);
-
-// don't queue this - this is deleted by _ecore_thread_kill() already deleting work->u.feedback_run.direct_worker
-// ecore_main_loop_thread_safe_call_async(_ecore_thread_handler, work);
+ end->data = pth;
+ end->u.short_run.func_blocking = NULL;
+ end->func_end = (void *)_ecore_thread_end;
+ end->func_cancel = NULL;
+ end->cancel = EINA_FALSE;
+ end->feedback_run = EINA_FALSE;
+ end->message_run = EINA_FALSE;
+ end->no_queue = EINA_FALSE;
+ end->kill = EINA_FALSE;
+ end->hash = NULL;
+ LKI(end->mutex);
+ CDI(end->cond, end->mutex);
+
+ ecore_main_loop_thread_safe_call_async(_ecore_thread_handler, end);
return NULL;
}