| // 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. |
| |
| #include "message.h" |
| |
| #include <fuchsia/hardware/block/c/banjo.h> |
| |
| #include "server.h" |
| |
| zx_status_t Message::Create(fbl::RefPtr<IoBuffer> iobuf, Server* server, block_fifo_request_t* req, |
| size_t block_op_size, MessageCompleter completer, |
| std::unique_ptr<Message>* out) { |
| std::unique_ptr<Message> msg(new (block_op_size) Message(std::move(completer))); |
| if (msg == nullptr) { |
| return ZX_ERR_NO_MEMORY; |
| } |
| msg->iobuf_ = std::move(iobuf); |
| msg->server_ = server; |
| msg->op_size_ = block_op_size; |
| msg->result_ = ZX_OK; |
| memcpy(&msg->req_, req, sizeof(msg->req_)); |
| memset(msg->_op_raw_, 0, block_op_size); |
| *out = std::move(msg); |
| return ZX_OK; |
| } |
| |
| void Message::Complete() { |
| completer_(result(), req_); |
| server_->TxnEnd(); |
| server_ = nullptr; // server_ can be destroyed after calling TxnEnd(). |
| iobuf_ = nullptr; |
| } |