Keep start/stop state of statistic timers
authorDaniel Wagner <daniel.wagner@bmw-carit.de>
Fri, 9 Jul 2010 08:10:09 +0000 (10:10 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Fri, 9 Jul 2010 08:14:03 +0000 (05:14 -0300)
When starting a ethernet device the sequence of the
device state (UP, LOWER_UP) from RTNL is different then
by a WiFi device.

For an ethernet device the entering UP and LOWER_UP
arrives together. Whereas for WiFi device we get
a entering UP and leaving LOWER_UP. This results in
a call on lower_down first.

Unfortunatly, the stats_start and stats_stop should
be called in the right order. This fix tracks the
statistics enabled/disabled state.

src/service.c

index c76a9ee..af8f2c4 100644 (file)
@@ -38,6 +38,7 @@ static GHashTable *service_hash = NULL;
 
 struct connman_stats {
        connman_bool_t valid;
+       connman_bool_t enabled;
        unsigned int rx_packets_last;
        unsigned int tx_packets_last;
        unsigned int rx_packets;
@@ -380,6 +381,8 @@ static void __connman_service_stats_start(struct connman_service *service)
        if (service->stats.timer == NULL)
                return;
 
+       service->stats.enabled = TRUE;
+
        service->stats.time_start = service->stats.time;
 
        g_timer_start(service->stats.timer);
@@ -396,12 +399,17 @@ static void __connman_service_stats_stop(struct connman_service *service)
        if (service->stats.timer == NULL)
                return;
 
+       if (service->stats.enabled == FALSE)
+               return;
+
        __connman_counter_remove_service(service);
 
        g_timer_stop(service->stats.timer);
 
        seconds = g_timer_elapsed(service->stats.timer, NULL);
        service->stats.time = service->stats.time_start + seconds;
+
+       service->stats.enabled = FALSE;
 }
 
 static int __connman_service_stats_load(struct connman_service *service,
@@ -1843,6 +1851,7 @@ static void __connman_service_initialize(struct connman_service *service)
        service->order = 0;
 
        service->stats.valid = FALSE;
+       service->stats.enabled = FALSE;
        service->stats.timer = g_timer_new();
 }