MOS Source Code
Loading...
Searching...
No Matches
console.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-3.0-or-later
2
7
8#include <array>
9#include <limits.h>
11#include <mos/io/io.hpp>
14#include <mos/string.hpp>
15#include <mos/syslog/printk.hpp>
17#include <mos/tasks/wait.hpp>
18#include <mos_string.hpp>
19
20std::array<Console *, 128> consoles;
22
23std::optional<Console *> console_get(mos::string_view name)
24{
25 for (size_t i = 0; i < console_list_size; i++)
26 {
27 if (consoles[i]->name() == name)
28 return consoles[i];
29 }
30 return std::nullopt;
31}
32std::optional<Console *> console_get_by_prefix(mos::string_view prefix)
33{
34 for (size_t i = 0; i < console_list_size; i++)
35 {
36 if (consoles[i]->name().begins_with(prefix))
37 return consoles[i];
38 }
39 return std::nullopt;
40}
41
50
52{
53 if (printk_console == nullptr)
54 printk_console = this;
56}
57
58size_t Console::WriteColored(const char *data, size_t size, StandardColor fg, StandardColor bg)
59{
61 if (caps.test(CONSOLE_CAP_COLOR))
62 {
63 if (this->fg != fg || this->bg != bg)
64 {
65 set_color(fg, bg);
66 this->fg = fg;
67 this->bg = bg;
68 }
69 }
70
71 size_t ret = do_write(data, size);
73 return ret;
74}
75
76size_t Console::Write(const char *data, size_t size)
77{
79 size_t ret = do_write(data, size);
81 return ret;
82}
83size_t Console::on_read(void *data, size_t size)
84{
85 size_t read = 0;
86 while (read == 0)
87 {
88 SpinLocker locker(&reader.lock);
89
90 const bool buffer_empty = ring_buffer_pos_is_empty(&reader.pos);
91 if (!buffer_empty)
92 {
94 continue;
95 }
96
97 {
98 auto unlocker = locker.UnlockTemporarily();
100 if (!ok)
101 {
102 unlocker.discard(), locker.discard();
103 pr_emerg("console: '%s' closed", conName);
104 return -EIO;
105 }
106 }
107
108 if (signal_has_pending())
109 {
110 return -ERESTARTSYS;
111 }
112 }
113
114 return read;
115}
116
117size_t Console::on_write(const void *data, size_t size)
118{
119 SpinLocker locker(&writer.lock);
120 if (caps.test(CONSOLE_CAP_COLOR))
122 return do_write((const char *) data, size);
123}
124
126{
127 if (c == 0x3)
128 {
131 {
132 Thread *thread = thread_get(entry->waiter);
133 if (thread)
134 signal_send_to_thread(thread, SIGINT);
135 }
137 }
138
140 waitlist_wake(&waitlist, INT_MAX);
141}
142
144{
145 return mos::string(conName);
146}
147
149{
150 mInfo << "Closing console " << conName;
151}
void discard()
Definition spinlock.hpp:160
SpinUnlocker UnlockTemporarily()
Definition spinlock.hpp:171
size_t console_list_size
Definition console.cpp:21
std::optional< Console * > console_get(mos::string_view name)
Definition console.cpp:23
std::array< Console *, 128 > consoles
Definition console.cpp:20
std::optional< Console * > console_get_by_prefix(mos::string_view prefix)
Definition console.cpp:32
std::array< Console *, 128 > consoles
Definition console.cpp:20
@ CONSOLE_CAP_COLOR
Definition console.hpp:17
@ CONSOLE_CAP_READ
console supports read
Definition console.hpp:22
bool signal_has_pending(void)
Return true if there's a pending signal.
Definition signal.cpp:307
long signal_send_to_thread(Thread *target, signal_t signal)
Send a signal to a thread.
Definition signal.cpp:88
StandardColor
Definition ansi_colors.h:18
#define list_foreach(t, v, h)
Iterate over a list.
Definition list.hpp:89
MOSAPI size_t ring_buffer_pos_pop_front(u8 *buffer, ring_buffer_pos_t *pos, u8 *buf, size_t size)
should_inline bool ring_buffer_pos_is_empty(ring_buffer_pos_t *pos)
should_inline size_t ring_buffer_pos_push_back_byte(u8 *buffer, ring_buffer_pos_t *pos, u8 data)
@ IO_READABLE
Definition io.hpp:30
@ IO_WRITABLE
Definition io.hpp:31
@ IO_NONE
Definition io.hpp:29
@ IO_CONSOLE
Definition io.hpp:24
#define do_write(fd, buffer, size)
Definition libipc.cpp:21
basic_string_view< char > string_view
mos::basic_string< char > string
Definition string.hpp:395
#define pr_emerg(fmt,...)
Definition printk.hpp:39
__nodiscard bool reschedule_for_waitlist(waitlist_t *waitlist)
Definition schedule.cpp:171
#define ERESTARTSYS
Definition signal.hpp:11
size_t size
Definition slab.cpp:32
const char * name
Definition slab.cpp:33
#define spinlock_acquire(lock)
Definition spinlock.hpp:64
#define spinlock_release(lock)
Definition spinlock.hpp:65
ring_buffer_pos_t pos
Definition console.hpp:82
spinlock_t lock
Definition console.hpp:80
Console(mos::string_view name, ConsoleCapFlags caps, Buffer< buf_size > *readBuf, StandardColor fg, StandardColor bg)
Definition console.hpp:40
const StandardColor default_bg
Definition console.hpp:76
size_t WriteColored(const char *data, size_t size, StandardColor fg, StandardColor bg)
Definition console.cpp:58
StandardColor bg
Definition console.hpp:36
virtual mos::string name() const override
Definition console.cpp:143
mos::string_view conName
Definition console.hpp:91
virtual bool set_color(StandardColor fg, StandardColor bg)=0
void Register()
Definition console.cpp:51
virtual size_t on_write(const void *, size_t) override
Definition console.cpp:117
void putc(u8 c)
Definition console.cpp:125
StandardColor fg
Definition console.hpp:36
const StandardColor default_fg
Definition console.hpp:76
struct Console::@330233373312361211116347355025210137337367045127 writer
const ConsoleCapFlags caps
Definition console.hpp:75
waitlist_t waitlist
Definition console.hpp:92
virtual void on_closed() override
Definition console.cpp:148
virtual size_t on_read(void *, size_t) override
Definition console.cpp:83
size_t Write(const char *data, size_t size)
Definition console.cpp:76
virtual size_t read(void *buf, size_t count) final
Definition io.cpp:50
IO(IOFlags flags, io_type_t type)
Definition io.cpp:35
The entry in the waiters list of a process, or a thread.
Definition wait.hpp:14
constexpr auto mInfo
Definition syslog.hpp:152
struct Console * printk_console
Definition printk.cpp:14
Thread * thread_get(tid_t id)
Definition thread.cpp:174
unsigned char u8
Definition types.h:15
size_t waitlist_wake(waitlist_t *list, size_t max_wakeups)
Definition wait.cpp:37