forked from Bananymous/banan-os
Kernel: Fix some deadlocks in the Process
This commit is contained in:
parent
8c1f5bfe1e
commit
8001493df3
|
@ -220,20 +220,24 @@ namespace Kernel
|
|||
|
||||
BAN::ErrorOr<size_t> Process::write(int fd, const void* buffer, size_t count)
|
||||
{
|
||||
m_lock.lock();
|
||||
OpenFileDescription open_fd_copy;
|
||||
|
||||
{
|
||||
LockGuard _(m_lock);
|
||||
TRY(validate_fd(fd));
|
||||
auto open_fd_copy = open_file_description(fd);
|
||||
m_lock.unlock();
|
||||
open_fd_copy = open_file_description(fd);
|
||||
}
|
||||
|
||||
if (!(open_fd_copy.flags & O_WRONLY))
|
||||
return BAN::Error::from_errno(EBADF);
|
||||
size_t n_written = TRY(open_fd_copy.inode->write(open_fd_copy.offset, buffer, count));
|
||||
open_fd_copy.offset += n_written;
|
||||
|
||||
m_lock.lock();
|
||||
{
|
||||
LockGuard _(m_lock);
|
||||
MUST(validate_fd(fd));
|
||||
open_file_description(fd) = open_fd_copy;
|
||||
m_lock.unlock();
|
||||
}
|
||||
|
||||
return n_written;
|
||||
}
|
||||
|
@ -266,10 +270,13 @@ namespace Kernel
|
|||
|
||||
BAN::ErrorOr<void> Process::fstat(int fd, struct stat* out)
|
||||
{
|
||||
m_lock.lock();
|
||||
OpenFileDescription open_fd_copy;
|
||||
|
||||
{
|
||||
LockGuard _(m_lock);
|
||||
TRY(validate_fd(fd));
|
||||
auto open_fd_copy = open_file_description(fd);
|
||||
m_lock.unlock();
|
||||
open_fd_copy = open_file_description(fd);
|
||||
}
|
||||
|
||||
out->st_dev = open_fd_copy.inode->dev();
|
||||
out->st_ino = open_fd_copy.inode->ino();
|
||||
|
@ -298,10 +305,13 @@ namespace Kernel
|
|||
|
||||
BAN::ErrorOr<BAN::Vector<BAN::String>> Process::read_directory_entries(int fd)
|
||||
{
|
||||
m_lock.lock();
|
||||
OpenFileDescription open_fd_copy;
|
||||
|
||||
{
|
||||
LockGuard _(m_lock);
|
||||
TRY(validate_fd(fd));
|
||||
auto open_fd_copy = open_file_description(fd);
|
||||
m_lock.unlock();
|
||||
open_fd_copy = open_file_description(fd);
|
||||
}
|
||||
|
||||
auto result = TRY(open_fd_copy.inode->read_directory_entries(open_fd_copy.offset));
|
||||
open_fd_copy.offset++;
|
||||
|
|
Loading…
Reference in New Issue