Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 bool record_individually; | |
| 19 }; | |
| 20 | |
| 21 // This must be higher than the largest value that isn't remapped into a bucket. | |
| 22 int kErrorBucketStart = 400; | |
| 23 | |
| 24 Range kErrorRangeList[] = { | |
|
cbentzel
2011/08/23 01:52:02
I'll talk with you in person, but I still don't un
cbentzel
2011/08/30 14:48:23
After chatting, I understand the need for gaps.
I
ahendrickson
2011/08/31 19:39:52
Done.
| |
| 25 { 0, 321, true }, // These are the ones we don't remap into buckets. | |
| 26 { 335, 371, false }, | |
| 27 { 383, 387, false }, | |
| 28 { 399, 404, false }, | |
| 29 { 415, 418, false }, | |
| 30 { 431, 433, false }, | |
| 31 { 447, 868, false }, | |
| 32 { 994, 1471, false }, | |
| 33 { 1500, 1513, false }, | |
| 34 { 1536, 1553, false }, | |
| 35 { 1601, 1654, false }, | |
| 36 { 1700, 1834, false }, | |
| 37 { 1898, 1938, false }, | |
| 38 { 2000, 2024, false }, | |
| 39 { 2048, 2085, false }, | |
| 40 { 2108, 2110, false }, | |
| 41 { 2202, 2203, false }, | |
| 42 { 2250, 2251, false }, | |
| 43 { 2401, 2405, false }, | |
| 44 { 3000, 3021, false }, | |
| 45 { 3950, 3951, false }, | |
| 46 { 4000, 4007, false }, | |
| 47 { 4050, 4066, false }, | |
| 48 { 4096, 4116, false }, | |
| 49 { 4200, 4215, false }, | |
| 50 { 4300, 4353, false }, | |
| 51 { 4390, 4395, false }, | |
| 52 { 4500, 4501, false }, | |
| 53 { 4864, 4905, false }, | |
| 54 { 5001, 5090, false }, | |
| 55 { 5890, 5953, false }, | |
| 56 { 6000, 6023, false }, | |
| 57 { 6118, 6119, false }, | |
| 58 { 6200, 6201, false }, | |
| 59 { 6600, 6649, false }, | |
| 60 { 6700, 6732, false }, | |
| 61 { 6800, 6856, false }, | |
| 62 { 7001, 7071, false }, | |
| 63 { 8001, 8018, false }, | |
| 64 { 8192, 8263, false }, | |
| 65 { 8301, 8640, false }, | |
| 66 { 8704, 8705, false }, | |
| 67 { 8960, 9053, false }, | |
| 68 { 9216, 9218, false }, | |
| 69 { 9263, 9276, false }, | |
| 70 { 9472, 9506, false }, | |
| 71 { 9550, 9573, false }, | |
| 72 { 9600, 9622, false }, | |
| 73 { 9650, 9656, false }, | |
| 74 { 9688, 9723, false }, | |
| 75 { 9750, 9754, false }, | |
| 76 { 9800, 9802, false }, | |
| 77 { 9850, 9853, false }, | |
| 78 { 9900, 9907, false }, | |
| 79 { 10000, 10072, false }, | |
| 80 { 10091, 10113, false }, | |
| 81 { 11001, 11034, false }, | |
| 82 { 12288, 12335, false }, | |
| 83 { 12544, 12559, false }, | |
| 84 { 12595, 12597, false }, | |
| 85 { 12801, 12803, false }, | |
| 86 { 13000, 13026, false }, | |
| 87 { 13800, 13933, false }, | |
| 88 { 14000, 14111, false }, | |
| 89 { 15000, 15039, false }, | |
| 90 { 15080, 15086, false }, | |
| 91 { 15100, 15109, false }, | |
| 92 { 15200, 15208, false }, | |
| 93 { 15250, 15251, false }, | |
| 94 { 15299, 15302, false }, | |
| 95 { 16385, 16436, false }, | |
| 96 { 18432, 18454, false }, | |
| 97 { 20480, 20486, false }, | |
| 98 { 24577, 24607, false }, | |
| 99 { 28673, 28698, false }, | |
| 100 { 32790, 32816, false }, | |
| 101 { 33281, 33322, false }, | |
| 102 { 35005, 35024, false }, | |
| 103 { 36000, 36004, false }, | |
| 104 { 40010, 40011, false }, | |
| 105 { 40067, 40069, false }, | |
| 106 { 53248, 53293, false }, | |
| 107 { 53376, 53382, false }, | |
| 108 { 57344, 57360, false }, | |
| 109 { 57377, 57394, false }, | |
| 110 { 65535, 65536 } | |
| 111 }; | |
| 112 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 we think we don't care about to specific | |
| 119 // buckets, and leaves the others alone. If we get hits on the buckets, | |
| 120 // we can add those values to the values we leave alone. | |
| 121 // If we get values *between* the buckets, we record those as buckets too. | |
| 122 // The range list is extracted from WinError.h. | |
| 123 int GetErrorBucket(int error) { | |
| 124 error = HRESULT_CODE(error); | |
| 125 | |
| 126 for (size_t n = 0; n < kNumErrorRanges; ++n) { | |
|
cbentzel
2011/08/30 14:48:23
I'm fine with this being a linear search, given ho
ahendrickson
2011/08/31 19:39:52
Done.
| |
| 127 if (error < kErrorRangeList[n].low) | |
| 128 return (2 * n) - 1; // In gap before the range. | |
| 129 if (error <= kErrorRangeList[n].high) | |
| 130 return 2 * n; // In the range. | |
| 131 } | |
| 132 | |
| 133 // After the last bucket. | |
| 134 return 2 * kNumErrorRanges - 1; | |
| 135 } | |
| 136 | |
| 137 int MaxBucket() { | |
| 138 return 2 * kNumErrorRanges; | |
| 139 } | |
| 140 | |
| 141 int MaxError() { | |
| 142 int max_error = 0; | |
|
cbentzel
2011/08/30 14:48:23
I'd just make this a constant, rather than a funct
ahendrickson
2011/08/31 19:39:52
For Windows, I'd like to be able to change it if w
| |
| 143 for (size_t n = 0; n < kNumErrorRanges; ++n) { | |
| 144 if (kErrorRangeList[n].record_individually) | |
| 145 max_error = kErrorRangeList[n].high; | |
| 146 } | |
| 147 return max_error + 1; | |
| 148 } | |
| 149 | |
| 150 } // namespace net | |
| OLD | NEW |