diff options
author | Cedric BAIL <cedric@osg.samsung.com> | 2018-05-05 21:15:55 -0700 |
---|---|---|
committer | Cedric BAIL <cedric@osg.samsung.com> | 2018-05-05 21:15:55 -0700 |
commit | e8df3515d7c198ccfbf3a1ef698d97c8b6002b1a (patch) | |
tree | 971da78359dcf5de1fa31935d56efa40e94bec4f | |
parent | 382079bccd5c54c3041df25b6555f46cd502c4fc (diff) | |
download | efl-e8df3515d7c198ccfbf3a1ef698d97c8b6002b1a.tar.gz |
eio: on error/cancel properly destroy weak reference.
-rw-r--r-- | src/lib/eio/eio_model.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/src/lib/eio/eio_model.c b/src/lib/eio/eio_model.c index b8e8ebfaf8..7275443ea2 100644 --- a/src/lib/eio/eio_model.c +++ b/src/lib/eio/eio_model.c @@ -395,15 +395,22 @@ _build_delay(Efl_Loop *loop) return eina_future_new(p); } +static void +_eio_build_mime_clean(Eio_Model_Data *pd) +{ + efl_wref_del(pd->loop, &pd->loop); + pd->loop = NULL; + pd->request.mime = NULL; +} + static Eina_Value _eio_build_mime_now(void *data, const Eina_Value v, const Eina_Future *dead_future EINA_UNUSED) { Eio_Model *model = data; Eio_Model_Data *pd = efl_data_scope_get(model, EIO_MODEL_CLASS); - if (v.type == EINA_VALUE_TYPE_ERROR) return v; - - if (!pd->loop) return v; + if (v.type == EINA_VALUE_TYPE_ERROR) goto on_error; + if (!pd->loop) goto on_error; // Make sure that we are not over consuming time in the main loop if (delayed_queue || ecore_time_get() - ecore_loop_time_get() > 0.004) @@ -415,13 +422,16 @@ _eio_build_mime_now(void *data, const Eina_Value v, const Eina_Future *dead_futu pd->mime_type = efreet_mime_type_get(pd->path); - efl_wref_del(pd->loop, &pd->loop); - pd->loop = NULL; - pd->request.mime = NULL; + _eio_build_mime_clean(pd); efl_model_properties_changed(model, "mime_type"); return v; + + on_error: + _eio_build_mime_clean(pd); + + return v; } static void |