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
17GetThreadStateJob::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
28GetThreadStateJob::~GetThreadStateJob()
29{
30	fThread->ReleaseReference();
31}
32
33
34const JobKey&
35GetThreadStateJob::Key() const
36{
37	return fKey;
38}
39
40
41status_t
42GetThreadStateJob::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