struct OperationTraits
Defined at line 99 of file ../../src/devices/lib/dev-operation/include/lib/operation/block.h
Usage notes:
block::Operation is a c++ wrapper around the block_op_t object. It provides
capabilities to interact with a block_op buffer which is used to traverse the
block stack. On deletion, it will automatically free itself.
block::BorrowedOperation provides an unowned variant of block::Operation. It adds
functionality to store and call a complete callback which isn't present in
block::Operation. In addition, it will call the completion on destruction if it
wasn't already triggered.
block::OperationPool provides pooling functionality for block::Operation reuse.
block::OperationQueue provides a queue interface for tracking block::Operation and
block::BorrowedOperation objects.
Available methods for both Operation and BorrowedOperation include:
block_op_t* operation(); // accessor for inner type.
// Takes ownership of inner type. Should only be used when transferring
// ownership to another driver.
block_op_t* take();
Available to Operation and BorrowedOperation if they templatize of Storage:
Storage* private_storage(); // accessor for private storage.
Available to Operation:
void Release(); // Frees the inner type.
Available to BorrowedOperation:
void Complete(zx_status_t); // Completes the operation.
////////////////////////////////////////////////////////////////////////////
Example: Basic allocation with a pool:
block::OperationPool
<
> pool;
const size_t op_size = block::Operation
<
>::OperationSize(parent_op_size);
for (int i = 0; i
<
kNumRequest; i++) {
std::optional
<block
::Operation> request;
request = block::Operation::Alloc(op_size, parent_op_size);
if (!request) return ZX_ERR_NO_MEMORY;
pool.add(*std::move(request));
}
////////////////////////////////////////////////////////////////////////////
Example: Enqueue incoming operation into a block::OperationQueue:
class Driver {
public:
<
...>
private:
block::BorrowedOperationQueue
<
> operations_;
const size_t parent_op_size_;
};
void Driver::BlockImplQueue(block_op_t* op, block_queue_callback completion_cb, void* cookie) {
operations_.push(block::BorrowedOperation
<
>(op, cb, parent_req_size_));
}
////////////////////////////////////////////////////////////////////////////
Example: Using private context only visible to your driver:
struct PrivateStorage {
bool valid;
size_t count_metric;
}
using BlockOperation = block::BorrowedOperation
<PrivateStorage
>;
void Driver::BlockImplQueue(block_op_t* op, block_queue_callback completion_cb, void* cookie) {
BlockOperation block_op(op, cb, parent_req_size_));
ZX_DEBUG_ASSERT(block_op.operation()->command.opcode == BLOCK_OPCODE_READ);
block_op.private_storage()->valid = true;
block_op.private_storage()->count_metric += 1;
<
...>
}
Public Methods
OperationType * Alloc (size_t op_size)
Defined at line 102 of file ../../src/devices/lib/dev-operation/include/lib/operation/block.h
void Free (OperationType * op)
Defined at line 117 of file ../../src/devices/lib/dev-operation/include/lib/operation/block.h