Kernel: Add basic support for O_NONBLOCK (only for tty)
This commit is contained in:
parent
6f002c926a
commit
b2139c0b1e
|
@ -87,6 +87,7 @@ namespace Kernel
|
|||
|
||||
virtual BAN::ErrorOr<size_t> read(size_t, void*, size_t) { if (mode().ifdir()) return BAN::Error::from_errno(EISDIR); ASSERT_NOT_REACHED(); }
|
||||
virtual BAN::ErrorOr<size_t> write(size_t, const void*, size_t) { if (mode().ifdir()) return BAN::Error::from_errno(EISDIR); ASSERT_NOT_REACHED(); }
|
||||
virtual bool has_data() const { dwarnln("nonblock not supported"); return true; }
|
||||
|
||||
virtual BAN::ErrorOr<void> truncate(size_t) { if (mode().ifdir()) return BAN::Error::from_errno(EISDIR); return BAN::Error::from_errno(ENOTSUP); }
|
||||
|
||||
|
|
|
@ -35,6 +35,7 @@ namespace Kernel
|
|||
|
||||
virtual BAN::ErrorOr<size_t> read(size_t, void*, size_t) override;
|
||||
virtual BAN::ErrorOr<size_t> write(size_t, const void*, size_t) override;
|
||||
virtual bool has_data() const override;
|
||||
|
||||
private:
|
||||
void clear();
|
||||
|
@ -78,7 +79,7 @@ namespace Kernel
|
|||
};
|
||||
|
||||
private:
|
||||
Kernel::SpinLock m_lock;
|
||||
mutable Kernel::SpinLock m_lock;
|
||||
|
||||
State m_state { State::Normal };
|
||||
AnsiState m_ansi_state { };
|
||||
|
|
|
@ -234,6 +234,8 @@ namespace Kernel
|
|||
{
|
||||
TRY(validate_fd(fd));
|
||||
auto& open_file = m_open_files[fd];
|
||||
if ((open_file->flags & O_NONBLOCK) && !open_file->inode->has_data())
|
||||
return 0;
|
||||
size_t nread = TRY(open_file->inode->read(open_file->offset, buffer, count));
|
||||
open_file->offset += nread;
|
||||
return nread;
|
||||
|
|
|
@ -679,6 +679,12 @@ flush:
|
|||
return count;
|
||||
}
|
||||
|
||||
bool TTY::has_data() const
|
||||
{
|
||||
LockGuard _(m_lock);
|
||||
return m_output.flush;
|
||||
}
|
||||
|
||||
void TTY::putchar_current(uint8_t ch)
|
||||
{
|
||||
ASSERT(s_tty);
|
||||
|
|
Loading…
Reference in New Issue