Bug 1353475 - Implement AutoIPCStream with delayed start - part 1 - changing the IPDL dictionaries for streams, r=smaug

This commit is contained in:
Andrea Marchesini 2017-04-24 12:09:39 +02:00
Родитель 2c51c21228
Коммит 1e2c2d6d29
2 изменённых файлов: 39 добавлений и 16 удалений

Просмотреть файл

@ -4,8 +4,10 @@
include protocol PChildToParentStream;
include protocol PParentToChildStream;
include BlobTypes;
include InputStreamParams;
include ProtocolTypes;
namespace mozilla {
namespace ipc {
@ -17,14 +19,24 @@ struct InputStreamParamsWithFds
OptionalFileDescriptorSet optionalFds;
};
union IPCRemoteStreamType
{
PChildToParentStream;
PParentToChildStream;
};
struct IPCRemoteStream
{
IPCRemoteStreamType stream;
};
// Use IPCStream or OptionalIPCStream in your ipdl to represent serialized
// nsIInputStreams. Then use AutoIPCStream from IPCStreamUtils.h to perform
// the serialization.
union IPCStream
{
InputStreamParamsWithFds;
PChildToParentStream;
PParentToChildStream;
IPCRemoteStream;
};
union OptionalIPCStream

Просмотреть файл

@ -36,8 +36,7 @@ namespace {
void
AssertValidValueToTake(const IPCStream& aVal)
{
MOZ_ASSERT(aVal.type() == IPCStream::TPChildToParentStreamChild ||
aVal.type() == IPCStream::TPParentToChildStreamParent ||
MOZ_ASSERT(aVal.type() == IPCStream::TIPCRemoteStream ||
aVal.type() == IPCStream::TInputStreamParamsWithFds);
}
@ -164,7 +163,11 @@ SerializeInputStream(nsIInputStream* aStream, IPCStream& aValue, M* aManager)
}
MOZ_ASSERT(asyncStream);
aValue = IPCStreamSource::Create(asyncStream, aManager);
IPCRemoteStream remoteStream;
remoteStream.stream() = IPCStreamSource::Create(asyncStream, aManager);
aValue = remoteStream;
return true;
}
@ -292,12 +295,16 @@ CleanupIPCStream(IPCStream& aValue, bool aConsumedByIPC)
return;
}
MOZ_ASSERT(aValue.type() == IPCStream::TIPCRemoteStream);
IPCRemoteStreamType& remoteInputStream =
aValue.get_IPCRemoteStream().stream();
IPCStreamSource* source = nullptr;
if (aValue.type() == IPCStream::TPChildToParentStreamChild) {
source = IPCStreamSource::Cast(aValue.get_PChildToParentStreamChild());
if (remoteInputStream.type() == IPCRemoteStreamType::TPChildToParentStreamChild) {
source = IPCStreamSource::Cast(remoteInputStream.get_PChildToParentStreamChild());
} else {
MOZ_ASSERT(aValue.type() == IPCStream::TPParentToChildStreamParent);
source = IPCStreamSource::Cast(aValue.get_PParentToChildStreamParent());
MOZ_ASSERT(remoteInputStream.type() == IPCRemoteStreamType::TPParentToChildStreamParent);
source = IPCStreamSource::Cast(remoteInputStream.get_PParentToChildStreamParent());
}
MOZ_ASSERT(source);
@ -348,15 +355,19 @@ NormalizeOptionalValue(nsIInputStream* aStream,
already_AddRefed<nsIInputStream>
DeserializeIPCStream(const IPCStream& aValue)
{
if (aValue.type() == IPCStream::TPChildToParentStreamParent) {
auto sendStream =
IPCStreamDestination::Cast(aValue.get_PChildToParentStreamParent());
return sendStream->TakeReader();
}
if (aValue.type() == IPCStream::TIPCRemoteStream) {
const IPCRemoteStreamType& remoteInputStream =
aValue.get_IPCRemoteStream().stream();
if (remoteInputStream.type() == IPCRemoteStreamType::TPChildToParentStreamParent) {
auto sendStream =
IPCStreamDestination::Cast(remoteInputStream.get_PChildToParentStreamParent());
return sendStream->TakeReader();
}
MOZ_ASSERT(remoteInputStream.type() == IPCRemoteStreamType::TPParentToChildStreamChild);
if (aValue.type() == IPCStream::TPParentToChildStreamChild) {
auto sendStream =
IPCStreamDestination::Cast(aValue.get_PParentToChildStreamChild());
IPCStreamDestination::Cast(remoteInputStream.get_PParentToChildStreamChild());
return sendStream->TakeReader();
}