Submitted a revised patch.

On Mon, Jan 21, 2013 at 8:39 PM, Ben Chan <benc...@chromium.org> wrote:

> There may be better ways to collect this kind of performance data than
> outputting them to ModemManager log. Is there a commonly used method
> for ModemManager to report performance metrics in a way that other tools
> can collect and analyze them?
>
> - Ben
>
>
> On Mon, Jan 21, 2013 at 8:30 PM, Ben Chan <benc...@chromium.org> wrote:
>
>> This patch logs the time taken for succeeded initialization, enabling,
>> disabling, connection, and disconnection operations, which helps
>> evaluate how to optimize modem plugins.
>> ---
>>  libmm-glib/mm-common-helpers.c |    7 +++++++
>>  libmm-glib/mm-common-helpers.h |    2 ++
>>  src/mm-iface-modem-simple.c    |   18 +++++++++++++++++-
>>  src/mm-iface-modem.c           |   24 ++++++++++++++++++++++++
>>  4 files changed, 50 insertions(+), 1 deletions(-)
>>
>> diff --git a/libmm-glib/mm-common-helpers.c
>> b/libmm-glib/mm-common-helpers.c
>> index 3f100b6..406a99a 100644
>> --- a/libmm-glib/mm-common-helpers.c
>> +++ b/libmm-glib/mm-common-helpers.c
>> @@ -960,3 +960,10 @@ mm_utils_check_for_single_value (guint32 value)
>>
>>      return TRUE;
>>  }
>> +
>> +gdouble
>> +mm_utils_subtract_time (const GTimeVal *end_time, const GTimeVal
>> *start_time)
>> +{
>> +    return (end_time->tv_sec - start_time->tv_sec) +
>> +           (end_time->tv_usec - start_time->tv_usec) / 1.0e6;
>> +}
>> diff --git a/libmm-glib/mm-common-helpers.h
>> b/libmm-glib/mm-common-helpers.h
>> index 6155b58..42bbe20 100644
>> --- a/libmm-glib/mm-common-helpers.h
>> +++ b/libmm-glib/mm-common-helpers.h
>> @@ -102,4 +102,6 @@ gchar    *mm_utils_bin2hexstr (const guint8 *bin,
>> gsize len);
>>
>>  gboolean  mm_utils_check_for_single_value (guint32 value);
>>
>> +gdouble mm_utils_subtract_time (const GTimeVal *end_time, const GTimeVal
>> *start_time);
>> +
>>  #endif /* MM_COMMON_HELPERS_H */
>> diff --git a/src/mm-iface-modem-simple.c b/src/mm-iface-modem-simple.c
>> index 12aa152..b0bcf46 100644
>> --- a/src/mm-iface-modem-simple.c
>> +++ b/src/mm-iface-modem-simple.c
>> @@ -196,6 +196,8 @@ typedef struct {
>>
>>      /* Results to set */
>>      MMBearer *bearer;
>> +
>> +    GTimeVal start_time;
>>  } ConnectionContext;
>>
>>  static void
>> @@ -203,7 +205,6 @@ connection_context_free (ConnectionContext *ctx)
>>  {
>>      g_assert (ctx->state_changed_id == 0);
>>      g_assert (ctx->state_changed_wait_id == 0);
>> -
>>      g_variant_unref (ctx->dictionary);
>>      if (ctx->properties)
>>          g_object_unref (ctx->properties);
>> @@ -516,6 +517,8 @@ bearer_list_find_disconnected (MMBearer *bearer,
>>  static void
>>  connection_step (ConnectionContext *ctx)
>>  {
>> +    GTimeVal end_time;
>> +
>>      switch (ctx->step) {
>>      case CONNECTION_STEP_FIRST:
>>          /* Fall down to next step */
>> @@ -738,6 +741,9 @@ connection_step (ConnectionContext *ctx)
>>      case CONNECTION_STEP_LAST:
>>          mm_info ("Simple connect state (%d/%d): All done",
>>                   ctx->step, CONNECTION_STEP_LAST);
>> +        g_get_current_time (&end_time);
>> +        mm_info ("Connection steps took %.3f second(s).",
>> +                 mm_utils_subtract_time (&end_time, &ctx->start_time));
>>          /* All done, yey! */
>>          mm_gdbus_modem_simple_complete_connect (
>>              ctx->skeleton,
>> @@ -828,6 +834,7 @@ handle_connect (MmGdbusModemSimple *skeleton,
>>      ctx->invocation = g_object_ref (invocation);
>>      ctx->self = g_object_ref (self);
>>      ctx->dictionary = g_variant_ref (dictionary);
>> +    g_get_current_time (&ctx->start_time);
>>
>>      mm_base_modem_authorize (MM_BASE_MODEM (self),
>>                               invocation,
>> @@ -846,6 +853,7 @@ typedef struct {
>>      gchar *bearer_path;
>>      GList *bearers;
>>      MMBearer *current;
>> +    GTimeVal start_time;
>>  } DisconnectionContext;
>>
>>  static void
>> @@ -887,6 +895,12 @@ disconnect_next_bearer (DisconnectionContext *ctx)
>>
>>      /* No more bearers? all done! */
>>      if (!ctx->bearers) {
>> +        GTimeVal end_time;
>> +
>> +        g_get_current_time (&end_time);
>> +        mm_info ("Disconnection steps took %.3f second(s).",
>> +                 mm_utils_subtract_time (&end_time, &ctx->start_time));
>> +
>>          mm_gdbus_modem_simple_complete_disconnect (ctx->skeleton,
>>                                                     ctx->invocation);
>>          disconnection_context_free (ctx);
>> @@ -977,6 +991,8 @@ handle_disconnect (MmGdbusModemSimple *skeleton,
>>          ctx->bearer_path = g_strdup (ctx->bearer_path);
>>      }
>>
>> +    g_get_current_time (&ctx->start_time);
>> +
>>      mm_base_modem_authorize (MM_BASE_MODEM (self),
>>                               invocation,
>>                               MM_AUTHORIZATION_DEVICE_CONTROL,
>> diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c
>> index 6b812e2..2edbcf4 100644
>> --- a/src/mm-iface-modem.c
>> +++ b/src/mm-iface-modem.c
>> @@ -2911,6 +2911,7 @@ struct _DisablingContext {
>>      MMModemState previous_state;
>>      GSimpleAsyncResult *result;
>>      MmGdbusModem *skeleton;
>> +    GTimeVal start_time;
>>  };
>>
>>  static void
>> @@ -2935,6 +2936,8 @@ mm_iface_modem_disable_finish (MMIfaceModem *self,
>>  static void
>>  interface_disabling_step (DisablingContext *ctx)
>>  {
>> +    GTimeVal end_time;
>> +
>>      switch (ctx->step) {
>>      case DISABLING_STEP_FIRST:
>>          /* Fall down to next step */
>> @@ -2954,6 +2957,10 @@ interface_disabling_step (DisablingContext *ctx)
>>          ctx->step++;
>>
>>      case DISABLING_STEP_LAST:
>> +        g_get_current_time (&end_time);
>> +        mm_info ("Disabling steps took %.3f second(s).",
>> +                 mm_utils_subtract_time (&end_time, &ctx->start_time));
>> +
>>          /* We are done without errors! */
>>          g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
>>          disabling_context_complete_and_free (ctx);
>> @@ -2977,6 +2984,7 @@ mm_iface_modem_disable (MMIfaceModem *self,
>>                                               user_data,
>>                                               mm_iface_modem_disable);
>>      ctx->step = DISABLING_STEP_FIRST;
>> +    g_get_current_time (&ctx->start_time);
>>      g_object_get (ctx->self,
>>                    MM_IFACE_MODEM_DBUS_SKELETON, &ctx->skeleton,
>>                    MM_IFACE_MODEM_STATE, &ctx->previous_state,
>> @@ -3019,6 +3027,7 @@ struct _EnablingContext {
>>      GSimpleAsyncResult *result;
>>      GCancellable *cancellable;
>>      MmGdbusModem *skeleton;
>> +    GTimeVal start_time;
>>  };
>>
>>  static void
>> @@ -3220,6 +3229,8 @@ static const MMModemCharset best_charsets[] = {
>>  static void
>>  interface_enabling_step (EnablingContext *ctx)
>>  {
>> +    GTimeVal end_time;
>> +
>>      /* Don't run new steps if we're cancelled */
>>      if (enabling_context_complete_and_free_if_cancelled (ctx))
>>          return;
>> @@ -3345,6 +3356,10 @@ interface_enabling_step (EnablingContext *ctx)
>>          ctx->step++;
>>
>>      case ENABLING_STEP_LAST:
>> +        g_get_current_time (&end_time);
>> +        mm_info ("Enabling steps took %.3f second(s).",
>> +                 mm_utils_subtract_time (&end_time, &ctx->start_time));
>> +
>>          /* We are done without errors! */
>>          g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
>>          enabling_context_complete_and_free (ctx);
>> @@ -3370,6 +3385,7 @@ mm_iface_modem_enable (MMIfaceModem *self,
>>                                               user_data,
>>                                               mm_iface_modem_enable);
>>      ctx->step = ENABLING_STEP_FIRST;
>> +    g_get_current_time (&ctx->start_time);
>>      g_object_get (ctx->self,
>>                    MM_IFACE_MODEM_DBUS_SKELETON, &ctx->skeleton,
>>                    NULL);
>> @@ -3417,6 +3433,7 @@ struct _InitializationContext {
>>      GCancellable *cancellable;
>>      MmGdbusModem *skeleton;
>>      GError *fatal_error;
>> +    GTimeVal start_time;
>>  };
>>
>>  static void
>> @@ -4000,6 +4017,12 @@ interface_initialization_step
>> (InitializationContext *ctx)
>>              g_simple_async_result_take_error (ctx->result,
>> ctx->fatal_error);
>>              ctx->fatal_error = NULL;
>>          } else {
>> +            GTimeVal end_time;
>> +
>> +            g_get_current_time (&end_time);
>> +            mm_info ("Initialization steps took %.3f second(s).",
>> +                     mm_utils_subtract_time (&end_time,
>> &ctx->start_time));
>> +
>>              /* We are done without errors!
>>               * Handle method invocations */
>>              g_signal_connect (ctx->skeleton,
>> @@ -4127,6 +4150,7 @@ mm_iface_modem_initialize (MMIfaceModem *self,
>>                                               mm_iface_modem_initialize);
>>      ctx->step = INITIALIZATION_STEP_FIRST;
>>      ctx->skeleton = skeleton;
>> +    g_get_current_time (&ctx->start_time);
>>
>>      interface_initialization_step (ctx);
>>  }
>> --
>> 1.7.7.3
>>
>>
>
_______________________________________________
networkmanager-list mailing list
networkmanager-list@gnome.org
https://mail.gnome.org/mailman/listinfo/networkmanager-list

Reply via email to