kernel: Add support for blocking reads
This commit is contained in:
parent
cd00e41f59
commit
41514d9ad2
@ -32,6 +32,8 @@ namespace VFS
|
|||||||
|
|
||||||
virtual Result<void> truncate(usize size) = 0;
|
virtual Result<void> truncate(usize size) = 0;
|
||||||
|
|
||||||
|
virtual bool blocking() const = 0;
|
||||||
|
|
||||||
// Metadata accessors
|
// Metadata accessors
|
||||||
virtual usize size() = 0;
|
virtual usize size() = 0;
|
||||||
|
|
||||||
@ -73,6 +75,11 @@ namespace VFS
|
|||||||
return err(ENOTDIR);
|
return err(ENOTDIR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool blocking() const override
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
InodeType type() const override
|
InodeType type() const override
|
||||||
{
|
{
|
||||||
return InodeType::RegularFile;
|
return InodeType::RegularFile;
|
||||||
|
@ -17,3 +17,8 @@ Result<usize> ConsoleDevice::write(const u8* buf, usize, usize length)
|
|||||||
TextConsole::write((const char*)buf, length);
|
TextConsole::write((const char*)buf, length);
|
||||||
return length;
|
return length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ConsoleDevice::blocking() const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@ -11,5 +11,7 @@ class ConsoleDevice : public Device
|
|||||||
|
|
||||||
Result<usize> write(const u8*, usize, usize) override;
|
Result<usize> write(const u8*, usize, usize) override;
|
||||||
|
|
||||||
|
bool blocking() const override;
|
||||||
|
|
||||||
virtual ~ConsoleDevice() = default;
|
virtual ~ConsoleDevice() = default;
|
||||||
};
|
};
|
||||||
|
@ -8,5 +8,7 @@ class Device
|
|||||||
|
|
||||||
virtual Result<usize> write(const u8* buf, usize offset, usize length) = 0;
|
virtual Result<usize> write(const u8* buf, usize offset, usize length) = 0;
|
||||||
|
|
||||||
|
virtual bool blocking() const = 0;
|
||||||
|
|
||||||
virtual ~Device() = default;
|
virtual ~Device() = default;
|
||||||
};
|
};
|
||||||
|
@ -17,5 +17,10 @@ class NullDevice : public Device
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool blocking() const override
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
virtual ~NullDevice() = default;
|
virtual ~NullDevice() = default;
|
||||||
};
|
};
|
||||||
|
@ -134,6 +134,11 @@ namespace TmpFS
|
|||||||
return err(EINVAL);
|
return err(EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool blocking() const override
|
||||||
|
{
|
||||||
|
return m_device->blocking();
|
||||||
|
}
|
||||||
|
|
||||||
usize size() override
|
usize size() override
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
@ -196,6 +201,11 @@ namespace TmpFS
|
|||||||
return err(EISDIR);
|
return err(EISDIR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool blocking() const override
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
usize size() override
|
usize size() override
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -21,6 +21,8 @@ Result<u64> sys_read(Registers*, SyscallArgs args)
|
|||||||
|
|
||||||
if (!descriptor.is_readable()) return err(EBADF);
|
if (!descriptor.is_readable()) return err(EBADF);
|
||||||
|
|
||||||
|
while (descriptor.inode->blocking()) { kernel_sleep(10); }
|
||||||
|
|
||||||
usize nread = TRY(descriptor.inode->read(buf, descriptor.offset, size));
|
usize nread = TRY(descriptor.inode->read(buf, descriptor.offset, size));
|
||||||
|
|
||||||
descriptor.offset += nread;
|
descriptor.offset += nread;
|
||||||
|
Loading…
Reference in New Issue
Block a user