summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>2013-11-10 11:04:18 +0900
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>2013-11-10 11:04:18 +0900
commit35228f32f189f90975729ca2dd0f3755f0e3db03 (patch)
treedee047bdd336976f7a9193a1285831dacc74768c
parent3b531d01bd7be7f0bbffab935dd88794933e0f6d (diff)
downloadefl-35228f32f189f90975729ca2dd0f3755f0e3db03.tar.gz
ecore-audio - handle deletion of objects from outputs list in ctx fail cb
-rw-r--r--src/lib/ecore_audio/ecore_audio_obj_out_pulse.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/lib/ecore_audio/ecore_audio_obj_out_pulse.c b/src/lib/ecore_audio/ecore_audio_obj_out_pulse.c
index 2c3f2ffdbc..11fc20f537 100644
--- a/src/lib/ecore_audio/ecore_audio_obj_out_pulse.c
+++ b/src/lib/ecore_audio/ecore_audio_obj_out_pulse.c
@@ -243,12 +243,21 @@ static void _state_job(void *data EINA_UNUSED)
(class_vars.state == PA_CONTEXT_TERMINATED))
{
Eo *eo_obj;
- Eina_List *out;
+ Eina_List *out, *tmp;
DBG("PA context fail.");
+ //ref everything in the list to be sure...
+ EINA_LIST_FOREACH(class_vars.outputs, out, eo_obj) {
+ eo_ref(eo_obj);
+ }
+ // the callback here can delete things in the list..
EINA_LIST_FOREACH(class_vars.outputs, out, eo_obj) {
eo_do(eo_obj, eo_event_callback_call(ECORE_AUDIO_EV_OUT_PULSE_CONTEXT_FAIL, NULL, NULL));
}
+ // now unref everything safely
+ EINA_LIST_FOREACH_SAFE(class_vars.outputs, out, tmp, eo_obj) {
+ eo_unref(eo_obj);
+ }
}
class_vars.state_job = NULL;
}