]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/netinet/in_stat.c
xnu-6153.41.3.tar.gz
[apple/xnu.git] / bsd / netinet / in_stat.c
index c7f36defbacca59762d1a80b4c35693b6d7cdbea..c47255185672fee81014426fbf0b64882558e8a0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017 Apple Inc. All rights reserved.
+ * Copyright (c) 2017-2018 Apple Inc. All rights reserved.
  *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  *
 
 #include <netinet/in_stat.h>
 
-#define        IN_STAT_ACTIVITY_GRANULARITY            8       /* 8 sec granularity */
-#define        IN_STAT_ACTIVITY_TIME_SEC_SHIFT         3       /* 8 sec per bit */
-#define        IN_STAT_ACTIVITY_BITMAP_TOTAL_SIZE      ((uint64_t) 128)
-#define        IN_STAT_ACTIVITY_BITMAP_FIELD_SIZE      ((uint64_t) 64)
-#define        IN_STAT_ACTIVITY_TOTAL_TIME             ((uint64_t) (8 * 128))
-#define        IN_STAT_SET_MOST_SIGNIFICANT_BIT        ((u_int64_t )0x8000000000000000)
+#define IN_STAT_ACTIVITY_GRANULARITY            8       /* 8 sec granularity */
+#define IN_STAT_ACTIVITY_TIME_SEC_SHIFT         3       /* 8 sec per bit */
+#define IN_STAT_ACTIVITY_BITMAP_TOTAL_SIZE      ((uint64_t) 128)
+#define IN_STAT_ACTIVITY_BITMAP_FIELD_SIZE      ((uint64_t) 64)
+#define IN_STAT_ACTIVITY_TOTAL_TIME             ((uint64_t) (8 * 128))
+#define IN_STAT_SET_MOST_SIGNIFICANT_BIT        ((u_int64_t )0x8000000000000000)
 
 void
 in_stat_set_activity_bitmap(activity_bitmap_t *activity, uint64_t now)
 {
        uint64_t elapsed_time, slot;
        uint64_t *bitmap;
-       if (activity->start == 0)
-               activity->start = now;
+       if (activity->start == 0) {
+               // Align all activity maps
+               activity->start = now - (now % IN_STAT_ACTIVITY_GRANULARITY);
+       }
        elapsed_time = now - activity->start;
 
        slot = elapsed_time >> IN_STAT_ACTIVITY_TIME_SEC_SHIFT;
@@ -70,10 +72,11 @@ in_stat_set_activity_bitmap(activity_bitmap_t *activity, uint64_t now)
                                activity->bitmap[0] = activity->bitmap[1];
                                activity->bitmap[1] = 0;
                                shift -= IN_STAT_ACTIVITY_BITMAP_FIELD_SIZE;
-                               if (shift == IN_STAT_ACTIVITY_BITMAP_FIELD_SIZE)
+                               if (shift == IN_STAT_ACTIVITY_BITMAP_FIELD_SIZE) {
                                        activity->bitmap[0] = 0;
-                               else
+                               } else {
                                        activity->bitmap[0] >>= shift;
+                               }
                        } else {
                                uint64_t mask_lower, tmp;
                                uint64_t b1_low, b0_high;
@@ -89,7 +92,7 @@ in_stat_set_activity_bitmap(activity_bitmap_t *activity, uint64_t now)
 
                                b0_high = (b1_low <<
                                    (IN_STAT_ACTIVITY_BITMAP_FIELD_SIZE -
-                                    shift));
+                                   shift));
                                activity->bitmap[0] |= b0_high;
                                activity->bitmap[1] >>= shift;
                        }