Index: net/tools/disk_cache_memory_test/disk_cache_memory_test.cc |
diff --git a/net/tools/disk_cache_memory_test/disk_cache_memory_test.cc b/net/tools/disk_cache_memory_test/disk_cache_memory_test.cc |
deleted file mode 100644 |
index f129ef229840d70aafc7b87b2f81977424f110c0..0000000000000000000000000000000000000000 |
--- a/net/tools/disk_cache_memory_test/disk_cache_memory_test.cc |
+++ /dev/null |
@@ -1,302 +0,0 @@ |
-// Copyright 2013 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 <cstdlib> |
-#include <fstream> |
-#include <iostream> |
-#include <string> |
-#include <vector> |
- |
-#include "base/at_exit.h" |
-#include "base/bind.h" |
-#include "base/callback.h" |
-#include "base/command_line.h" |
-#include "base/files/file_path.h" |
-#include "base/logging.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/memory/scoped_vector.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/message_loop/message_loop_proxy.h" |
-#include "base/run_loop.h" |
-#include "base/strings/string_number_conversions.h" |
-#include "base/strings/string_piece.h" |
-#include "base/strings/string_split.h" |
-#include "base/strings/stringprintf.h" |
-#include "net/base/cache_type.h" |
-#include "net/base/net_errors.h" |
-#include "net/disk_cache/disk_cache.h" |
-#include "net/disk_cache/simple/simple_backend_impl.h" |
-#include "net/disk_cache/simple/simple_index.h" |
- |
-namespace disk_cache { |
-namespace { |
- |
-const char kBlockFileBackendType[] = "block_file"; |
-const char kSimpleBackendType[] = "simple"; |
- |
-const char kDiskCacheType[] = "disk_cache"; |
-const char kAppCacheType[] = "app_cache"; |
- |
-const char kPrivateDirty[] = "Private_Dirty:"; |
-const char kReadWrite[] = "rw-"; |
-const char kHeap[] = "[heap]"; |
-const char kKb[] = "kB"; |
- |
-struct CacheSpec { |
- public: |
- static scoped_ptr<CacheSpec> Parse(const std::string& spec_string) { |
- std::vector<std::string> tokens; |
- base::SplitString(spec_string, ':', &tokens); |
- if (tokens.size() != 3) |
- return scoped_ptr<CacheSpec>(); |
- if (tokens[0] != kBlockFileBackendType && tokens[0] != kSimpleBackendType) |
- return scoped_ptr<CacheSpec>(); |
- if (tokens[1] != kDiskCacheType && tokens[1] != kAppCacheType) |
- return scoped_ptr<CacheSpec>(); |
- return scoped_ptr<CacheSpec>(new CacheSpec( |
- tokens[0] == kBlockFileBackendType ? net::CACHE_BACKEND_BLOCKFILE |
- : net::CACHE_BACKEND_SIMPLE, |
- tokens[1] == kDiskCacheType ? net::DISK_CACHE : net::APP_CACHE, |
- base::FilePath(tokens[2]))); |
- } |
- |
- const net::BackendType backend_type; |
- const net::CacheType cache_type; |
- const base::FilePath path; |
- |
- private: |
- CacheSpec(net::BackendType backend_type, |
- net::CacheType cache_type, |
- const base::FilePath& path) |
- : backend_type(backend_type), |
- cache_type(cache_type), |
- path(path) { |
- } |
-}; |
- |
-void SetSuccessCodeOnCompletion(base::RunLoop* run_loop, |
- bool* succeeded, |
- int net_error) { |
- if (net_error == net::OK) { |
- *succeeded = true; |
- } else { |
- *succeeded = false; |
- } |
- run_loop->Quit(); |
-} |
- |
-scoped_ptr<Backend> CreateAndInitBackend(const CacheSpec& spec) { |
- scoped_ptr<Backend> result; |
- scoped_ptr<Backend> backend; |
- bool succeeded = false; |
- base::RunLoop run_loop; |
- const net::CompletionCallback callback = base::Bind( |
- &SetSuccessCodeOnCompletion, |
- base::Unretained(&run_loop), |
- base::Unretained(&succeeded)); |
- const int net_error = CreateCacheBackend( |
- spec.cache_type, spec.backend_type, spec.path, 0, false, |
- base::MessageLoopProxy::current(), NULL, &backend, callback); |
- if (net_error == net::OK) |
- callback.Run(net::OK); |
- else |
- run_loop.Run(); |
- if (!succeeded) { |
- LOG(ERROR) << "Could not initialize backend in " |
- << spec.path.LossyDisplayName(); |
- return result.Pass(); |
- } |
- // For the simple cache, the index may not be initialized yet. |
- if (spec.backend_type == net::CACHE_BACKEND_SIMPLE) { |
- base::RunLoop index_run_loop; |
- const net::CompletionCallback index_callback = base::Bind( |
- &SetSuccessCodeOnCompletion, |
- base::Unretained(&index_run_loop), |
- base::Unretained(&succeeded)); |
- SimpleBackendImpl* simple_backend = |
- static_cast<SimpleBackendImpl*>(backend.get()); |
- const int index_net_error = |
- simple_backend->index()->ExecuteWhenReady(index_callback); |
- if (index_net_error == net::OK) |
- index_callback.Run(net::OK); |
- else |
- index_run_loop.Run(); |
- if (!succeeded) { |
- LOG(ERROR) << "Could not initialize Simple Cache in " |
- << spec.path.LossyDisplayName(); |
- return result.Pass(); |
- } |
- } |
- DCHECK(backend); |
- result.swap(backend); |
- return result.Pass(); |
-} |
- |
-// Parses range lines from /proc/<PID>/smaps, e.g. (anonymous read write): |
-// 7f819d88b000-7f819d890000 rw-p 00000000 00:00 0 |
-bool ParseRangeLine(const std::string& line, |
- std::vector<std::string>* tokens, |
- bool* is_anonymous_read_write) { |
- tokens->clear(); |
- base::SplitStringAlongWhitespace(line, tokens); |
- if (tokens->size() == 5) { |
- const std::string& mode = (*tokens)[1]; |
- *is_anonymous_read_write = !mode.compare(0, 3, kReadWrite); |
- return true; |
- } |
- // On Android, most of the memory is allocated in the heap, instead of being |
- // mapped. |
- if (tokens->size() == 6) { |
- const std::string& type = (*tokens)[5]; |
- *is_anonymous_read_write = (type == kHeap); |
- return true; |
- } |
- return false; |
-} |
- |
-// Parses range property lines from /proc/<PID>/smaps, e.g.: |
-// Private_Dirty: 16 kB |
-// |
-// Returns |false| iff it recognizes a new range line. Outputs non-zero |size| |
-// only if parsing succeeded. |
-bool ParseRangeProperty(const std::string& line, |
- std::vector<std::string>* tokens, |
- uint64* size, |
- bool* is_private_dirty) { |
- tokens->clear(); |
- base::SplitStringAlongWhitespace(line, tokens); |
- |
- // If the line is long, attempt to parse new range outside of this scope. |
- if (tokens->size() > 3) |
- return false; |
- |
- // Skip the line on other parsing error occasions. |
- if (tokens->size() < 3) |
- return true; |
- const std::string& type = (*tokens)[0]; |
- if (type != kPrivateDirty) |
- return true; |
- const std::string& unit = (*tokens)[2]; |
- if (unit != kKb) { |
- LOG(WARNING) << "Discarding value not in kB: " << line; |
- return true; |
- } |
- const std::string& size_str = (*tokens)[1]; |
- uint64 map_size = 0; |
- if (!base::StringToUint64(size_str, &map_size)) |
- return true; |
- *is_private_dirty = true; |
- *size = map_size; |
- return true; |
-} |
- |
-uint64 GetMemoryConsumption() { |
- std::ifstream maps_file( |
- base::StringPrintf("/proc/%d/smaps", getpid()).c_str()); |
- if (!maps_file.good()) { |
- LOG(ERROR) << "Could not open smaps file."; |
- return false; |
- } |
- std::string line; |
- std::vector<std::string> tokens; |
- uint64 total_size = 0; |
- if (!std::getline(maps_file, line) || line.empty()) |
- return total_size; |
- while (true) { |
- bool is_anonymous_read_write = false; |
- if (!ParseRangeLine(line, &tokens, &is_anonymous_read_write)) { |
- LOG(WARNING) << "Parsing smaps - did not expect line: " << line; |
- } |
- if (!std::getline(maps_file, line) || line.empty()) |
- return total_size; |
- bool is_private_dirty = false; |
- uint64 size = 0; |
- while (ParseRangeProperty(line, &tokens, &size, &is_private_dirty)) { |
- if (is_anonymous_read_write && is_private_dirty) { |
- total_size += size; |
- is_private_dirty = false; |
- } |
- if (!std::getline(maps_file, line) || line.empty()) |
- return total_size; |
- } |
- } |
- return total_size; |
-} |
- |
-bool CacheMemTest(const ScopedVector<CacheSpec>& specs) { |
- ScopedVector<Backend> backends; |
- ScopedVector<CacheSpec>::const_iterator it; |
- for (it = specs.begin(); it != specs.end(); ++it) { |
- scoped_ptr<Backend> backend = CreateAndInitBackend(**it); |
- if (!backend) |
- return false; |
- std::cout << "Number of entries in " << (*it)->path.LossyDisplayName() |
- << " : " << backend->GetEntryCount() << std::endl; |
- backends.push_back(backend.release()); |
- } |
- const uint64 memory_consumption = GetMemoryConsumption(); |
- std::cout << "Private dirty memory: " << memory_consumption << " kB" |
- << std::endl; |
- return true; |
-} |
- |
-void PrintUsage(std::ostream* stream) { |
- *stream << "Usage: disk_cache_mem_test " |
- << "--spec-1=<spec> " |
- << "[--spec-2=<spec>]" |
- << std::endl |
- << " with <cache_spec>=<backend_type>:<cache_type>:<cache_path>" |
- << std::endl |
- << " <backend_type>='block_file'|'simple'" << std::endl |
- << " <cache_type>='disk_cache'|'app_cache'" << std::endl |
- << " <cache_path>=file system path" << std::endl; |
-} |
- |
-bool ParseAndStoreSpec(const std::string& spec_str, |
- ScopedVector<CacheSpec>* specs) { |
- scoped_ptr<CacheSpec> spec = CacheSpec::Parse(spec_str); |
- if (!spec) { |
- PrintUsage(&std::cerr); |
- return false; |
- } |
- specs->push_back(spec.release()); |
- return true; |
-} |
- |
-bool Main(int argc, char** argv) { |
- base::AtExitManager at_exit_manager; |
- base::MessageLoopForIO message_loop; |
- base::CommandLine::Init(argc, argv); |
- const base::CommandLine& command_line = |
- *base::CommandLine::ForCurrentProcess(); |
- if (command_line.HasSwitch("help")) { |
- PrintUsage(&std::cout); |
- return true; |
- } |
- if ((command_line.GetSwitches().size() != 1 && |
- command_line.GetSwitches().size() != 2) || |
- !command_line.HasSwitch("spec-1") || |
- (command_line.GetSwitches().size() == 2 && |
- !command_line.HasSwitch("spec-2"))) { |
- PrintUsage(&std::cerr); |
- return false; |
- } |
- ScopedVector<CacheSpec> specs; |
- const std::string spec_str_1 = command_line.GetSwitchValueASCII("spec-1"); |
- if (!ParseAndStoreSpec(spec_str_1, &specs)) |
- return false; |
- if (command_line.HasSwitch("spec-2")) { |
- const std::string spec_str_2 = command_line.GetSwitchValueASCII("spec-2"); |
- if (!ParseAndStoreSpec(spec_str_2, &specs)) |
- return false; |
- } |
- return CacheMemTest(specs); |
-} |
- |
-} // namespace |
-} // namespace disk_cache |
- |
-int main(int argc, char** argv) { |
- return !disk_cache::Main(argc, argv); |
-} |