xref: /haiku/src/kits/debugger/jobs/GetThreadStateJob.cpp (revision b08627f310bb2e80bca50176e7a758182384735a)
1 /*
2  * Copyright 2012-2016, Rene Gollent, rene@gollent.com.
3  * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
4  * Distributed under the terms of the MIT License.
5  */
6 
7 #include "Jobs.h"
8 
9 #include <AutoLocker.h>
10 
11 #include "CpuState.h"
12 #include "DebuggerInterface.h"
13 #include "Team.h"
14 #include "Thread.h"
15 
16 
17 GetThreadStateJob::GetThreadStateJob(DebuggerInterface* debuggerInterface,
18 	::Thread* thread)
19 	:
20 	fKey(thread, JOB_TYPE_GET_THREAD_STATE),
21 	fDebuggerInterface(debuggerInterface),
22 	fThread(thread)
23 {
24 	fThread->AcquireReference();
25 }
26 
27 
28 GetThreadStateJob::~GetThreadStateJob()
29 {
30 	fThread->ReleaseReference();
31 }
32 
33 
34 const JobKey&
35 GetThreadStateJob::Key() const
36 {
37 	return fKey;
38 }
39 
40 
41 status_t
42 GetThreadStateJob::Do()
43 {
44 	CpuState* state = NULL;
45 	status_t error = fDebuggerInterface->GetCpuState(fThread->ID(), state);
46 	BReference<CpuState> reference(state, true);
47 
48 	AutoLocker<Team> locker(fThread->GetTeam());
49 
50 	if (fThread->State() != THREAD_STATE_UNKNOWN)
51 		return B_OK;
52 
53 	if (error == B_OK) {
54 		fThread->SetState(THREAD_STATE_STOPPED);
55 		fThread->SetCpuState(state);
56 	} else if (error == B_BAD_THREAD_STATE) {
57 		fThread->SetState(THREAD_STATE_RUNNING);
58 	} else
59 		return error;
60 
61 	return B_OK;
62 }
63