Skip to content

Commit

Permalink
Drop IPC::Encoder::buffer() / bufferSize()
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=274568

Reviewed by Darin Adler.

Drop IPC::Encoder::buffer() / bufferSize(), in favor of span().

* Source/WebKit/Platform/IPC/Encoder.cpp:
(IPC::Encoder::wrapForTesting):
(IPC::Encoder::messageFlags):
(IPC::Encoder::messageFlags const):
* Source/WebKit/Platform/IPC/Encoder.h:
* Source/WebKit/Platform/IPC/cocoa/ConnectionCocoa.mm:
(IPC::Connection::sendOutgoingMessage):
* Source/WebKit/Shared/Daemon/DaemonUtilities.mm:
(WebKit::encoderToXPCData):
* Source/WebKit/UIProcess/WebProcessProxy.cpp:
(WebKit::WebProcessProxy::shouldSendPendingMessage):
* Source/WebKit/WebProcess/WebPage/IPCTestingAPI.cpp:
(WebKit::IPCTestingAPI::JSMessageListener::willSendMessage):
* Tools/TestWebKitAPI/Tests/IPC/ArgumentCoderTests.cpp:
(TestWebKitAPI::ArgumentCoderEncoderDecoderTest<IPC::Encoder>::encoderSize const):
(TestWebKitAPI::ArgumentCoderEncoderDecoderTest<IPC::Encoder>::createDecoder const):
* Tools/TestWebKitAPI/Tests/IPC/IPCSerialization.mm:
(SerializationTestSender::performSendWithAsyncReplyWithoutUsingIPCConnection const):
* Tools/TestWebKitAPI/Tests/IPC/IPCTestUtilities.h:
(TestWebKitAPI::copyViaEncoder):
* Tools/TestWebKitAPI/Tests/WebKitCocoa/WebPushDaemon.mm:
(TestWebKitAPI::WebPushXPCConnectionMessageSender::messageDictionaryFromEncoder const):

Canonical link: https://commits.webkit.org/279231@main
  • Loading branch information
cdumez committed May 23, 2024
1 parent f64d31c commit def81c6
Show file tree
Hide file tree
Showing 13 changed files with 37 additions and 36 deletions.
6 changes: 3 additions & 3 deletions Source/WebKit/Platform/IPC/Encoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ void Encoder::wrapForTesting(UniqueRef<Encoder>&& original)

original->setShouldDispatchMessageWhenWaitingForSyncReply(ShouldDispatchWhenWaitingForSyncReply::Yes);

*this << std::span(original->buffer(), original->bufferSize());
*this << original->span();

Vector<Attachment> attachments = original->releaseAttachments();
reserve(attachments.size());
Expand Down Expand Up @@ -169,12 +169,12 @@ OptionSet<MessageFlags>& Encoder::messageFlags()
{
// FIXME: We should probably pass an OptionSet<MessageFlags> into the Encoder constructor instead of encoding defaultMessageFlags then using this to change it later.
static_assert(sizeof(OptionSet<MessageFlags>::StorageType) == 1, "Encoder uses the first byte of the buffer for message flags.");
return *reinterpret_cast<OptionSet<MessageFlags>*>(buffer());
return *reinterpret_cast<OptionSet<MessageFlags>*>(m_buffer);
}

const OptionSet<MessageFlags>& Encoder::messageFlags() const
{
return *reinterpret_cast<OptionSet<MessageFlags>*>(buffer());
return *reinterpret_cast<OptionSet<MessageFlags>*>(m_buffer);
}

uint8_t* Encoder::grow(size_t alignment, size_t size)
Expand Down
2 changes: 0 additions & 2 deletions Source/WebKit/Platform/IPC/Encoder.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,6 @@ class Encoder final {
return *this;
}

uint8_t* buffer() const { return m_buffer; }
size_t bufferSize() const { return m_bufferSize; }
std::span<const uint8_t> span() const { return { m_buffer, m_bufferSize }; }

void addAttachment(Attachment&&);
Expand Down
13 changes: 8 additions & 5 deletions Source/WebKit/Platform/IPC/cocoa/ConnectionCocoa.mm
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ static void clearNoSenderNotifications(mach_port_t port)
auto numberOfPortDescriptors = attachments.size();

