Chromium Code Reviews| Index: snapshot/win/process_snapshot_win.cc |
| diff --git a/snapshot/win/process_snapshot_win.cc b/snapshot/win/process_snapshot_win.cc |
| index b8498d6c6c27fa8e081d1e58cd048f1fd5ad3532..c59cdded82aa87f54cb2f8884c9f44c5282049d2 100644 |
| --- a/snapshot/win/process_snapshot_win.cc |
| +++ b/snapshot/win/process_snapshot_win.cc |
| @@ -448,6 +448,10 @@ void ProcessSnapshotWin::ReadLocks( |
| WinVMAddress current_address = start_address_backward; |
| WinVMAddress last_good_address; |
| + // Cap the list of locks we capture arbitrarily so we don't walk forever. |
| + const int kMaxWalkLength = 100; |
|
Mark Mentovai
2015/11/30 18:32:06
…and maybe we should just grab the loader lock her
|
| + int walk_count = 0; |
| + |
| // Typically, this seems to be a circular list, but it's not clear that it |
| // always is, so follow Blink fields back to the head (or where we started) |
| // before following Flink to capture memory. |
| @@ -473,6 +477,9 @@ void ProcessSnapshotWin::ReadLocks( |
| critical_section_debug.ProcessLocksList.Blink - |
| offsetof(process_types::RTL_CRITICAL_SECTION_DEBUG<Traits>, |
| ProcessLocksList); |
| + walk_count++; |
| + if (walk_count == kMaxWalkLength) |
| + break; |
| } while (current_address != start_address_backward && |
| current_address != kInvalid); |
| @@ -481,6 +488,8 @@ void ProcessSnapshotWin::ReadLocks( |
| current_address = last_good_address; |
| } |
| + walk_count = 0; |
| + |
| const WinVMAddress start_address_forward = current_address; |
| // current_address is now the head of the list, walk Flink to add the whole |
| @@ -513,6 +522,12 @@ void ProcessSnapshotWin::ReadLocks( |
| critical_section_debug.ProcessLocksList.Flink - |
| offsetof(process_types::RTL_CRITICAL_SECTION_DEBUG<Traits>, |
| ProcessLocksList); |
| + walk_count++; |
| + // Walk twice as far on the forward walk, so that if we started at an |
| + // important one (for example the Loader Lock), we get it, and ones that |
| + // were presumably allocated temporally near it. |
| + if (walk_count == kMaxWalkLength * 2) |
| + break; |
| } while (current_address != start_address_forward && |
| current_address != kInvalid); |
| } |