gecko-dev/ipc/glue/ScopedPort.cpp
Nika Layzell c5447d3d6a Bug 1713148 - Part 2: Support port attachments on IPC messages, r=handyman
These port attachments are stored directly on the IPC::Message until the
message is ready to be routed to another process, at which point they will be
attached to the port in WillBeRoutedExternally. When the message is then
received on the other side, the ports will be re-extracted from the
UserMessageEvent before it is discarded and re-added to the IPC::Message so
that serializers only need to interact directly with the IPC::Message type.

Differential Revision: https://phabricator.services.mozilla.com/D116669
2021-06-22 18:17:24 +00:00

79 lines
2.2 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/ipc/ScopedPort.h"
#include "mozilla/ipc/NodeController.h"
#include "chrome/common/ipc_message_utils.h"
namespace mozilla::ipc {
void ScopedPort::Reset() {
if (mValid) {
mController->ClosePort(mPort);
}
mValid = false;
mPort = {};
mController = nullptr;
}
auto ScopedPort::Release() -> PortRef {
if (!mValid) {
return {};
}
mValid = false;
mController = nullptr;
return std::exchange(mPort, PortRef{});
}
ScopedPort::ScopedPort() = default;
ScopedPort::~ScopedPort() { Reset(); }
ScopedPort::ScopedPort(PortRef aPort, NodeController* aController)
: mValid(true), mPort(std::move(aPort)), mController(aController) {
MOZ_ASSERT(mPort.is_valid() && mController);
}
ScopedPort::ScopedPort(ScopedPort&& aOther)
: mValid(std::exchange(aOther.mValid, false)),
mPort(std::move(aOther.mPort)),
mController(std::move(aOther.mController)) {}
ScopedPort& ScopedPort::operator=(ScopedPort&& aOther) {
if (this != &aOther) {
Reset();
mValid = std::exchange(aOther.mValid, false);
mPort = std::move(aOther.mPort);
mController = std::move(aOther.mController);
}
return *this;
}
} // namespace mozilla::ipc
void IPC::ParamTraits<mozilla::ipc::ScopedPort>::Write(Message* aMsg,
paramType&& aParam) {
aMsg->WriteBool(aParam.IsValid());
if (!aParam.IsValid()) {
return;
}
aMsg->WritePort(std::move(aParam));
}
bool IPC::ParamTraits<mozilla::ipc::ScopedPort>::Read(const Message* aMsg,
PickleIterator* aIter,
paramType* aResult) {
bool isValid = false;
if (!aMsg->ReadBool(aIter, &isValid)) {
return false;
}
if (!isValid) {
*aResult = {};
return true;
}
return aMsg->ConsumePort(aIter, aResult);
}