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 23WriteValueNodeValueJob::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 43WriteValueNodeValueJob::~WriteValueNodeValueJob() 44{ 45 if (fCpuState != NULL) 46 fCpuState->ReleaseReference(); 47 fValueNode->ReleaseReference(); 48 fNewValue->ReleaseReference(); 49} 50 51 52const JobKey& 53WriteValueNodeValueJob::Key() const 54{ 55 return fKey; 56} 57 58 59status_t 60WriteValueNodeValueJob::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