xref: /haiku/src/kits/debugger/jobs/WriteValueNodeJob.cpp (revision b08627f310bb2e80bca50176e7a758182384735a)
1 /*
2  * Copyright 2015, 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 "Architecture.h"
12 #include "CpuState.h"
13 #include "DebuggerInterface.h"
14 #include "TeamTypeInformation.h"
15 #include "Tracing.h"
16 #include "Value.h"
17 #include "ValueLocation.h"
18 #include "ValueNode.h"
19 #include "ValueNodeContainer.h"
20 #include "ValueWriter.h"
21 
22 
23 WriteValueNodeValueJob::WriteValueNodeValueJob(
24 	DebuggerInterface* debuggerInterface, Architecture* architecture,
25 	CpuState* cpuState, TeamTypeInformation* typeInformation,
26 	ValueNode* valueNode, Value* newValue)
27 	:
28 	fKey(valueNode, JOB_TYPE_WRITE_VALUE_NODE_VALUE),
29 	fDebuggerInterface(debuggerInterface),
30 	fArchitecture(architecture),
31 	fCpuState(cpuState),
32 	fTypeInformation(typeInformation),
33 	fValueNode(valueNode),
34 	fNewValue(newValue)
35 {
36 	if (fCpuState != NULL)
37 		fCpuState->AcquireReference();
38 	fValueNode->AcquireReference();
39 	fNewValue->AcquireReference();
40 }
41 
42 
43 WriteValueNodeValueJob::~WriteValueNodeValueJob()
44 {
45 	if (fCpuState != NULL)
46 		fCpuState->ReleaseReference();
47 	fValueNode->ReleaseReference();
48 	fNewValue->ReleaseReference();
49 }
50 
51 
52 const JobKey&
53 WriteValueNodeValueJob::Key() const
54 {
55 	return fKey;
56 }
57 
58 
59 status_t
60 WriteValueNodeValueJob::Do()
61 {
62 	ValueNodeContainer* container = fValueNode->Container();
63 	if (container == NULL)
64 		return B_BAD_VALUE;
65 
66 	ValueWriter writer(fArchitecture, fDebuggerInterface,
67 		fCpuState, -1);
68 
69 	BVariant value;
70 	fNewValue->ToVariant(value);
71 
72 	status_t error = writer.WriteValue(fValueNode->Location(), value);
73 	if (error != B_OK)
74 		return error;
75 
76 	AutoLocker<ValueNodeContainer> containerLocker(container);
77 	fValueNode->SetLocationAndValue(fValueNode->Location(), fNewValue, B_OK);
78 
79 	return B_OK;
80 }
81