blob: 792e2a9bde6429178eca1a1d9fcb02cf26455756 [file] [log] [blame]
// Copyright 2018 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 <stdlib.h>
#include <block-client/client.h>
#include <block-client/cpp/client.h>
#include <fbl/macros.h>
#include <lib/zx/fifo.h>
#include <zircon/assert.h>
#include <zircon/device/block.h>
#include <zircon/types.h>
namespace block_client {
Client::Client() : client_(nullptr) {}
Client::Client(fifo_client_t* client) : client_(client) {}
Client::Client(Client&& other) : client_(other.Release()) {}
Client& Client::operator=(Client&& other) {
Reset(other.Release());
return *this;
}
Client::~Client() {
Reset();
}
zx_status_t Client::Create(zx::fifo fifo, Client* out) {
fifo_client_t* client;
zx_status_t status = block_fifo_create_client(fifo.release(), &client);
if (status != ZX_OK) {
return status;
}
*out = Client(client);
return ZX_OK;
}
zx_status_t Client::Transaction(block_fifo_request_t* requests, size_t count) const {
ZX_DEBUG_ASSERT(client_ != nullptr);
return block_fifo_txn(client_, requests, count);
}
void Client::Reset(fifo_client_t* client) {
if (client_ != nullptr) {
block_fifo_release_client(client_);
}
client_ = client;
}
fifo_client_t* Client::Release() {
fifo_client_t* client = client_;
client_ = nullptr;
return client;
}
} // namespace block_client