diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebKit2/Platform/IPC/MessageReceiverMap.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebKit2/Platform/IPC/MessageReceiverMap.cpp')
-rw-r--r-- | Source/WebKit2/Platform/IPC/MessageReceiverMap.cpp | 46 |
1 files changed, 41 insertions, 5 deletions
diff --git a/Source/WebKit2/Platform/IPC/MessageReceiverMap.cpp b/Source/WebKit2/Platform/IPC/MessageReceiverMap.cpp index da6d7c5b3..aa5eba8df 100644 --- a/Source/WebKit2/Platform/IPC/MessageReceiverMap.cpp +++ b/Source/WebKit2/Platform/IPC/MessageReceiverMap.cpp @@ -26,7 +26,7 @@ #include "config.h" #include "MessageReceiverMap.h" -#include "MessageDecoder.h" +#include "Decoder.h" #include "MessageReceiver.h" namespace IPC { @@ -42,6 +42,8 @@ MessageReceiverMap::~MessageReceiverMap() void MessageReceiverMap::addMessageReceiver(StringReference messageReceiverName, MessageReceiver& messageReceiver) { ASSERT(!m_globalMessageReceivers.contains(messageReceiverName)); + + messageReceiver.willBeAddedToMessageReceiverMap(); m_globalMessageReceivers.set(messageReceiverName, &messageReceiver); } @@ -51,6 +53,7 @@ void MessageReceiverMap::addMessageReceiver(StringReference messageReceiverName, ASSERT(!m_messageReceivers.contains(std::make_pair(messageReceiverName, destinationID))); ASSERT(!m_globalMessageReceivers.contains(messageReceiverName)); + messageReceiver.willBeAddedToMessageReceiverMap(); m_messageReceivers.set(std::make_pair(messageReceiverName, destinationID), &messageReceiver); } @@ -58,23 +61,56 @@ void MessageReceiverMap::removeMessageReceiver(StringReference messageReceiverNa { ASSERT(m_globalMessageReceivers.contains(messageReceiverName)); - m_globalMessageReceivers.remove(messageReceiverName); + auto it = m_globalMessageReceivers.find(messageReceiverName); + it->value->willBeRemovedFromMessageReceiverMap(); + + m_globalMessageReceivers.remove(it); } void MessageReceiverMap::removeMessageReceiver(StringReference messageReceiverName, uint64_t destinationID) { ASSERT(m_messageReceivers.contains(std::make_pair(messageReceiverName, destinationID))); - m_messageReceivers.remove(std::make_pair(messageReceiverName, destinationID)); + auto it = m_messageReceivers.find(std::make_pair(messageReceiverName, destinationID)); + it->value->willBeRemovedFromMessageReceiverMap(); + + m_messageReceivers.remove(it); +} + +void MessageReceiverMap::removeMessageReceiver(MessageReceiver& messageReceiver) +{ + Vector<StringReference> globalReceiversToRemove; + for (auto& nameAndReceiver : m_globalMessageReceivers) { + if (nameAndReceiver.value == &messageReceiver) + globalReceiversToRemove.append(nameAndReceiver.key); + } + + for (auto& globalReceiverToRemove : globalReceiversToRemove) + removeMessageReceiver(globalReceiverToRemove); + + Vector<std::pair<StringReference, uint64_t>> receiversToRemove; + for (auto& nameAndIdAndReceiver : m_messageReceivers) { + if (nameAndIdAndReceiver.value == &messageReceiver) + receiversToRemove.append(std::make_pair(nameAndIdAndReceiver.key.first, nameAndIdAndReceiver.key.second)); + } + + for (auto& receiverToRemove : receiversToRemove) + removeMessageReceiver(receiverToRemove.first, receiverToRemove.second); } void MessageReceiverMap::invalidate() { + for (auto& messageReceiver : m_globalMessageReceivers.values()) + messageReceiver->willBeRemovedFromMessageReceiverMap(); m_globalMessageReceivers.clear(); + + + for (auto& messageReceiver : m_messageReceivers.values()) + messageReceiver->willBeRemovedFromMessageReceiverMap(); m_messageReceivers.clear(); } -bool MessageReceiverMap::dispatchMessage(Connection* connection, MessageDecoder& decoder) +bool MessageReceiverMap::dispatchMessage(Connection& connection, Decoder& decoder) { if (MessageReceiver* messageReceiver = m_globalMessageReceivers.get(decoder.messageReceiverName())) { ASSERT(!decoder.destinationID()); @@ -91,7 +127,7 @@ bool MessageReceiverMap::dispatchMessage(Connection* connection, MessageDecoder& return false; } -bool MessageReceiverMap::dispatchSyncMessage(Connection* connection, MessageDecoder& decoder, std::unique_ptr<MessageEncoder>& replyEncoder) +bool MessageReceiverMap::dispatchSyncMessage(Connection& connection, Decoder& decoder, std::unique_ptr<Encoder>& replyEncoder) { if (MessageReceiver* messageReceiver = m_globalMessageReceivers.get(decoder.messageReceiverName())) { ASSERT(!decoder.destinationID()); |