diff options
author | Andrzej Zaborowski <andrew.zaborowski@intel.com> | 2010-06-29 05:00:27 +0200 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2010-06-29 13:59:13 -0500 |
commit | b450efafec2f931d5497dffe018cd751ebdf25b9 (patch) | |
tree | 0d203e454f7e135ea04f1d6e9babe99391b4bd67 | |
parent | e8965f5f8c85578158de69cc57df624f9c62f461 (diff) | |
download | ofono-b450efafec2f931d5497dffe018cd751ebdf25b9.tar.bz2 |
atmodem: Don't unregister *EPEV in *EPEV handler.
Handlers are called when looping over the unsolicited responses hash,
registering or unregistering modifies that hash and confuses glib.
-rw-r--r-- | drivers/atmodem/sim.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/drivers/atmodem/sim.c b/drivers/atmodem/sim.c index 7499d600..2b4a8c63 100644 --- a/drivers/atmodem/sim.c +++ b/drivers/atmodem/sim.c @@ -45,6 +45,7 @@ struct sim_data { GAtChat *chat; unsigned int vendor; guint epev_id; + guint epev_source; }; static const char *crsm_prefix[] = { "+CRSM:", NULL }; @@ -510,6 +511,18 @@ error: CALLBACK_WITH_FAILURE(cb, -1, data); } +static gboolean at_epev_unregister(gpointer user_data) +{ + struct sim_data *sd = user_data; + + sd->epev_source = 0; + + g_at_chat_unregister(sd->chat, sd->epev_id); + sd->epev_id = 0; + + return FALSE; +} + static void at_epev_notify(GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; @@ -517,10 +530,12 @@ static void at_epev_notify(GAtResult *result, gpointer user_data) ofono_sim_lock_unlock_cb_t cb = cbd->cb; struct ofono_error error = { .type = OFONO_ERROR_TYPE_NO_ERROR }; + if (sd->epev_source) + return; + cb(&error, cbd->data); - g_at_chat_unregister(sd->chat, sd->epev_id); - sd->epev_id = 0; + sd->epev_source = g_timeout_add(0, at_epev_unregister, sd); } static void at_pin_send_cb(gboolean ok, GAtResult *result, @@ -803,6 +818,9 @@ static void at_sim_remove(struct ofono_sim *sim) ofono_sim_set_data(sim, NULL); + if (sd->epev_source) + g_source_remove(sd->epev_source); + g_free(sd); } |