OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/trace_event/memory_dump_manager.h" | 5 #include "base/trace_event/memory_dump_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/atomic_sequence_num.h" | 9 #include "base/atomic_sequence_num.h" |
10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
310 // straight away (FinalizeDumpAndAddToTrace() takes care of the callback). | 310 // straight away (FinalizeDumpAndAddToTrace() takes care of the callback). |
311 if (did_any_provider_dump && pmd_holder->num_pending_async_requests == 0) | 311 if (did_any_provider_dump && pmd_holder->num_pending_async_requests == 0) |
312 FinalizeDumpAndAddToTrace(pmd_holder); | 312 FinalizeDumpAndAddToTrace(pmd_holder); |
313 } | 313 } |
314 | 314 |
315 // Invokes the MemoryDumpProvider.OnMemoryDump(), taking care of the fail-safe | 315 // Invokes the MemoryDumpProvider.OnMemoryDump(), taking care of the fail-safe |
316 // logic which disables the dumper when failing (crbug.com/461788). | 316 // logic which disables the dumper when failing (crbug.com/461788). |
317 bool MemoryDumpManager::InvokeDumpProviderLocked(MemoryDumpProvider* mdp, | 317 bool MemoryDumpManager::InvokeDumpProviderLocked(MemoryDumpProvider* mdp, |
318 ProcessMemoryDump* pmd) { | 318 ProcessMemoryDump* pmd) { |
319 lock_.AssertAcquired(); | 319 lock_.AssertAcquired(); |
320 const int kMaxFailuresCount = 3; | |
Primiano Tucci (use gerrit)
2015/06/10 23:37:07
+consecutive
ssid
2015/06/12 14:37:00
Done.
| |
320 bool dump_successful = mdp->OnMemoryDump(pmd); | 321 bool dump_successful = mdp->OnMemoryDump(pmd); |
321 if (!dump_successful) { | 322 if (!dump_successful) { |
322 LOG(ERROR) << "The memory dumper failed, possibly due to sandboxing " | 323 LOG(ERROR) << "The memory dumper failed, possibly due to sandboxing " |
Primiano Tucci (use gerrit)
2015/06/10 23:37:07
you want to give this message only if it fails N t
ssid
2015/06/12 14:37:00
Done.
| |
323 "(crbug.com/461788), disabling it for current process. Try " | 324 "(crbug.com/461788), disabling it for current process. Try " |
324 "restarting chrome with the --no-sandbox switch."; | 325 "restarting chrome with the --no-sandbox switch."; |
325 dump_providers_.find(mdp)->second.disabled = true; | 326 |
327 // Disable the MDP if it fails kMaxFailuresCount times consecutively. | |
328 dump_providers_.find(mdp)->second.failures++; | |
Primiano Tucci (use gerrit)
2015/06/10 23:37:07
Let's just lookup once, and keep the ptr to the md
ssid
2015/06/12 14:37:00
Done.
| |
329 if (dump_providers_.find(mdp)->second.failures >= kMaxFailuresCount) | |
330 dump_providers_.find(mdp)->second.disabled = true; | |
331 } else { | |
332 dump_providers_.find(mdp)->second.failures = 0; | |
326 } | 333 } |
327 return dump_successful; | 334 return dump_successful; |
328 } | 335 } |
329 | 336 |
330 // This is posted to arbitrary threads as a continuation of CreateProcessDump(), | 337 // This is posted to arbitrary threads as a continuation of CreateProcessDump(), |
331 // when one or more MemoryDumpProvider(s) require the OnMemoryDump() call to | 338 // when one or more MemoryDumpProvider(s) require the OnMemoryDump() call to |
332 // happen on a different thread. | 339 // happen on a different thread. |
333 void MemoryDumpManager::ContinueAsyncProcessDump( | 340 void MemoryDumpManager::ContinueAsyncProcessDump( |
334 MemoryDumpProvider* mdp, | 341 MemoryDumpProvider* mdp, |
335 scoped_refptr<ProcessMemoryDumpHolder> pmd_holder) { | 342 scoped_refptr<ProcessMemoryDumpHolder> pmd_holder) { |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
369 // There is no point starting the tracing without a delegate. | 376 // There is no point starting the tracing without a delegate. |
370 if (!enabled || !delegate_) { | 377 if (!enabled || !delegate_) { |
371 // Disable all the providers. | 378 // Disable all the providers. |
372 for (auto it = dump_providers_.begin(); it != dump_providers_.end(); ++it) | 379 for (auto it = dump_providers_.begin(); it != dump_providers_.end(); ++it) |
373 it->second.disabled = true; | 380 it->second.disabled = true; |
374 return; | 381 return; |
375 } | 382 } |
376 | 383 |
377 session_state_ = new MemoryDumpSessionState(); | 384 session_state_ = new MemoryDumpSessionState(); |
378 for (auto it = dump_providers_.begin(); it != dump_providers_.end(); ++it) | 385 for (auto it = dump_providers_.begin(); it != dump_providers_.end(); ++it) |
379 it->second.disabled = false; | 386 it->second.disabled = false; |
Primiano Tucci (use gerrit)
2015/06/10 23:37:07
and you want to reset the count here, otherwise on
ssid
2015/06/12 14:37:00
Done.
| |
380 | 387 |
381 subtle::NoBarrier_Store(&memory_tracing_enabled_, 1); | 388 subtle::NoBarrier_Store(&memory_tracing_enabled_, 1); |
382 | 389 |
383 if (delegate_->IsCoordinatorProcess()) { | 390 if (delegate_->IsCoordinatorProcess()) { |
384 periodic_dump_timer_.Start(FROM_HERE, | 391 periodic_dump_timer_.Start(FROM_HERE, |
385 TimeDelta::FromSeconds(kDumpIntervalSeconds), | 392 TimeDelta::FromSeconds(kDumpIntervalSeconds), |
386 base::Bind(&RequestPeriodicGlobalDump)); | 393 base::Bind(&RequestPeriodicGlobalDump)); |
387 } | 394 } |
388 } | 395 } |
389 | 396 |
390 void MemoryDumpManager::OnTraceLogDisabled() { | 397 void MemoryDumpManager::OnTraceLogDisabled() { |
391 AutoLock lock(lock_); | 398 AutoLock lock(lock_); |
392 periodic_dump_timer_.Stop(); | 399 periodic_dump_timer_.Stop(); |
393 subtle::NoBarrier_Store(&memory_tracing_enabled_, 0); | 400 subtle::NoBarrier_Store(&memory_tracing_enabled_, 0); |
394 session_state_ = nullptr; | 401 session_state_ = nullptr; |
395 } | 402 } |
396 | 403 |
397 MemoryDumpManager::MemoryDumpProviderInfo::MemoryDumpProviderInfo( | 404 MemoryDumpManager::MemoryDumpProviderInfo::MemoryDumpProviderInfo( |
398 const scoped_refptr<SingleThreadTaskRunner>& task_runner) | 405 const scoped_refptr<SingleThreadTaskRunner>& task_runner) |
399 : task_runner(task_runner), disabled(false) { | 406 : task_runner(task_runner), failures(0), disabled(false) { |
400 } | 407 } |
401 MemoryDumpManager::MemoryDumpProviderInfo::~MemoryDumpProviderInfo() { | 408 MemoryDumpManager::MemoryDumpProviderInfo::~MemoryDumpProviderInfo() { |
402 } | 409 } |
403 | 410 |
404 } // namespace trace_event | 411 } // namespace trace_event |
405 } // namespace base | 412 } // namespace base |
OLD | NEW |