12#ifndef CMSIS_PLUS_POSIX_IO_BLOCK_DEVICE_H_
13#define CMSIS_PLUS_POSIX_IO_BLOCK_DEVICE_H_
17#if defined(__cplusplus)
21#if defined(OS_USE_OS_APP_CONFIG_H)
22#include <cmsis-plus/os-app-config.h>
29#pragma GCC diagnostic push
31#pragma clang diagnostic ignored "-Wc++98-compat"
42 class block_device_impl;
54#pragma GCC diagnostic push
56#elif defined(__GNUC__)
57#pragma GCC diagnostic ignored "-Wsuggest-final-methods"
58#pragma GCC diagnostic ignored "-Wsuggest-final-types"
109 vioctl (
int request, std::va_list args)
override;
148#pragma GCC diagnostic pop
152#pragma GCC diagnostic push
153#if defined(__clang__)
154#pragma clang diagnostic ignored "-Wpadded"
155#elif defined(__GNUC__)
156#pragma GCC diagnostic ignored "-Wpadded"
210 do_read (
void* buf, std::size_t nbyte)
override;
213 do_write (
const void* buf, std::size_t nbyte)
override;
236 std::size_t block_logical_size_bytes_ = 0;
238 std::size_t block_physical_size_bytes_ = 0;
247#pragma GCC diagnostic pop
251#pragma GCC diagnostic push
252#if defined(__clang__)
253#elif defined(__GNUC__)
254#pragma GCC diagnostic ignored "-Wsuggest-final-methods"
255#pragma GCC diagnostic ignored "-Wsuggest-final-types"
257 template <
typename T>
273 template <
typename... Args>
329#pragma GCC diagnostic pop
333 template <
typename T,
typename L>
350 template <
typename... Args>
386 close (
void)
override;
389 read (
void* buf, std::size_t nbyte)
override;
392 write (
const void* buf, std::size_t nbyte)
override;
398 vfcntl (
int cmd, std::va_list args)
override;
401 vioctl (
int request, std::va_list args)
override;
404 lseek (off_t offset,
int whence)
override;
408 std::size_t nblocks = 1)
override;
412 std::size_t nblocks = 1)
override;
415 sync (
void)
override;
457 return impl ().num_blocks_;
463 return impl ().block_logical_size_bytes_;
469 return impl ().block_physical_size_bytes_;
480 template <
typename T>
481 template <
typename... Args>
483 const char* name, Args&&... args)
485 impl_instance_{
std::forward<Args> (args)... }
487#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE)
488 trace::printf (
"block_device_implementable::%s(\"%s\")=@%p\n", __func__,
493#pragma GCC diagnostic push
494#if defined(__clang__)
495#elif defined(__GNUC__)
496#pragma GCC diagnostic ignored "-Wsuggest-final-methods"
498 template <
typename T>
501#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE)
502 trace::printf (
"block_device_implementable::%s() @%p %s\n", __func__,
506#pragma GCC diagnostic pop
508 template <
typename T>
517 template <
typename T,
typename L>
518 template <
typename... Args>
523 impl_instance_{
std::forward<Args> (args)... },
526#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE)
527 trace::printf (
"block_device_lockable::%s(\"%s\")=@%p\n", __func__,
532 template <
typename T,
typename L>
535#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE)
536 trace::printf (
"block_device_lockable::%s() @%p %s\n", __func__,
this,
543 template <
typename T,
typename L>
547#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE)
548 trace::printf (
"block_device_lockable::%s() @%p\n", __func__,
this);
551 std::lock_guard<L> lock{ locker_ };
556 template <
typename T,
typename L>
560#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE)
561 trace::printf (
"block_device_lockable::%s(0x0%X, %u) @%p\n", __func__,
565 std::lock_guard<L> lock{ locker_ };
570 template <
typename T,
typename L>
574#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE)
575 trace::printf (
"block_device_lockable::%s(0x0%X, %u) @%p\n", __func__,
579 std::lock_guard<L> lock{ locker_ };
584 template <
typename T,
typename L>
589#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE)
590 trace::printf (
"block_device_lockable::%s(0x0%X, %d) @%p\n", __func__,
594 std::lock_guard<L> lock{ locker_ };
599 template <
typename T,
typename L>
603#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE)
604 trace::printf (
"block_device_lockable::%s(%d) @%p\n", __func__, cmd,
608 std::lock_guard<L> lock{ locker_ };
613 template <
typename T,
typename L>
617#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE)
618 trace::printf (
"block_device_lockable::%s(%d) @%p\n", __func__, request,
622 std::lock_guard<L> lock{ locker_ };
627 template <
typename T,
typename L>
631#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE)
632 trace::printf (
"block_device_lockable::%s(%d, %d) @%p\n", __func__,
633 offset, whence,
this);
636 std::lock_guard<L> lock{ locker_ };
641 template <
typename T,
typename L>
646#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE)
647 trace::printf (
"block_device_lockable::%s(%p, %u, %u) @%p\n", __func__,
648 buf, blknum, nblocks,
this);
651 std::lock_guard<L> lock{ locker_ };
656 template <
typename T,
typename L>
661#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE)
662 trace::printf (
"block_device_lockable::%s(%p, %u, %u) @%p\n", __func__,
663 buf, blknum, nblocks,
this);
666 std::lock_guard<L> lock{ locker_ };
671 template <
typename T,
typename L>
675#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE)
676 trace::printf (
"block_device_lockable::%s() @%p\n", __func__,
this);
679 std::lock_guard<L> lock{ locker_ };
684 template <
typename T,
typename L>
695#pragma GCC diagnostic pop
virtual ssize_t do_read(void *buf, std::size_t nbyte) override
virtual off_t do_lseek(off_t offset, int whence) override
virtual ssize_t do_read_block(void *buf, blknum_t blknum, std::size_t nblocks)=0
virtual ~block_device_impl() override
virtual ssize_t do_write(const void *buf, std::size_t nbyte) override
virtual ssize_t do_write_block(const void *buf, blknum_t blknum, std::size_t nblocks)=0
block_device::blknum_t blknum_t
value_type & impl(void) const
block_device_implementable(const char *name, Args &&... args)
virtual ~block_device_implementable() override
virtual ssize_t writev(const iovec *iov, int iovcnt) override
virtual int vfcntl(int cmd, std::va_list args) override
virtual ssize_t read(void *buf, std::size_t nbyte) override
virtual void sync(void) override
virtual off_t lseek(off_t offset, int whence) override
virtual int vioctl(int request, std::va_list args) override
virtual int close(void) override
virtual ssize_t write_block(const void *buf, blknum_t blknum, std::size_t nblocks=1) override
block_device_lockable(const char *name, lockable_type &locker, Args &&... args)
virtual ssize_t read_block(void *buf, blknum_t blknum, std::size_t nblocks=1) override
virtual ssize_t write(const void *buf, std::size_t nbyte) override
value_type & impl(void) const
virtual ~block_device_lockable() override
std::size_t block_physical_size_bytes(void)
virtual ~block_device() override
std::size_t block_logical_size_bytes(void)
block_device_impl & impl(void) const
virtual int vioctl(int request, std::va_list args) override
virtual ssize_t read_block(void *buf, blknum_t blknum, std::size_t nblocks=1)
virtual ssize_t write_block(const void *buf, blknum_t blknum, std::size_t nblocks=1)
virtual int close(void) override
const char * name(void) const
virtual ssize_t writev(const iovec *iov, int iovcnt)
virtual off_t lseek(off_t offset, int whence)
virtual ssize_t write(const void *buf, std::size_t nbyte)
virtual ssize_t read(void *buf, std::size_t nbyte)
virtual int vfcntl(int cmd, std::va_list args)
int printf(const char *format,...)
Write a formatted string to the trace device.