bool messageBodyIsOOL = false;
auto messageSize = MachMessage::messageSize(encoder->bufferSize(), numberOfPortDescriptors, messageBodyIsOOL);
auto messageSize = MachMessage::messageSize(encoder->span().size(), numberOfPortDescriptors, messageBodyIsOOL);
if (UNLIKELY(messageSize.hasOverflowed()))
return false;

Expand Down Expand Up @@ -316,17 +316,20 @@ static void clearNoSenderNotifications(mach_port_t port)

if (messageBodyIsOOL) {
auto* descriptor = getDescriptorAndAdvance(messageData, sizeof(mach_msg_ool_descriptor_t));
descriptor->out_of_line.address = encoder->buffer();
descriptor->out_of_line.size = encoder->bufferSize();
auto buffer = encoder->span();
descriptor->out_of_line.address = const_cast<uint8_t*>(buffer.data());
descriptor->out_of_line.size = buffer.size();
descriptor->out_of_line.copy = MACH_MSG_VIRTUAL_COPY;
descriptor->out_of_line.deallocate = false;
descriptor->out_of_line.type = MACH_MSG_OOL_DESCRIPTOR;
}
}

// Copy the data if it is not being sent out-of-line.
if (!messageBodyIsOOL)
memcpy(messageData, encoder->buffer(), encoder->bufferSize());
if (!messageBodyIsOOL) {
auto buffer = encoder->span();
memcpy(messageData, buffer.data(), buffer.size());
}

return sendMessage(WTFMove(message));
}
Expand Down
6 changes: 3 additions & 3 deletions Source/WebKit/Platform/IPC/unix/ConnectionUnix.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -407,7 +407,7 @@ bool Connection::sendOutgoingMessage(UniqueRef<Encoder>&& encoder)

size_t messageSizeWithBodyInline = sizeof(MessageInfo) + (outputMessage.attachments().size() * sizeof(AttachmentInfo)) + outputMessage.bodySize();
if (messageSizeWithBodyInline > messageMaxSize && outputMessage.bodySize()) {
RefPtr<WebCore::SharedMemory> oolMessageBody = WebCore::SharedMemory::allocate(outputMessage.bodySize());
RefPtr oolMessageBody = WebCore::SharedMemory::allocate(outputMessage.bodySize());
if (!oolMessageBody)
return false;

Expand All @@ -417,7 +417,7 @@ bool Connection::sendOutgoingMessage(UniqueRef<Encoder>&& encoder)

outputMessage.messageInfo().setBodyOutOfLine();

memcpy(oolMessageBody->data(), outputMessage.body(), outputMessage.bodySize());
memcpySpan(oolMessageBody->mutableSpan(), outputMessage.body());

outputMessage.appendAttachment(handle->releaseHandle());
}
Expand Down Expand Up @@ -485,7 +485,7 @@ bool Connection::sendOutputMessage(UnixMessage& outputMessage)
}

if (!messageInfo.isBodyOutOfLine() && outputMessage.bodySize()) {
iov[iovLength].iov_base = reinterpret_cast<void*>(outputMessage.body());
iov[iovLength].iov_base = reinterpret_cast<void*>(outputMessage.body().data());
iov[iovLength].iov_len = outputMessage.bodySize();
++iovLength;
}
Expand Down
17 changes: 9 additions & 8 deletions Source/WebKit/Platform/IPC/unix/UnixMessage.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@

#include "Attachment.h"
#include "Encoder.h"
#include <wtf/StdLibExtras.h>
#include <wtf/Vector.h>

