summaryrefslogtreecommitdiff
path: root/Source/WebKit2/Platform/IPC/MessageReceiverMap.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebKit2/Platform/IPC/MessageReceiverMap.cpp
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/WebKit2/Platform/IPC/MessageReceiverMap.cpp')
-rw-r--r--Source/WebKit2/Platform/IPC/MessageReceiverMap.cpp46
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());