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

Unified Diff: snapshot/win/process_reader_win.cc

Issue 1326443007: win: Fix incorrect thread suspend count due to ScopedProcessSuspend (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: assert some threads captured Created 5 years, 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « snapshot/win/process_reader_win.h ('k') | snapshot/win/process_reader_win_test.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: snapshot/win/process_reader_win.cc
diff --git a/snapshot/win/process_reader_win.cc b/snapshot/win/process_reader_win.cc
index 67e59e0101a2d4ecfc694e067bfd95a1511dea6c..bad81cd7f98311135395f61ddf0c14780b14027e 100644
--- a/snapshot/win/process_reader_win.cc
+++ b/snapshot/win/process_reader_win.cc
@@ -117,8 +117,8 @@ template <class Traits>
void FillThreadContextAndSuspendCount(
const process_types::SYSTEM_EXTENDED_THREAD_INFORMATION<Traits>&
thread_info,
- ProcessReaderWin::Thread* thread) {
-
+ ProcessReaderWin::Thread* thread,
+ ProcessSuspensionState suspension_state) {
// Don't suspend the thread if it's this thread. This is really only for test
// binaries, as we won't be walking ourselves, in general.
bool is_current_thread = thread_info.ClientId.UniqueThread ==
@@ -130,6 +130,7 @@ void FillThreadContextAndSuspendCount(
// TODO(scottmg): Handle cross-bitness in this function.
if (is_current_thread) {
+ DCHECK(suspension_state == ProcessSuspensionState::kRunning);
thread->suspend_count = 0;
RtlCaptureContext(&thread->context);
} else {
@@ -138,7 +139,11 @@ void FillThreadContextAndSuspendCount(
PLOG(ERROR) << "SuspendThread failed";
return;
}
- thread->suspend_count = previous_suspend_count;
+ DCHECK(previous_suspend_count > 0 ||
+ suspension_state == ProcessSuspensionState::kRunning);
+ thread->suspend_count =
+ previous_suspend_count -
+ (suspension_state == ProcessSuspensionState::kSuspended ? 1 : 0);
memset(&thread->context, 0, sizeof(thread->context));
thread->context.ContextFlags = CONTEXT_ALL;
@@ -171,6 +176,7 @@ ProcessReaderWin::ProcessReaderWin()
process_info_(),
threads_(),
modules_(),
+ suspension_state_(),
initialized_threads_(false),
initialized_() {
}
@@ -178,10 +184,12 @@ ProcessReaderWin::ProcessReaderWin()
ProcessReaderWin::~ProcessReaderWin() {
}
-bool ProcessReaderWin::Initialize(HANDLE process) {
+bool ProcessReaderWin::Initialize(HANDLE process,
+ ProcessSuspensionState suspension_state) {
INITIALIZATION_STATE_SET_INITIALIZING(initialized_);
process_ = process;
+ suspension_state_ = suspension_state;
process_info_.Initialize(process);
INITIALIZATION_STATE_SET_VALID(initialized_);
@@ -254,7 +262,7 @@ const std::vector<ProcessReaderWin::Thread>& ProcessReaderWin::Threads() {
Thread thread;
thread.id = thread_info.ClientId.UniqueThread;
- FillThreadContextAndSuspendCount(thread_info, &thread);
+ FillThreadContextAndSuspendCount(thread_info, &thread, suspension_state_);
// TODO(scottmg): I believe we could reverse engineer the PriorityClass from
// the Priority, BasePriority, and
« no previous file with comments | « snapshot/win/process_reader_win.h ('k') | snapshot/win/process_reader_win_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698