aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mm-iface-modem.c110
1 files changed, 60 insertions, 50 deletions
diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c
index a4328fa9..a6199e0b 100644
--- a/src/mm-iface-modem.c
+++ b/src/mm-iface-modem.c
@@ -42,17 +42,51 @@
#define SIGNAL_CHECK_INITIAL_TIMEOUT_SEC 3
#define SIGNAL_CHECK_TIMEOUT_SEC 30
-#define STATE_UPDATE_CONTEXT_TAG "state-update-context-tag"
#define SIGNAL_QUALITY_UPDATE_CONTEXT_TAG "signal-quality-update-context-tag"
#define SIGNAL_CHECK_CONTEXT_TAG "signal-check-context-tag"
#define RESTART_INITIALIZE_IDLE_TAG "restart-initialize-tag"
-static GQuark state_update_context_quark;
static GQuark signal_quality_update_context_quark;
static GQuark signal_check_context_quark;
static GQuark restart_initialize_idle_quark;
/*****************************************************************************/
+/* Private data context */
+
+#define PRIVATE_TAG "modem-private-tag"
+static GQuark private_quark;
+
+typedef struct {
+ /* Subsystem specific states */
+ GArray *subsystem_states;
+} Private;
+
+static void
+private_free (Private *priv)
+{
+ if (priv->subsystem_states)
+ g_array_unref (priv->subsystem_states);
+ g_slice_free (Private, priv);
+}
+
+static Private *
+get_private (MMIfaceModem *self)
+{
+ Private *priv;
+
+ if (G_UNLIKELY (!private_quark))
+ private_quark = g_quark_from_static_string (PRIVATE_TAG);
+
+ priv = g_object_get_qdata (G_OBJECT (self), private_quark);
+ if (!priv) {
+ priv = g_slice_new0 (Private);
+ g_object_set_qdata_full (G_OBJECT (self), private_quark, priv, (GDestroyNotify)private_free);
+ }
+
+ return priv;
+}
+
+/*****************************************************************************/
gboolean
mm_iface_modem_check_for_sim_swap_finish (MMIfaceModem *self,
@@ -1982,23 +2016,14 @@ mm_iface_modem_update_failed_state (MMIfaceModem *self,
/*****************************************************************************/
typedef struct {
- gchar *subsystem;
- MMModemState state;
+ gchar *subsystem;
+ MMModemState state;
} SubsystemState;
static void
-subsystem_state_array_free (GArray *array)
+subsystem_state_clear (SubsystemState *s)
{
- guint i;
-
- for (i = 0; i < array->len; i++) {
- SubsystemState *s;
-
- s = &g_array_index (array, SubsystemState, i);
- g_free (s->subsystem);
- }
-
- g_array_free (array, TRUE);
+ g_free (s->subsystem);
}
static MMModemState
@@ -2007,27 +2032,22 @@ get_consolidated_subsystem_state (MMIfaceModem *self)
/* Use as initial state ENABLED, which is the minimum one expected. Do not
* use the old modem state as initial state, as that would disallow reporting
* e.g. ENABLED if the old state was REGISTERED (as ENABLED < REGISTERED). */
- MMModemState consolidated = MM_MODEM_STATE_ENABLED;
- GArray *subsystem_states;
+ MMModemState consolidated = MM_MODEM_STATE_ENABLED;
+ Private *priv;
- if (G_UNLIKELY (!state_update_context_quark))
- state_update_context_quark = (g_quark_from_static_string (
- STATE_UPDATE_CONTEXT_TAG));
-
- subsystem_states = g_object_get_qdata (G_OBJECT (self),
- state_update_context_quark);
+ priv = get_private (self);
/* Build consolidated state, expected fixes are:
* - Enabled (meaning unregistered) --> Searching|Registered
* - Searching --> Registered
*/
- if (subsystem_states) {
+ if (priv->subsystem_states) {
guint i;
- for (i = 0; i < subsystem_states->len; i++) {
+ for (i = 0; i < priv->subsystem_states->len; i++) {
SubsystemState *s;
- s = &g_array_index (subsystem_states, SubsystemState, i);
+ s = &g_array_index (priv->subsystem_states, SubsystemState, i);
if (s->state > consolidated)
consolidated = s->state;
}
@@ -2038,12 +2058,14 @@ get_consolidated_subsystem_state (MMIfaceModem *self)
static MMModemState
get_updated_consolidated_state (MMIfaceModem *self,
- MMModemState modem_state,
- const gchar *subsystem,
- MMModemState subsystem_state)
+ MMModemState modem_state,
+ const gchar *subsystem,
+ MMModemState subsystem_state)
{
- guint i;
- GArray *subsystem_states;
+ guint i;
+ Private *priv;
+
+ priv = get_private (self);
/* Reported subsystem states will be REGISTRATION-related. This means
* that we would only expect a subset of the states being reported for
@@ -2052,28 +2074,16 @@ get_updated_consolidated_state (MMIfaceModem *self,
subsystem_state == MM_MODEM_STATE_SEARCHING ||
subsystem_state == MM_MODEM_STATE_REGISTERED);
- if (G_UNLIKELY (!state_update_context_quark))
- state_update_context_quark = (g_quark_from_static_string (
- STATE_UPDATE_CONTEXT_TAG));
-
- subsystem_states = g_object_get_qdata (G_OBJECT (self),
- state_update_context_quark);
- if (!subsystem_states) {
- subsystem_states = g_array_sized_new (FALSE,
- FALSE,
- sizeof (SubsystemState),
- 2);
- g_object_set_qdata_full (G_OBJECT (self),
- state_update_context_quark,
- subsystem_states,
- (GDestroyNotify)subsystem_state_array_free);
+ if (!priv->subsystem_states) {
+ priv->subsystem_states = g_array_sized_new (FALSE, FALSE, sizeof (SubsystemState), 2);
+ g_array_set_clear_func (priv->subsystem_states, (GDestroyNotify)subsystem_state_clear);
}
/* Store new subsystem state */
- for (i = 0; i < subsystem_states->len; i++) {
+ for (i = 0; i < priv->subsystem_states->len; i++) {
SubsystemState *s;
- s = &g_array_index (subsystem_states, SubsystemState, i);
+ s = &g_array_index (priv->subsystem_states, SubsystemState, i);
if (g_str_equal (s->subsystem, subsystem)) {
s->state = subsystem_state;
break;
@@ -2081,13 +2091,13 @@ get_updated_consolidated_state (MMIfaceModem *self,
}
/* If not found, insert new element */
- if (i == subsystem_states->len) {
+ if (i == priv->subsystem_states->len) {
SubsystemState s;
mm_obj_dbg (self, "will start keeping track of state for subsystem '%s'", subsystem);
s.subsystem = g_strdup (subsystem);
s.state = subsystem_state;
- g_array_append_val (subsystem_states, s);
+ g_array_append_val (priv->subsystem_states, s);
}
return get_consolidated_subsystem_state (self);