emotion - fix shutdown to ensure all pending async calls are gone too.

This commit is contained in:
Carsten Haitzler 2013-07-18 19:59:41 +09:00
parent 525c4cbece
commit f9f0b717e6
4 changed files with 83 additions and 23 deletions

View File

@ -130,7 +130,6 @@ emotion_object_extension_may_play_get(const char *file)
static int _emotion_init_count = 0;
EAPI Eina_Bool
emotion_init(void)
{
@ -188,6 +187,20 @@ emotion_init(void)
return EINA_FALSE;
}
static int emotion_pendig_events = 0;
EAPI void
_emotion_pending_ecore_begin(void)
{
emotion_pendig_events++;
}
EAPI void
_emotion_pending_ecore_end(void)
{
emotion_pendig_events--;
}
EAPI Eina_Bool
emotion_shutdown(void)
{
@ -200,6 +213,21 @@ emotion_shutdown(void)
}
if (--_emotion_init_count) return EINA_TRUE;
start = ecore_time_get();
while (((emotion_pending_objects > 0) ||
(emotion_pendig_events > 0)) &&
((ecore_time_get() - start) < 0.5))
ecore_main_loop_iterate();
if (emotion_pending_objects > 0)
{
EINA_LOG_ERR("There is still %i Emotion pipeline running", emotion_pending_objects);
}
if (emotion_pendig_events > 0)
{
EINA_LOG_ERR("There is still %i Emotion events queued", emotion_pendig_events);
}
emotion_modules_shutdown();
emotion_webcam_shutdown();
@ -211,15 +239,6 @@ emotion_shutdown(void)
_emotion_config_file = NULL;
}
start = ecore_time_get();
while (emotion_pending_objects && ecore_time_get() - start < 0.5)
ecore_main_loop_iterate();
if (emotion_pending_objects)
{
EINA_LOG_ERR("There is still %i Emotion pipeline running", emotion_pending_objects);
}
eet_shutdown();
ecore_shutdown();

View File

@ -127,6 +127,10 @@ EAPI void _emotion_image_reset(Evas_Object *obj);
EAPI void _emotion_pending_object_ref(void);
EAPI void _emotion_pending_object_unref(void);
EAPI void _emotion_pending_ecore_begin(void);
EAPI void _emotion_pending_ecore_end(void);
EAPI const char *emotion_webcam_custom_get(const char *device);
EAPI Eina_Bool _emotion_module_register(const Emotion_Engine *api);

View File

@ -1220,7 +1220,7 @@ gstreamer_module_init(void)
if (_emotion_init_count > 0)
{
_emotion_init_count++;
_emotion_pending_ecore_begin();
return EINA_TRUE;
}
@ -1525,6 +1525,7 @@ _main_frame_resize(void *data)
ratio = (double)ev->src_width / (double)ev->src_height;
_emotion_frame_resize(ev->obj, ev->src_width, ev->src_height, ratio);
_emotion_pending_ecore_end();
}
static void
@ -1539,6 +1540,7 @@ _no_more_pads(GstElement *decodebin, gpointer data)
{
if(_video_size_get(GST_ELEMENT(elem), &ev->src_width, &ev->src_height))
{
_emotion_pending_ecore_begin();
ecore_main_loop_thread_safe_call_async(_main_frame_resize, ev);
gst_object_unref(elem);
break;
@ -1622,6 +1624,7 @@ _eos_main_fct(void *data)
}
emotion_gstreamer_message_free(send);
_emotion_pending_ecore_end();
}
static GstBusSyncReply
@ -1642,7 +1645,11 @@ _eos_sync_fct(GstBus *bus EINA_UNUSED, GstMessage *msg, gpointer data)
GST_MESSAGE_TYPE_NAME(msg));
send = emotion_gstreamer_message_alloc(ev, msg);
if (send) ecore_main_loop_thread_safe_call_async(_eos_main_fct, send);
if (send)
{
_emotion_pending_ecore_begin();
ecore_main_loop_thread_safe_call_async(_eos_main_fct, send);
}
break;
@ -1660,7 +1667,11 @@ _eos_sync_fct(GstBus *bus EINA_UNUSED, GstMessage *msg, gpointer data)
{
send = emotion_gstreamer_message_alloc(ev, msg);
if (send) ecore_main_loop_thread_safe_call_async(_eos_main_fct, send);
if (send)
{
_emotion_pending_ecore_begin();
ecore_main_loop_thread_safe_call_async(_eos_main_fct, send);
}
}
break;
}
@ -1679,7 +1690,11 @@ _eos_sync_fct(GstBus *bus EINA_UNUSED, GstMessage *msg, gpointer data)
{
send = emotion_gstreamer_message_alloc(ev, msg);
if (send) ecore_main_loop_thread_safe_call_async(_eos_main_fct, send);
if (send)
{
_emotion_pending_ecore_begin();
ecore_main_loop_thread_safe_call_async(_eos_main_fct, send);
}
}
break;
}

