Merge ~alfonsosanchezbeato/snappy-hwe-snaps/+git/modem-manager:fix-plano-crash into ~snappy-hwe-team/snappy-hwe-snaps/+git/modem-manager:modem-manager/1.8.0

Proposed by Alfonso Sanchez-Beato
Status: Merged
Approved by: Konrad Zapałowicz
Approved revision: 7ede4575db5c5114dd858c9491a557db4d44e41e
Merged at revision: 7ede4575db5c5114dd858c9491a557db4d44e41e
Proposed branch: ~alfonsosanchezbeato/snappy-hwe-snaps/+git/modem-manager:fix-plano-crash
Merge into: ~snappy-hwe-team/snappy-hwe-snaps/+git/modem-manager:modem-manager/1.8.0
Diff against target: 175 lines (+38/-36)
1 file modified
plugins/plano/mm-broadband-modem-plano.c (+38/-36)
Reviewer Review Type Date Requested Status
Konrad Zapałowicz (community) code Approve
System Enablement Bot continuous-integration Needs Fixing
Review via email: mp+357948@code.launchpad.net

Description of the change

plano: override load_power_state_finish

Override load_power_state_finish and use GTask in the plugin. This way
we avoid a crash that happened because we were using GSimpleAsyncResult
in load_power_state while using load_power_state_finish from the parent
class, which had switched to GTask in latest MM. Fixes LP: #1800113.

To post a comment you must log in.
Revision history for this message
System Enablement Bot (system-enablement-ci-bot) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Konrad Zapałowicz (kzapalowicz) wrote :

ack

