summaryrefslogtreecommitdiffstats
path: root/src/modem.c
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2009-12-02 19:08:31 -0600
committerDenis Kenzior <denkenz@gmail.com>2009-12-02 19:11:36 -0600
commitb0f0e248e9c945239e0d6dd2ea5a37cb8227e51c (patch)
tree6328518c613504e12a80db9961ccf28db39bcced /src/modem.c
parentc25532df5025f85de7a082be2f20fac1efae24e0 (diff)
downloadofono-b0f0e248e9c945239e0d6dd2ea5a37cb8227e51c.tar.bz2
When SIGTERM is received, run the event loop
This feature will continue running the event loop for another 10 seconds or so or until all the modems have been shut down. This will allow the modem drivers to properly shutdown their respective devices.
Diffstat (limited to 'src/modem.c')
-rw-r--r--src/modem.c60
1 files changed, 48 insertions, 12 deletions
diff --git a/src/modem.c b/src/modem.c
index d44d0802..9ac0c4c2 100644
--- a/src/modem.c
+++ b/src/modem.c
@@ -39,6 +39,8 @@ static GSList *g_driver_list = NULL;
static GSList *g_modem_list = NULL;
static int next_modem_id = 0;
+static gboolean powering_down = FALSE;
+static int modems_remaining = 0;
enum ofono_property_type {
OFONO_PROPERTY_TYPE_INVALID = 0,
@@ -478,6 +480,9 @@ static DBusMessage *modem_set_property(DBusConnection *conn,
if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)
return __ofono_error_invalid_args(msg);
+ if (powering_down == TRUE)
+ return __ofono_error_failed(msg);
+
dbus_message_iter_recurse(&iter, &var);
if (g_str_equal(name, "Powered") == TRUE) {
@@ -539,7 +544,6 @@ static GDBusSignalTable modem_signals[] = {
void ofono_modem_set_powered(struct ofono_modem *modem, ofono_bool_t powered)
{
DBusConnection *conn = ofono_dbus_get_connection();
- dbus_bool_t dbus_powered;
if (modem->timeout > 0) {
g_source_remove(modem->timeout);
@@ -559,23 +563,29 @@ void ofono_modem_set_powered(struct ofono_modem *modem, ofono_bool_t powered)
modem->powered_pending = powered;
- if (modem->powered == powered)
- return;
+ if (modem->powered != powered) {
+ modem->powered = powered;
- modem->powered = powered;
+ if (modem->driver) {
+ dbus_bool_t dbus_powered = powered;
- if (modem->driver == NULL)
- return;
-
- dbus_powered = powered;
- ofono_dbus_signal_property_changed(conn, modem->path,
+ ofono_dbus_signal_property_changed(conn, modem->path,
OFONO_MODEM_INTERFACE,
"Powered", DBUS_TYPE_BOOLEAN,
&dbus_powered);
+ }
- if (powered) {
- if (modem->driver->pre_sim)
- modem->driver->pre_sim(modem);
+ if (powered) {
+ if (modem->driver->pre_sim)
+ modem->driver->pre_sim(modem);
+ }
+ }
+
+ if (powering_down) {
+ modems_remaining -= 1;
+
+ if (modems_remaining == 0)
+ __ofono_exit();
}
}
@@ -1099,6 +1109,9 @@ int ofono_modem_register(struct ofono_modem *modem)
if (modem == NULL)
return -EINVAL;
+ if (powering_down == TRUE)
+ return -EBUSY;
+
if (modem->driver != NULL)
return -EALREADY;
@@ -1246,3 +1259,26 @@ void ofono_modem_driver_unregister(const struct ofono_modem_driver *d)
modem_unregister(modem);
}
}
+
+void __ofono_modem_shutdown()
+{
+ struct ofono_modem *modem;
+ GSList *l;
+
+ powering_down = TRUE;
+
+ for (l = g_modem_list; l; l = l->next) {
+ modem = l->data;
+
+ modem = l->data;
+
+ if (modem->driver == NULL)
+ continue;
+
+ if (modem->powered == FALSE && modem->powered_pending == FALSE)
+ continue;
+
+ if (set_powered(modem, FALSE) == -EINPROGRESS)
+ modems_remaining += 1;
+ }
+}