Re: [MM] [PATCH] iface-modem: schedule signal quality check more often initially

2013-01-18 Thread Aleksander Morgado
On 18/01/13 08:06, Ben Chan wrote:
 This patch modifies MMIfaceModem to schedule the periodic signal quality
 check with a period of 3s instead of 30s (up to 5 periods) initially
 until a non-zero signal quality value is obtained and then switch back
 to the 30s period.
 ---

Merged, thanks!

-- 
Aleksander
___
networkmanager-list mailing list
networkmanager-list@gnome.org
https://mail.gnome.org/mailman/listinfo/networkmanager-list


[MM] [PATCH] iface-modem: schedule signal quality check more often initially

2013-01-17 Thread Ben Chan
This patch modifies MMIfaceModem to schedule the periodic signal quality
check with a period of 3s instead of 30s (up to 5 periods) initially
until a non-zero signal quality value is obtained and then switch back
to the 30s period.
---
 src/mm-iface-modem.c |   36 +---
 1 files changed, 29 insertions(+), 7 deletions(-)

diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c
index be4b70d..edb9b7d 100644
--- a/src/mm-iface-modem.c
+++ b/src/mm-iface-modem.c
@@ -27,9 +27,10 @@
 #include mm-log.h
 #include mm-context.h
 
-#define SIGNAL_QUALITY_RECENT_TIMEOUT_SEC 60
-#define SIGNAL_QUALITY_CHECK_TIMEOUT_SEC  30
-#define ACCESS_TECHNOLOGIES_CHECK_TIMEOUT_SEC 30
+#define SIGNAL_QUALITY_RECENT_TIMEOUT_SEC60
+#define SIGNAL_QUALITY_INITIAL_CHECK_TIMEOUT_SEC 3
+#define SIGNAL_QUALITY_CHECK_TIMEOUT_SEC 30
+#define ACCESS_TECHNOLOGIES_CHECK_TIMEOUT_SEC30
 
 #define STATE_UPDATE_CONTEXT_TAG  state-update-context-tag
 #define SIGNAL_QUALITY_UPDATE_CONTEXT_TAG 
signal-quality-update-context-tag
@@ -996,6 +997,8 @@ mm_iface_modem_update_signal_quality (MMIfaceModem *self,
 /*/
 
 typedef struct {
+guint interval;
+guint initial_retries;
 guint timeout_source;
 gboolean running;
 } SignalQualityCheckContext;
@@ -1008,6 +1011,8 @@ signal_quality_check_context_free 
(SignalQualityCheckContext *ctx)
 g_free (ctx);
 }
 
+static gboolean periodic_signal_quality_check (MMIfaceModem *self);
+
 static void
 signal_quality_check_ready (MMIfaceModem *self,
 GAsyncResult *res)
@@ -1029,8 +1034,20 @@ signal_quality_check_ready (MMIfaceModem *self,
  * mm_iface_modem_shutdown when this function is invoked as a callback of
  * load_signal_quality. */
 ctx = g_object_get_qdata (G_OBJECT (self), 
signal_quality_check_context_quark);
-if (ctx)
+if (ctx) {
+if (ctx-interval == SIGNAL_QUALITY_INITIAL_CHECK_TIMEOUT_SEC 
+(signal_quality != 0 || --ctx-initial_retries == 0)) {
+ctx-interval = SIGNAL_QUALITY_CHECK_TIMEOUT_SEC;
+if (ctx-timeout_source) {
+mm_dbg (Periodic signal quality checks rescheduled (interval 
= %ds), ctx-interval);
+g_source_remove(ctx-timeout_source);
+ctx-timeout_source = g_timeout_add_seconds (ctx-interval,
+ 
(GSourceFunc)periodic_signal_quality_check,
+ self);
+}
+}
 ctx-running = FALSE;
+}
 }
 
 static gboolean
@@ -1043,7 +1060,7 @@ periodic_signal_quality_check (MMIfaceModem *self)
 /* Only launch a new one if not one running already OR if the last one run
  * was more than 15s ago. */
 if (!ctx-running ||
-(time (NULL) - get_last_signal_quality_update_time (self)  15)) {
+(time (NULL) - get_last_signal_quality_update_time (self)  
(ctx-interval / 2))) {
 ctx-running = TRUE;
 MM_IFACE_MODEM_GET_INTERFACE (self)-load_signal_quality (
 self,
@@ -1097,9 +1114,14 @@ periodic_signal_quality_check_enable (MMIfaceModem *self)
 }
 
 /* Create context and keep it as object data */
-mm_dbg (Periodic signal quality checks enabled);
 ctx = g_new0 (SignalQualityCheckContext, 1);
-ctx-timeout_source = g_timeout_add_seconds 
(SIGNAL_QUALITY_CHECK_TIMEOUT_SEC,
+/* Schedule the signal quality check using a shorter period, up to 5
+ * periods, initially until a non-zero signal quality value is obtained
+ * and then switch back to the normal period. */
+ctx-interval = SIGNAL_QUALITY_INITIAL_CHECK_TIMEOUT_SEC;
+ctx-initial_retries = 5;
+mm_dbg (Periodic signal quality checks enabled (interval = %ds), 
ctx-interval);
+ctx-timeout_source = g_timeout_add_seconds (ctx-interval,
  
(GSourceFunc)periodic_signal_quality_check,
  self);
 g_object_set_qdata_full (G_OBJECT (self),
-- 
1.7.7.3

___
networkmanager-list mailing list
networkmanager-list@gnome.org
https://mail.gnome.org/mailman/listinfo/networkmanager-list