review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/plugins/plano/mm-broadband-modem-plano.c b/plugins/plano/mm-broadband-modem-plano.c
2index 6abb6ea..05d2291 100644
3--- a/plugins/plano/mm-broadband-modem-plano.c
4+++ b/plugins/plano/mm-broadband-modem-plano.c
5@@ -53,15 +53,31 @@ do_nothing_cb (GObject *source_object,
6 }
7
8 /*****************************************************************************/
9-/* Power state loading (Modem interface) */
10+/* Power state loading (Modem interface) - workaround to wait for SIM */
11+
12+static MMModemPowerState
13+load_power_state_finish (MMIfaceModem *self,
14+ GAsyncResult *res,
15+ GError **error)
16+{
17+ GError *inner_error = NULL;
18+ gssize value;
19+
20+ value = g_task_propagate_int (G_TASK (res), &inner_error);
21+ if (inner_error) {
22+ g_propagate_error (error, inner_error);
23+ return MM_MODEM_POWER_STATE_UNKNOWN;
24+ }
25+ return (MMModemPowerState)value;
26+}
27
28 static gboolean
29 complete_cfun (gpointer user_data)
30 {
31- GSimpleAsyncResult *simple = user_data;
32+ GTask *task = user_data;
33
34- g_simple_async_result_complete (simple);
35- g_object_unref (simple);
36+ g_task_return_int (task, MM_MODEM_POWER_STATE_ON);
37+ g_object_unref (task);
38
39 return FALSE;
40 }
41@@ -69,25 +85,22 @@ complete_cfun (gpointer user_data)
42 static void
43 modem_ready (MMBaseModem *self,
44 GAsyncResult *res,
45- GSimpleAsyncResult *simple)
46+ GTask *task)
47 {
48 const gchar *response;
49 GError *error = NULL;
50
51 response = mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, &error);
52 if (!response) {
53- g_simple_async_result_take_error (simple, error);
54- g_simple_async_result_complete (simple);
55- g_object_unref (simple);
56+ g_task_return_error (task, error);
57+ g_object_unref (task);
58 return;
59 }
60
61- g_simple_async_result_set_op_res_gpointer (simple, GUINT_TO_POINTER (MM_MODEM_POWER_STATE_ON), NULL);
62-
63 /* If we access the SIM immediately after powering up we get an error, we
64 * need to wait a bit to make sure we can access it.
65 */
66- g_timeout_add_seconds (2, complete_cfun, simple);
67+ g_timeout_add_seconds (2, complete_cfun, task);
68 }
69
70 static void
71@@ -95,12 +108,9 @@ load_power_state (MMIfaceModem *self,
72 GAsyncReadyCallback callback,
73 gpointer user_data)
74 {
75- GSimpleAsyncResult *result;
76+ GTask *task;
77
78- result = g_simple_async_result_new (G_OBJECT (self),
79- callback,
80- user_data,
81- load_power_state);
82+ task = g_task_new (self, NULL, callback, user_data);
83
84 /* Instead of asking for the current power state, we turn it on so we can
85 * access the SIM when initializing. MM will switch the state back to the
86@@ -111,7 +121,7 @@ load_power_state (MMIfaceModem *self,
87 6,
88 FALSE,
89 (GAsyncReadyCallback)modem_ready,
90- result);
91+ task);
92 }
93
94 /*****************************************************************************/
95@@ -231,7 +241,6 @@ modem_create_bearer_finish (MMIfaceModem *self,
96 GAsyncResult *res,
97 GError **error)
98 {
99- MMBaseBearer *bearer;
100 unsigned pid;
101
102 pid = get_uint_property (G_OBJECT (self), MM_BASE_MODEM_PRODUCT_ID);
103@@ -239,29 +248,24 @@ modem_create_bearer_finish (MMIfaceModem *self,
104 if (pid == PID_PLANO_HE910)
105 return iface_modem_parent->create_bearer_finish (self, res, error);
106
107- bearer = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res));
108- mm_dbg ("New Plano bearer created at DBus path '%s'", mm_base_bearer_get_path (bearer));
109-
110- return g_object_ref (bearer);
111+ return g_task_propagate_pointer (G_TASK (res), error);
112 }
113
114 static void
115 broadband_bearer_plano_new_ready (GObject *source,
116- GAsyncResult *res,
117- GSimpleAsyncResult *simple)
118+ GAsyncResult *res,
119+ GTask *task)
120 {
121 MMBaseBearer *bearer = NULL;
122 GError *error = NULL;
123
124 bearer = mm_broadband_bearer_plano_new_finish (res, &error);
125 if (!bearer)
126- g_simple_async_result_take_error (simple, error);
127+ g_task_return_error (task, error);
128 else
129- g_simple_async_result_set_op_res_gpointer (simple,
130- bearer,
131- (GDestroyNotify)g_object_unref);
132- g_simple_async_result_complete (simple);
133- g_object_unref (simple);
134+ g_task_return_pointer (task, bearer, g_object_unref);
135+
136+ g_object_unref (task);
137 }
138
139 static void
140@@ -270,7 +274,7 @@ modem_create_bearer (MMIfaceModem *self,
141 GAsyncReadyCallback callback,
142 gpointer user_data)
143 {
144- GSimpleAsyncResult *result;
145+ GTask *task;
146 unsigned vid, pid;
147
148 vid = get_uint_property (G_OBJECT (self), MM_BASE_MODEM_VENDOR_ID);
149@@ -283,16 +287,13 @@ modem_create_bearer (MMIfaceModem *self,
150 return;
151 }
152
153- result = g_simple_async_result_new (G_OBJECT (self),
154- callback,
155- user_data,
156- modem_create_bearer);
157+ task = g_task_new (self, NULL, callback, user_data);
158
159 mm_broadband_bearer_plano_new (MM_BROADBAND_MODEM (self),
160 properties,
161 NULL, /* cancellable */
162 (GAsyncReadyCallback)broadband_bearer_plano_new_ready,
163- result);
164+ task);
165 }
166
167 /*****************************************************************************/
168@@ -324,6 +325,7 @@ iface_modem_init (MMIfaceModem *iface)
169 iface_modem_parent = g_type_interface_peek_parent (iface);
170
171 iface->load_power_state = load_power_state;
172+ iface->load_power_state_finish = load_power_state_finish;
173
174 /* Disable AT commands that return errors after +CFUN=1 */
175 iface->setup_flow_control = NULL;

Subscribers

People subscribed via source and target branches