mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 10:17: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:
parent
d46c3b0b5b
commit
43ce6c5474
11 changed files with 103 additions and 95 deletions
|
@ -28,11 +28,25 @@ private:
|
|||
virtual bool is_local() const override { return true; }
|
||||
bool has_attached_peer(const FileDescription&) const;
|
||||
|
||||
// An open socket file on the filesystem.
|
||||
RefPtr<FileDescription> m_file;
|
||||
|
||||
// A single LocalSocket is shared between two file descriptions
|
||||
// on the connect side and the accept side; so we need to store
|
||||
// an additional role for the connect side and differentiate
|
||||
// between them.
|
||||
Role m_connect_side_role { Role::None };
|
||||
FileDescription* m_connect_side_fd { nullptr };
|
||||
|
||||
virtual Role role(const FileDescription& description) const override
|
||||
{
|
||||
if (m_connect_side_fd == &description)
|
||||
return m_connect_side_role;
|
||||
return m_role;
|
||||
}
|
||||
|
||||
bool m_bound { false };
|
||||
bool m_accept_side_fd_open { false };
|
||||
bool m_connect_side_fd_open { false };
|
||||
sockaddr_un m_address;
|
||||
|
||||
DoubleBuffer m_for_client;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue