1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 23:07:35 +00:00

Kernel: Move socket role tracking to the Socket class itself

This is more logical and allows us to solve the problem of
non-blocking TCP sockets getting stuck in SocketRole::None.

The only complication is that a single LocalSocket may be shared
between two file descriptions (on the connect and accept sides),
and should have two different roles depending from which side
you look at it. To deal with it, Socket::role() is made a
virtual method that accepts a file description, and LocalSocket
internally tracks which FileDescription is the which one and
returns a correct role.
This commit is contained in:
Sergey Bugaev 2019-08-11 16:38:20 +03:00 committed by Andreas Kling
parent d46c3b0b5b
commit 43ce6c5474
11 changed files with 103 additions and 95 deletions

View file

@ -22,17 +22,16 @@ NonnullRefPtr<FileDescription> FileDescription::create(Custody& custody)
return description;
}
NonnullRefPtr<FileDescription> FileDescription::create(File& file, SocketRole role)
NonnullRefPtr<FileDescription> FileDescription::create(File& file)
{
return adopt(*new FileDescription(file, role));
return adopt(*new FileDescription(file));
}
FileDescription::FileDescription(File& file, SocketRole role)
FileDescription::FileDescription(File& file)
: m_file(file)
{
if (file.is_inode())
m_inode = static_cast<InodeFile&>(file).inode();
set_socket_role(role);
if (is_socket())
socket()->attach(*this);
}
@ -47,15 +46,6 @@ FileDescription::~FileDescription()
m_inode = nullptr;
}
void FileDescription::set_socket_role(SocketRole role)
{
if (role == m_socket_role)
return;
ASSERT(is_socket());
m_socket_role = role;
}
KResult FileDescription::fstat(stat& buffer)
{
ASSERT(!is_fifo());

View file

@ -23,7 +23,7 @@ class SharedMemory;
class FileDescription : public RefCounted<FileDescription> {
public:
static NonnullRefPtr<FileDescription> create(Custody&);
static NonnullRefPtr<FileDescription> create(File&, SocketRole = SocketRole::None);
static NonnullRefPtr<FileDescription> create(File&);
~FileDescription();
int close();
@ -93,9 +93,6 @@ public:
void set_original_inode(Badge<VFS>, NonnullRefPtr<Inode>&& inode) { m_inode = move(inode); }
SocketRole socket_role() const { return m_socket_role; }
void set_socket_role(SocketRole);
KResult truncate(off_t);
off_t offset() const { return m_current_offset; }
@ -104,7 +101,7 @@ public:
private:
friend class VFS;
FileDescription(File&, SocketRole = SocketRole::None);
explicit FileDescription(File&);
FileDescription(FIFO&, FIFO::Direction);
RefPtr<Custody> m_custody;
@ -119,6 +116,5 @@ private:
bool m_is_blocking { true };
bool m_should_append { false };
SocketRole m_socket_role { SocketRole::None };
FIFO::Direction m_fifo_direction { FIFO::Direction::Neither };
};