public ResultCode UpdateMemoryPools(Span <MemoryPoolState> memoryPools) { PoolMapper mapper = new PoolMapper(_processHandle, _behaviourContext.IsMemoryPoolForceMappingEnabled()); if (memoryPools.Length * Unsafe.SizeOf <MemoryPoolInParameter>() != _inputHeader.MemoryPoolsSize) { return(ResultCode.InvalidUpdateInfo); } foreach (ref MemoryPoolState memoryPool in memoryPools) { MemoryPoolInParameter parameter = SpanIOHelper.Read <MemoryPoolInParameter>(ref _input); ref MemoryPoolOutStatus outStatus = ref SpanIOHelper.GetWriteRef <MemoryPoolOutStatus>(ref _output)[0]; PoolMapper.UpdateResult updateResult = mapper.Update(ref memoryPool, ref parameter, ref outStatus); if (updateResult != PoolMapper.UpdateResult.Success && updateResult != PoolMapper.UpdateResult.MapError && updateResult != PoolMapper.UpdateResult.UnmapError) { if (updateResult != PoolMapper.UpdateResult.InvalidParameter) { throw new InvalidOperationException($"{updateResult}"); } return(ResultCode.InvalidUpdateInfo); } }
public StateUpdater(ReadOnlyMemory <byte> input, Memory <byte> output, uint processHandle, BehaviourContext behaviourContext) { _input = input; _inputOrigin = _input; _output = output; _outputOrigin = _output; _processHandle = processHandle; _behaviourContext = behaviourContext; _inputHeader = SpanIOHelper.Read <UpdateDataHeader>(ref _input); _outputHeader = SpanMemoryManager <UpdateDataHeader> .Cast(_output.Slice(0, Unsafe.SizeOf <UpdateDataHeader>())); OutputHeader.Initialize(_behaviourContext.UserRevision); _output = _output.Slice(Unsafe.SizeOf <UpdateDataHeader>()); }
public ResultCode UpdateBehaviourContext() { BehaviourParameter parameter = SpanIOHelper.Read <BehaviourParameter>(ref _input); if (!BehaviourContext.CheckValidRevision(parameter.UserRevision) || parameter.UserRevision != _behaviourContext.UserRevision) { return(ResultCode.InvalidUpdateInfo); } _behaviourContext.ClearError(); _behaviourContext.UpdateFlags(parameter.Flags); if (_inputHeader.BehaviourSize != Unsafe.SizeOf <BehaviourParameter>()) { return(ResultCode.InvalidUpdateInfo); } return(ResultCode.Success); }