mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 13:27:35 +00:00
LibIPC: Add an expressive way to close an IPC::File after sending it
If you don't need a file descriptor after sending it to someone over IPC, construct it with IPC::File(fd, IPC::File::CloseAfterSending) and LibIPC will take care of it for you. :^)
This commit is contained in:
parent
7f2d8e8884
commit
f1f7bf567b
4 changed files with 3 additions and 7 deletions
|
@ -48,8 +48,10 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tagged constructor for fd's that should be closed on destruction unless take_fd() is called.
|
// Tagged constructor for fd's that should be closed on destruction unless take_fd() is called.
|
||||||
|
// Note that the tags are the same, this is intentional to allow expressive invocation.
|
||||||
enum Tag {
|
enum Tag {
|
||||||
ConstructWithReceivedFileDescriptor = 1,
|
ConstructWithReceivedFileDescriptor = 1,
|
||||||
|
CloseAfterSending = 1,
|
||||||
};
|
};
|
||||||
File(int fd, Tag)
|
File(int fd, Tag)
|
||||||
: m_fd(fd)
|
: m_fd(fd)
|
||||||
|
|
|
@ -34,8 +34,6 @@ Message::Message()
|
||||||
|
|
||||||
Message::~Message()
|
Message::~Message()
|
||||||
{
|
{
|
||||||
if (on_destruction)
|
|
||||||
on_destruction();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,8 +45,6 @@ public:
|
||||||
virtual const char* message_name() const = 0;
|
virtual const char* message_name() const = 0;
|
||||||
virtual MessageBuffer encode() const = 0;
|
virtual MessageBuffer encode() const = 0;
|
||||||
|
|
||||||
Function<void()> on_destruction;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Message();
|
Message();
|
||||||
};
|
};
|
||||||
|
|
|
@ -78,9 +78,7 @@ OwnPtr<Messages::ProtocolServer::StartDownloadResponse> ClientConnection::handle
|
||||||
auto id = download->id();
|
auto id = download->id();
|
||||||
auto fd = download->download_fd();
|
auto fd = download->download_fd();
|
||||||
m_downloads.set(id, move(download));
|
m_downloads.set(id, move(download));
|
||||||
auto response = make<Messages::ProtocolServer::StartDownloadResponse>(id, fd);
|
return make<Messages::ProtocolServer::StartDownloadResponse>(id, IPC::File(fd, IPC::File::CloseAfterSending));
|
||||||
response->on_destruction = [fd] { close(fd); };
|
|
||||||
return response;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
OwnPtr<Messages::ProtocolServer::StopDownloadResponse> ClientConnection::handle(const Messages::ProtocolServer::StopDownload& message)
|
OwnPtr<Messages::ProtocolServer::StopDownloadResponse> ClientConnection::handle(const Messages::ProtocolServer::StopDownload& message)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue