| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'dart:typed_data'; |
| import 'package:zircon/zircon.dart'; |
| |
| /// Holder for a VMO with read/write capability. |
| class VmoHolder { |
| int _size; |
| Vmo _vmo; |
| |
| /// Creates and holds a VMO of desired size. |
| VmoHolder(this._size) { |
| HandleResult result = System.vmoCreate(_size); |
| if (result.status != ZX.OK) { |
| throw new ZxStatusException( |
| result.status, getStringForStatus(result.status)); |
| } |
| _vmo = Vmo(result.handle); |
| } |
| |
| /// Starts an update. |
| void beginWork() {} |
| |
| //// Finishes an update |
| void commit() {} |
| |
| /// Writes data to VMO at byte offset (not index). |
| /// |
| /// Data will be visible to other processes by end of next commit(). |
| void write(int offset, ByteData data) { |
| int status = _vmo.write(data, offset); |
| if (status != ZX.OK) { |
| throw new ZxStatusException(status, getStringForStatus(status)); |
| } |
| } |
| |
| /// Reads data from VMO at byte offset (not index). |
| ByteData read(int offset, int size) { |
| ReadResult result = _vmo.read(size, offset); |
| if (result.status != ZX.OK) { |
| throw new ZxStatusException( |
| result.status, getStringForStatus(result.status)); |
| } |
| return result.bytes; |
| } |
| |
| /// Writes int64 to VMO. |
| /// |
| /// Data will be visible to other processes by end of next commit(). |
| void writeInt64(int offset, int value) { |
| var data = ByteData(8)..setInt64(0, value, Endian.little); |
| write(offset, data); |
| } |
| |
| /// Writes int64 directly to VMO for immediate visibility. |
| void writeInt64Direct(int offset, int value) { |
| var data = ByteData(8)..setInt64(0, value, Endian.little); |
| write(offset, data); |
| } |
| |
| /// Reads int64 from VMO. |
| int readInt64(int offset) { |
| ByteData data = read(8, offset); |
| return data.getInt64(0, Endian.little); |
| } |
| } |