MOS Source Code
Loading...
Searching...
No Matches
io.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-3.0-or-later
2
3#pragma once
4
5#include "mos/assert.hpp"
6#include "mos/mm/mm_types.hpp"
8
9#include <mos/io/io_types.h>
10#include <mos/mm/mm_types.h>
11#include <mos/string.hpp>
12#include <mos/types.hpp>
13
14struct IO;
15struct vmap_t; // forward declaration
16
17typedef enum
18{
19 IO_NULL, // null io port
20 IO_FILE, // a file
21 IO_DIR, // a directory (i.e. readdir())
22 IO_IPC, // an IPC channel
23 IO_PIPE, // an end of a pipe
24 IO_CONSOLE, // a console
25} io_type_t;
26
27typedef enum
28{
33 IO_SEEKABLE = 1 << 3,
34 IO_MMAPABLE = 1 << 4,
37
38struct IO
39{
40 const IOFlags io_flags = IO_NONE;
42
43 explicit IO(IOFlags flags, io_type_t type);
44 virtual ~IO() = 0;
45
46 static bool IsValid(const IO *io)
47 {
48 return io && !io->io_closed && io->io_refcount > 0;
49 }
50
52 {
53 stream << fmt("\\{ '{}', {}}", io->name(), io->io_closed ? "closed" : "active");
54 return stream;
55 }
56
57 inline IO *ref()
58 {
60 {
61 mos_warn("%p is already closed", (void *) this);
62 return 0;
63 }
64
66 return this;
67 }
68
69 inline IO *unref()
70 {
72 {
73 mos_warn("%p is already closed", (void *) this);
74 return nullptr;
75 }
76
77 if (--io_refcount == 0)
78 {
79 io_closed = true;
80 on_closed();
81 return nullptr;
82 }
83
84 return this;
85 }
86
87 virtual mos::string name() const;
88 virtual off_t seek(off_t, io_seek_whence_t) final;
89 virtual off_t tell() final;
90
91 virtual size_t read(void *buf, size_t count) final;
92 virtual size_t pread(void *buf, size_t count, off_t offset) final;
93 virtual size_t write(const void *buf, size_t count) final;
94
95 virtual bool VerifyMMapPermissions(VMFlags flags, bool is_private) final;
96
97 bool map(vmap_t *vmap, off_t offset);
98 bool unmap(vmap_t *vmap, bool *unmapped);
99
100 private:
101 virtual void on_closed() = 0;
102 virtual size_t on_read(void *, size_t);
103 virtual size_t on_write(const void *, size_t);
104 virtual bool on_mmap(vmap_t *, off_t);
105 virtual bool on_munmap(vmap_t *, bool *);
107
108 private:
111};
112
113extern IO *const io_null;
#define mos_warn(fmt,...)
Definition assert.hpp:22
IO *const io_null
Definition io.cpp:33
io_flags_t
Definition io.hpp:28
@ IO_MMAPABLE
Definition io.hpp:34
@ IO_EXECUTABLE
Definition io.hpp:32
@ IO_READABLE
Definition io.hpp:30
@ IO_SEEKABLE
Definition io.hpp:33
@ IO_WRITABLE
Definition io.hpp:31
@ IO_NONE
Definition io.hpp:29
io_type_t
Definition io.hpp:18
@ IO_IPC
Definition io.hpp:22
@ IO_PIPE
Definition io.hpp:23
@ IO_CONSOLE
Definition io.hpp:24
@ IO_FILE
Definition io.hpp:20
@ IO_NULL
Definition io.hpp:19
@ IO_DIR
Definition io.hpp:21
io_seek_whence_t
Definition io_types.h:6
@ MEM_PERM_NONE
Definition mm_types.h:8
@ MEM_PERM_EXEC
Definition mm_types.h:11
@ MEM_PERM_READ
Definition mm_types.h:9
@ MEM_PERM_WRITE
Definition mm_types.h:10
#define unlikely(x)
Definition mos_global.h:40
mos::basic_string< char > string
Definition string.hpp:395
#define false
Definition pb_syshdr.h:58
Definition io.hpp:39
virtual size_t pread(void *buf, size_t count, off_t offset) final
Definition io.cpp:69
static bool IsValid(const IO *io)
Definition io.hpp:46
virtual mos::string name() const
Definition io.cpp:45
virtual size_t read(void *buf, size_t count) final
Definition io.cpp:50
virtual bool VerifyMMapPermissions(VMFlags flags, bool is_private) final
Definition io.cpp:142
bool unmap(vmap_t *vmap, bool *unmapped)
Definition io.cpp:191
IO(IOFlags flags, io_type_t type)
Definition io.cpp:35
friend mos::SyslogStreamWriter operator<<(mos::SyslogStreamWriter stream, const IO *io)
Definition io.hpp:51
virtual bool on_munmap(vmap_t *, bool *)
Definition io.cpp:240
IO * ref()
Definition io.hpp:57
virtual ~IO()=0
Definition io.cpp:39
virtual void on_closed()=0
const io_type_t io_type
Definition io.hpp:41
atomic_t io_refcount
Definition io.hpp:110
virtual size_t on_write(const void *, size_t)
Definition io.cpp:228
const IOFlags io_flags
Definition io.hpp:40
virtual off_t tell() final
Definition io.cpp:136
virtual off_t seek(off_t, io_seek_whence_t) final
Definition io.cpp:117
bool map(vmap_t *vmap, off_t offset)
Definition io.cpp:172
virtual size_t on_read(void *, size_t)
Definition io.cpp:222
IO * unref()
Definition io.hpp:69
virtual size_t write(const void *buf, size_t count) final
Definition io.cpp:98
bool io_closed
Definition io.hpp:109
virtual off_t on_seek(off_t, io_seek_whence_t)
Definition io.cpp:245
virtual bool on_mmap(vmap_t *, off_t)
Definition io.cpp:234
Definition mm.hpp:60
#define fmt(_fmt,...)
Definition syslog.hpp:161
ssize_t off_t
Definition types.h:80
std::atomic_size_t atomic_t
Definition types.hpp:13
#define MOS_ENUM_FLAGS(enum, flags)
Definition types.hpp:236