namespace IPC {
Expand Down Expand Up @@ -81,8 +82,8 @@ class UnixMessage {
public:
UnixMessage(Encoder& encoder)
: m_attachments(encoder.releaseAttachments())
, m_messageInfo(encoder.bufferSize(), m_attachments.size())
, m_body(encoder.buffer())
, m_messageInfo(encoder.span().size(), m_attachments.size())
, m_body(const_cast<uint8_t*>(encoder.span().data()), encoder.span().size())
{
}

Expand All @@ -94,24 +95,24 @@ class UnixMessage {
std::swap(m_body, other.m_body);
std::swap(m_bodyOwned, other.m_bodyOwned);
} else if (!m_messageInfo.isBodyOutOfLine()) {
m_body = static_cast<uint8_t*>(fastMalloc(m_messageInfo.bodySize()));
memcpy(m_body, other.m_body, m_messageInfo.bodySize());
m_body = std::span { static_cast<uint8_t*>(fastMalloc(m_messageInfo.bodySize())), m_messageInfo.bodySize() };
memcpySpan(m_body, other.m_body);
m_bodyOwned = true;
other.m_body = nullptr;
other.m_body = { };
other.m_bodyOwned = false;
}
}

~UnixMessage()
{
if (m_bodyOwned)
fastFree(m_body);
fastFree(m_body.data());
}

const Vector<Attachment>& attachments() const { return m_attachments; }
MessageInfo& messageInfo() { return m_messageInfo; }

uint8_t* body() const { return m_body; }
std::span<uint8_t> body() const { return m_body; }
size_t bodySize() const { return m_messageInfo.bodySize(); }

void appendAttachment(Attachment&& attachment)
Expand All @@ -122,7 +123,7 @@ class UnixMessage {
private:
Vector<Attachment> m_attachments;
MessageInfo m_messageInfo;
uint8_t* m_body { nullptr };
std::span<uint8_t> m_body;
bool m_bodyOwned { false };
};

Expand Down
3 changes: 2 additions & 1 deletion Source/WebKit/Platform/IPC/win/ConnectionWin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,8 @@ bool Connection::sendOutgoingMessage(UniqueRef<Encoder>&& encoder)

// Write the outgoing message.

if (::WriteFile(m_connectionPipe, encoder->buffer(), encoder->bufferSize(), 0, &m_writeListener.state())) {
auto buffer = encoder->span();
if (::WriteFile(m_connectionPipe, buffer.data(), buffer.size(), 0, &m_writeListener.state())) {
// We successfully sent this message.
return true;
}
Expand Down
3 changes: 2 additions & 1 deletion Source/WebKit/Shared/Daemon/DaemonUtilities.mm
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,8 @@ void startListeningForMachServiceConnections(const char* serviceName, ASCIILiter
OSObjectPtr<xpc_object_t> encoderToXPCData(UniqueRef<IPC::Encoder>&& encoder)
{
__block auto blockEncoder = WTFMove(encoder);
auto dispatchData = adoptNS(dispatch_data_create(blockEncoder->buffer(), blockEncoder->bufferSize(), dispatch_get_main_queue(), ^{
auto buffer = blockEncoder->span();
auto dispatchData = adoptNS(dispatch_data_create(buffer.data(), buffer.size(), dispatch_get_main_queue(), ^{
// Explicitly clear out the encoder, destroying it.
blockEncoder.moveToUniquePtr();
}));
Expand Down
8 changes: 2 additions & 6 deletions Source/WebKit/UIProcess/WebProcessProxy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -587,9 +587,7 @@ void WebProcessProxy::platformGetLaunchOptions(ProcessLauncher::LaunchOptions& l
bool WebProcessProxy::shouldSendPendingMessage(const PendingMessage& message)
{
if (message.encoder->messageName() == IPC::MessageName::WebPage_LoadRequestWaitingForProcessLaunch) {
auto buffer = message.encoder->buffer();
auto bufferSize = message.encoder->bufferSize();
auto decoder = IPC::Decoder::create({ buffer, bufferSize }, { });
auto decoder = IPC::Decoder::create(message.encoder->span(), { });
ASSERT(decoder);
if (!decoder)
return false;
Expand All @@ -607,9 +605,7 @@ bool WebProcessProxy::shouldSendPendingMessage(const PendingMessage& message)
ASSERT_NOT_REACHED();
return false;
} else if (message.encoder->messageName() == IPC::MessageName::WebPage_GoToBackForwardItemWaitingForProcessLaunch) {
auto buffer = message.encoder->buffer();
auto bufferSize = message.encoder->bufferSize();
auto decoder = IPC::Decoder::create({ buffer, bufferSize }, { });
auto decoder = IPC::Decoder::create(message.encoder->span(), { });
ASSERT(decoder);
if (!decoder)
return false;
Expand Down
2 changes: 1 addition & 1 deletion Source/WebKit/WebProcess/WebPage/IPCTestingAPI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3043,7 +3043,7 @@ void JSMessageListener::willSendMessage(const IPC::Encoder& encoder, OptionSet<I
RELEASE_ASSERT(m_jsIPC);
Ref protectOwnerOfThis = *m_jsIPC;

auto decoder = IPC::Decoder::create({ encoder.buffer(), encoder.bufferSize() }, { });
auto decoder = IPC::Decoder::create(encoder.span(), { });
RunLoop::main().dispatch([this, protectOwnerOfThis = WTFMove(protectOwnerOfThis), decoder = WTFMove(decoder)] {
auto* globalObject = m_globalObject.get();
if (!globalObject)
Expand Down
6 changes: 3 additions & 3 deletions Tools/TestWebKitAPI/Tests/IPC/ArgumentCoderTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,16 +65,16 @@ class ArgumentCoderEncoderDecoderTest<IPC::Encoder> : public ::testing::Test {
void SetUp() override
{
m_encoder = makeUnique<IPC::Encoder>(EncoderDecoderTest::name(), 0);
ASSERT_EQ(m_encoder->bufferSize(), headerSize());
ASSERT_EQ(m_encoder->span().size(), headerSize());
}

IPC::Encoder& encoder() const { return *m_encoder; }
size_t headerSize() const { return 16; }
size_t encoderSize() const { return m_encoder->bufferSize(); }
size_t encoderSize() const { return m_encoder->span().size(); }

std::unique_ptr<IPC::Decoder> createDecoder() const
{
return IPC::Decoder::create({ m_encoder->buffer(), m_encoder->bufferSize() }, { });
return IPC::Decoder::create(m_encoder->span(), { });
}

private:
Expand Down
2 changes: 1 addition & 1 deletion Tools/TestWebKitAPI/Tests/IPC/IPCSerialization.mm
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ - (void)_setDistinguishedNames:(NSArray<NSData *> *)distinguishedNames;

bool SerializationTestSender::performSendWithAsyncReplyWithoutUsingIPCConnection(UniqueRef<IPC::Encoder>&& encoder, CompletionHandler<void(IPC::Decoder*)>&& completionHandler) const
{
auto decoder = IPC::Decoder::create({ encoder->buffer(), encoder->bufferSize() }, encoder->releaseAttachments());
auto decoder = IPC::Decoder::create(encoder->span(), encoder->releaseAttachments());
ASSERT(decoder);

completionHandler(decoder.get());
Expand Down
2 changes: 1 addition & 1 deletion Tools/TestWebKitAPI/Tests/IPC/IPCTestUtilities.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ std::optional<T> copyViaEncoder(const T& o)
{
IPC::Encoder encoder(static_cast<IPC::MessageName>(78), 0);
encoder << o;
auto decoder = IPC::Decoder::create({ encoder.buffer(), encoder.bufferSize() }, encoder.releaseAttachments());
auto decoder = IPC::Decoder::create(encoder.span(), encoder.releaseAttachments());
return decoder->decode<T>();
}

Expand Down
3 changes: 2 additions & 1 deletion Tools/TestWebKitAPI/Tests/WebKitCocoa/WebPushDaemon.mm
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,8 @@ static void cleanUpTestWebPushD(NSURL *tempDir)
xpc_dictionary_set_uint64(dictionary.get(), WebKit::WebPushD::protocolVersionKey, protocolVersion);

__block auto blockEncoder = WTFMove(encoder);
auto dispatchData = adoptNS(dispatch_data_create(blockEncoder->buffer(), blockEncoder->bufferSize(), dispatch_get_main_queue(), ^{
auto buffer = blockEncoder->span();
auto dispatchData = adoptNS(dispatch_data_create(buffer.data(), buffer.size(), dispatch_get_main_queue(), ^{
// Explicitly clear out the encoder, destroying it.
blockEncoder.moveToUniquePtr();
}));
Expand Down

0 comments on commit def81c6

Please sign in to comment.