Chromium Code Reviews| Index: net/base/file_stream_metrics_win.cc |
| diff --git a/net/base/file_stream_metrics_win.cc b/net/base/file_stream_metrics_win.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..63ac701f71b53929bb0824efb954c5d1d1f919c3 |
| --- /dev/null |
| +++ b/net/base/file_stream_metrics_win.cc |
| @@ -0,0 +1,150 @@ |
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "net/base/file_stream_metrics.h" |
| + |
| +#include <windows.h> |
| + |
| +#include "base/basictypes.h" |
| + |
| +namespace net { |
| + |
| +namespace { |
| + |
| +struct Range { |
| + int low; |
| + int high; |
| + bool record_individually; |
| +}; |
| + |
| +// This must be higher than the largest value that isn't remapped into a bucket. |
| +int kErrorBucketStart = 400; |
| + |
| +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.
|
| + { 0, 321, true }, // These are the ones we don't remap into buckets. |
| + { 335, 371, false }, |
| + { 383, 387, false }, |
| + { 399, 404, false }, |
| + { 415, 418, false }, |
| + { 431, 433, false }, |
| + { 447, 868, false }, |
| + { 994, 1471, false }, |
| + { 1500, 1513, false }, |
| + { 1536, 1553, false }, |
| + { 1601, 1654, false }, |
| + { 1700, 1834, false }, |
| + { 1898, 1938, false }, |
| + { 2000, 2024, false }, |
| + { 2048, 2085, false }, |
| + { 2108, 2110, false }, |
| + { 2202, 2203, false }, |
| + { 2250, 2251, false }, |
| + { 2401, 2405, false }, |
| + { 3000, 3021, false }, |
| + { 3950, 3951, false }, |
| + { 4000, 4007, false }, |
| + { 4050, 4066, false }, |
| + { 4096, 4116, false }, |
| + { 4200, 4215, false }, |
| + { 4300, 4353, false }, |
| + { 4390, 4395, false }, |
| + { 4500, 4501, false }, |
| + { 4864, 4905, false }, |
| + { 5001, 5090, false }, |
| + { 5890, 5953, false }, |
| + { 6000, 6023, false }, |
| + { 6118, 6119, false }, |
| + { 6200, 6201, false }, |
| + { 6600, 6649, false }, |
| + { 6700, 6732, false }, |
| + { 6800, 6856, false }, |
| + { 7001, 7071, false }, |
| + { 8001, 8018, false }, |
| + { 8192, 8263, false }, |
| + { 8301, 8640, false }, |
| + { 8704, 8705, false }, |
| + { 8960, 9053, false }, |
| + { 9216, 9218, false }, |
| + { 9263, 9276, false }, |
| + { 9472, 9506, false }, |
| + { 9550, 9573, false }, |
| + { 9600, 9622, false }, |
| + { 9650, 9656, false }, |
| + { 9688, 9723, false }, |
| + { 9750, 9754, false }, |
| + { 9800, 9802, false }, |
| + { 9850, 9853, false }, |
| + { 9900, 9907, false }, |
| + { 10000, 10072, false }, |
| + { 10091, 10113, false }, |
| + { 11001, 11034, false }, |
| + { 12288, 12335, false }, |
| + { 12544, 12559, false }, |
| + { 12595, 12597, false }, |
| + { 12801, 12803, false }, |
| + { 13000, 13026, false }, |
| + { 13800, 13933, false }, |
| + { 14000, 14111, false }, |
| + { 15000, 15039, false }, |
| + { 15080, 15086, false }, |
| + { 15100, 15109, false }, |
| + { 15200, 15208, false }, |
| + { 15250, 15251, false }, |
| + { 15299, 15302, false }, |
| + { 16385, 16436, false }, |
| + { 18432, 18454, false }, |
| + { 20480, 20486, false }, |
| + { 24577, 24607, false }, |
| + { 28673, 28698, false }, |
| + { 32790, 32816, false }, |
| + { 33281, 33322, false }, |
| + { 35005, 35024, false }, |
| + { 36000, 36004, false }, |
| + { 40010, 40011, false }, |
| + { 40067, 40069, false }, |
| + { 53248, 53293, false }, |
| + { 53376, 53382, false }, |
| + { 57344, 57360, false }, |
| + { 57377, 57394, false }, |
| + { 65535, 65536 } |
| +}; |
| +size_t kNumErrorRanges = ARRAYSIZE_UNSAFE(kErrorRangeList); |
| + |
| +} // namespace |
| + |
| +// Windows has very many errors. We're not interested in most of them, but we |
| +// don't know which ones are significant. |
| +// This function maps error ranges we think we don't care about to specific |
| +// buckets, and leaves the others alone. If we get hits on the buckets, |
| +// we can add those values to the values we leave alone. |
| +// If we get values *between* the buckets, we record those as buckets too. |
| +// The range list is extracted from WinError.h. |
| +int GetErrorBucket(int error) { |
| + error = HRESULT_CODE(error); |
| + |
| + 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.
|
| + if (error < kErrorRangeList[n].low) |
| + return (2 * n) - 1; // In gap before the range. |
| + if (error <= kErrorRangeList[n].high) |
| + return 2 * n; // In the range. |
| + } |
| + |
| + // After the last bucket. |
| + return 2 * kNumErrorRanges - 1; |
| +} |
| + |
| +int MaxBucket() { |
| + return 2 * kNumErrorRanges; |
| +} |
| + |
| +int MaxError() { |
| + 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
|
| + for (size_t n = 0; n < kNumErrorRanges; ++n) { |
| + if (kErrorRangeList[n].record_individually) |
| + max_error = kErrorRangeList[n].high; |
| + } |
| + return max_error + 1; |
| +} |
| + |
| +} // namespace net |