View File

@ -237,7 +237,7 @@ gboolean evas_video_sink_set_caps(GstBaseSink *bsink, GstCaps *caps)
DBG("Found '%s'", colorspace_fourcc_convertion[i].name);
priv->eformat = colorspace_fourcc_convertion[i].eformat;
priv->func = colorspace_fourcc_convertion[i].func;
if (colorspace_fourcc_convertion[i].force_height)
if (colorspace_fourcc_convertion[i].force_height)
{
priv->height = (priv->height >> 1) << 1;
}
@ -388,11 +388,14 @@ evas_video_sink_preroll(GstBaseSink* bsink, GstBuffer* buffer)
else
priv->func = _evas_video_st12;
}
_emotion_pending_ecore_begin();
ecore_main_loop_thread_safe_call_async(evas_video_sink_samsung_main_render, send);
}
else
ecore_main_loop_thread_safe_call_async(evas_video_sink_main_render, send);
{
_emotion_pending_ecore_begin();
ecore_main_loop_thread_safe_call_async(evas_video_sink_main_render, send);
}
}
return GST_FLOW_OK;
@ -442,11 +445,14 @@ evas_video_sink_render(GstBaseSink* bsink, GstBuffer* buffer)
else
priv->func = _evas_video_st12;
}
_emotion_pending_ecore_begin();
ecore_main_loop_thread_safe_call_async(evas_video_sink_samsung_main_render, send);
}
else
ecore_main_loop_thread_safe_call_async(evas_video_sink_main_render, send);
{
_emotion_pending_ecore_begin();
ecore_main_loop_thread_safe_call_async(evas_video_sink_main_render, send);
}
eina_condition_wait(&priv->c);
eina_lock_release(&priv->m);
@ -612,11 +618,16 @@ evas_video_sink_samsung_main_render(void *data)
exit_stream:
if (priv)
{
if (preroll || !priv->o) return;
if (preroll || !priv->o)
{
_emotion_pending_ecore_end();
return;
}
if (!priv->unlocked)
eina_condition_signal(&priv->c);
}
_emotion_pending_ecore_end();
}
static void
@ -723,11 +734,16 @@ evas_video_sink_main_render(void *data)
exit_stream:
if (priv)
{
if (preroll || !priv->o) return;
if (preroll || !priv->o)
{
_emotion_pending_ecore_end();
return;
}
if (!priv->unlocked)
eina_condition_signal(&priv->c);
}
_emotion_pending_ecore_end();
}
static void
@ -976,9 +992,15 @@ _video_update_pixels(void *data, Evas_Object *obj EINA_UNUSED, const Evas_Video_
ev->send = NULL;
if (priv->samsung)
evas_video_sink_samsung_main_render(send);
{
_emotion_pending_ecore_begin();
evas_video_sink_samsung_main_render(send);
}
else
evas_video_sink_main_render(send);
{
_emotion_pending_ecore_begin();
evas_video_sink_main_render(send);
}
}
static void