Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(456)

Side by Side Diff: base/process_util_linux.cc

Issue 9071020: Linux: Try to minimize copying of string information when reading /proc data. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/process_util.h" 5 #include "base/process_util.h"
6 6
7 #include <ctype.h> 7 #include <ctype.h>
8 #include <dirent.h> 8 #include <dirent.h>
9 #include <dlfcn.h> 9 #include <dlfcn.h>
10 #include <errno.h> 10 #include <errno.h>
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 116
117 FilePath stat_file("/proc"); 117 FilePath stat_file("/proc");
118 stat_file = stat_file.Append(base::IntToString(process)); 118 stat_file = stat_file.Append(base::IntToString(process));
119 stat_file = stat_file.Append("status"); 119 stat_file = stat_file.Append("status");
120 std::string status; 120 std::string status;
121 if (!file_util::ReadFileToString(stat_file, &status)) 121 if (!file_util::ReadFileToString(stat_file, &status))
122 return -1; 122 return -1;
123 123
124 StringTokenizer tokenizer(status, ":\n"); 124 StringTokenizer tokenizer(status, ":\n");
125 ParsingState state = KEY_NAME; 125 ParsingState state = KEY_NAME;
126 std::string last_key_name; 126 StringPiece last_key_name;
127 while (tokenizer.GetNext()) { 127 while (tokenizer.GetNext()) {
128 switch (state) { 128 switch (state) {
129 case KEY_NAME: 129 case KEY_NAME:
130 last_key_name = tokenizer.token(); 130 last_key_name = tokenizer.token_piece();
131 state = KEY_VALUE; 131 state = KEY_VALUE;
132 break; 132 break;
133 case KEY_VALUE: 133 case KEY_VALUE:
134 DCHECK(!last_key_name.empty()); 134 DCHECK(!last_key_name.empty());
135 if (last_key_name == "PPid") { 135 if (last_key_name == "PPid") {
136 int ppid; 136 int ppid;
137 base::StringToInt(tokenizer.token(), &ppid); 137 base::StringToInt(tokenizer.token_piece(), &ppid);
138 return ppid; 138 return ppid;
139 } 139 }
140 state = KEY_NAME; 140 state = KEY_NAME;
141 break; 141 break;
142 } 142 }
143 } 143 }
144 NOTREACHED(); 144 NOTREACHED();
145 return -1; 145 return -1;
146 } 146 }
147 147
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
373 last_key_name = tokenizer.token_piece(); 373 last_key_name = tokenizer.token_piece();
374 state = KEY_VALUE; 374 state = KEY_VALUE;
375 break; 375 break;
376 case KEY_VALUE: 376 case KEY_VALUE:
377 if (last_key_name.empty()) { 377 if (last_key_name.empty()) {
378 NOTREACHED(); 378 NOTREACHED();
379 return false; 379 return false;
380 } 380 }
381 if (last_key_name.starts_with(private_prefix)) { 381 if (last_key_name.starts_with(private_prefix)) {
382 int cur; 382 int cur;
383 base::StringToInt(tokenizer.token(), &cur); 383 base::StringToInt(tokenizer.token_piece(), &cur);
384 private_kb += cur; 384 private_kb += cur;
385 } else if (last_key_name.starts_with(pss_prefix)) { 385 } else if (last_key_name.starts_with(pss_prefix)) {
386 have_pss = true; 386 have_pss = true;
387 int cur; 387 int cur;
388 base::StringToInt(tokenizer.token(), &cur); 388 base::StringToInt(tokenizer.token_piece(), &cur);
389 pss_kb += cur; 389 pss_kb += cur;
390 } 390 }
391 state = KEY_NAME; 391 state = KEY_NAME;
392 break; 392 break;
393 } 393 }
394 } 394 }
395 } else { 395 } else {
396 // Try statm if smaps is empty because of the SUID sandbox. 396 // Try statm if smaps is empty because of the SUID sandbox.
397 // First we need to get the page size though. 397 // First we need to get the page size though.
398 int page_size_kb = sysconf(_SC_PAGE_SIZE) / 1024; 398 int page_size_kb = sysconf(_SC_PAGE_SIZE) / 1024;
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 io_file = io_file.Append(base::IntToString(process_)); 483 io_file = io_file.Append(base::IntToString(process_));
484 io_file = io_file.Append("io"); 484 io_file = io_file.Append("io");
485 if (!file_util::ReadFileToString(io_file, &proc_io_contents)) 485 if (!file_util::ReadFileToString(io_file, &proc_io_contents))
486 return false; 486 return false;
487 487
488 (*io_counters).OtherOperationCount = 0; 488 (*io_counters).OtherOperationCount = 0;
489 (*io_counters).OtherTransferCount = 0; 489 (*io_counters).OtherTransferCount = 0;
490 490
491 StringTokenizer tokenizer(proc_io_contents, ": \n"); 491 StringTokenizer tokenizer(proc_io_contents, ": \n");
492 ParsingState state = KEY_NAME; 492 ParsingState state = KEY_NAME;
493 std::string last_key_name; 493 StringPiece last_key_name;
494 while (tokenizer.GetNext()) { 494 while (tokenizer.GetNext()) {
495 switch (state) { 495 switch (state) {
496 case KEY_NAME: 496 case KEY_NAME:
497 last_key_name = tokenizer.token(); 497 last_key_name = tokenizer.token_piece();
498 state = KEY_VALUE; 498 state = KEY_VALUE;
499 break; 499 break;
500 case KEY_VALUE: 500 case KEY_VALUE:
501 DCHECK(!last_key_name.empty()); 501 DCHECK(!last_key_name.empty());
502 if (last_key_name == "syscr") { 502 if (last_key_name == "syscr") {
503 base::StringToInt64(tokenizer.token(), 503 base::StringToInt64(tokenizer.token_piece(),
504 reinterpret_cast<int64*>(&(*io_counters).ReadOperationCount)); 504 reinterpret_cast<int64*>(&(*io_counters).ReadOperationCount));
505 } else if (last_key_name == "syscw") { 505 } else if (last_key_name == "syscw") {
506 base::StringToInt64(tokenizer.token(), 506 base::StringToInt64(tokenizer.token_piece(),
507 reinterpret_cast<int64*>(&(*io_counters).WriteOperationCount)); 507 reinterpret_cast<int64*>(&(*io_counters).WriteOperationCount));
508 } else if (last_key_name == "rchar") { 508 } else if (last_key_name == "rchar") {
509 base::StringToInt64(tokenizer.token(), 509 base::StringToInt64(tokenizer.token_piece(),
510 reinterpret_cast<int64*>(&(*io_counters).ReadTransferCount)); 510 reinterpret_cast<int64*>(&(*io_counters).ReadTransferCount));
511 } else if (last_key_name == "wchar") { 511 } else if (last_key_name == "wchar") {
512 base::StringToInt64(tokenizer.token(), 512 base::StringToInt64(tokenizer.token_piece(),
513 reinterpret_cast<int64*>(&(*io_counters).WriteTransferCount)); 513 reinterpret_cast<int64*>(&(*io_counters).WriteTransferCount));
514 } 514 }
515 state = KEY_NAME; 515 state = KEY_NAME;
516 break; 516 break;
517 } 517 }
518 } 518 }
519 return true; 519 return true;
520 } 520 }
521 521
522 ProcessMetrics::ProcessMetrics(ProcessHandle process) 522 ProcessMetrics::ProcessMetrics(ProcessHandle process)
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
770 int score_len = static_cast<int>(score_str.length()); 770 int score_len = static_cast<int>(score_str.length());
771 return (score_len == file_util::WriteFile(oom_file, 771 return (score_len == file_util::WriteFile(oom_file,
772 score_str.c_str(), 772 score_str.c_str(),
773 score_len)); 773 score_len));
774 } 774 }
775 775
776 return false; 776 return false;
777 } 777 }
778 778
779 } // namespace base 779 } // namespace base
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698