Home | History | Annotate | Download | only in base
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "net/base/file_stream_metrics.h"
      6 
      7 #include <windows.h>
      8 
      9 #include "base/basictypes.h"
     10 
     11 namespace net {
     12 
     13 namespace {
     14 
     15 struct Range {
     16   int low;
     17   int high;
     18 };
     19 
     20 // The error range list is extracted from WinError.h.
     21 //
     22 // NOTE: The gaps between the ranges need to be recorded too.
     23 // They will have odd-numbered buckets.
     24 const Range kErrorRangeList[] = {
     25   { 0, 321 },  // 2.
     26   { 335, 371 },  // 4.
     27   { 383, 387 },  // 6.
     28   { 399, 404 },  // etc.
     29   { 415, 418 },
     30   { 431, 433 },
     31   { 447, 868 },
     32   { 994, 1471 },
     33   { 1500, 1513 },
     34   { 1536, 1553 },
     35   { 1601, 1654 },
     36   { 1700, 1834 },
     37   { 1898, 1938 },
     38   { 2000, 2024 },
     39   { 2048, 2085 },
     40   { 2108, 2110 },
     41   { 2202, 2203 },
     42   { 2250, 2251 },
     43   { 2401, 2405 },
     44   { 3000, 3021 },
     45   { 3950, 3951 },
     46   { 4000, 4007 },
     47   { 4050, 4066 },
     48   { 4096, 4116 },
     49   { 4200, 4215 },
     50   { 4300, 4353 },
     51   { 4390, 4395 },
     52   { 4500, 4501 },
     53   { 4864, 4905 },
     54   { 5001, 5090 },
     55   { 5890, 5953 },
     56   { 6000, 6023 },
     57   { 6118, 6119 },
     58   { 6200, 6201 },
     59   { 6600, 6649 },
     60   { 6700, 6732 },
     61   { 6800, 6856 },
     62   { 7001, 7071 },
     63   { 8001, 8018 },
     64   { 8192, 8263 },
     65   { 8301, 8640 },
     66   { 8704, 8705 },
     67   { 8960, 9053 },
     68   { 9216, 9218 },
     69   { 9263, 9276 },
     70   { 9472, 9506 },
     71   { 9550, 9573 },
     72   { 9600, 9622 },
     73   { 9650, 9656 },
     74   { 9688, 9723 },
     75   { 9750, 9754 },
     76   { 9800, 9802 },
     77   { 9850, 9853 },
     78   { 9900, 9907 },
     79   { 10000, 10072 },
     80   { 10091, 10113 },
     81   { 11001, 11034 },
     82   { 12288, 12335 },
     83   { 12544, 12559 },
     84   { 12595, 12597 },
     85   { 12801, 12803 },
     86   { 13000, 13026 },
     87   { 13800, 13933 },
     88   { 14000, 14111 },
     89   { 15000, 15039 },
     90   { 15080, 15086 },
     91   { 15100, 15109 },
     92   { 15200, 15208 },
     93   { 15250, 15251 },
     94   { 15299, 15302 },
     95   { 16385, 16436 },
     96   { 18432, 18454 },
     97   { 20480, 20486 },
     98   { 24577, 24607 },
     99   { 28673, 28698 },
    100   { 32790, 32816 },
    101   { 33281, 33322 },
    102   { 35005, 35024 },
    103   { 36000, 36004 },
    104   { 40010, 40011 },
    105   { 40067, 40069 },
    106   { 53248, 53293 },
    107   { 53376, 53382 },
    108   { 57344, 57360 },
    109   { 57377, 57394 },
    110   { 65535, 65536 }  // 2 * kNumErrorRanges.
    111 };
    112 const size_t kNumErrorRanges = ARRAYSIZE_UNSAFE(kErrorRangeList);
    113 
    114 }  // namespace
    115 
    116 // Windows has very many errors.  We're not interested in most of them, but we
    117 // don't know which ones are significant.
    118 // This function maps error ranges to specific buckets.
    119 // If we get hits on the buckets, we can add those values to the values we
    120 // record individually.
    121 // If we get values *between* the buckets, we record those as buckets too.
    122 int GetFileErrorUmaBucket(int error) {
    123   error = HRESULT_CODE(error);
    124 
    125   // This is a linear search, but of a short fixed-size array.
    126   // It also gets called infrequently, on errors.
    127   for (size_t n = 0; n < kNumErrorRanges; ++n) {
    128     if (error < kErrorRangeList[n].low)
    129       return (2 * (n + 1)) - 1;  // In gap before the range.
    130     if (error <= kErrorRangeList[n].high)
    131       return 2 * (n + 1);  // In the range.
    132   }
    133 
    134   // After the last bucket.
    135   return 2 * kNumErrorRanges + 1;
    136 }
    137 
    138 int MaxFileErrorUmaBucket() {
    139   return 2 * kNumErrorRanges + 2;
    140 }
    141 
    142 int MaxFileErrorUmaValue() {
    143   return kErrorRangeList[0].high + 1;
    144 }
    145 
    146 }  // namespace net
    147