summaryrefslogtreecommitdiffstats
path: root/chrome/browser/worker_host/message_port_dispatcher.cc
diff options
context:
space:
mode:
authorjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-21 22:13:31 +0000
committerjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-21 22:13:31 +0000
commit4d5a37cdab721adbb9f64a3a0a11be16df8f91e1 (patch)
tree3f64283331452a383f94f6890ba6e812b2776f9c /chrome/browser/worker_host/message_port_dispatcher.cc
parentb78e168b1640e456e1fc5a1ca8956a4a50c7df94 (diff)
downloadchromium_src-4d5a37cdab721adbb9f64a3a0a11be16df8f91e1.zip
chromium_src-4d5a37cdab721adbb9f64a3a0a11be16df8f91e1.tar.gz
chromium_src-4d5a37cdab721adbb9f64a3a0a11be16df8f91e1.tar.bz2
Fix race condition with message ports being dropped if sent before a worker starts.
BUG=22315 TEST=covered by worker-messageport-gc.html Review URL: http://codereview.chromium.org/208045 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@26749 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/worker_host/message_port_dispatcher.cc')
-rw-r--r--chrome/browser/worker_host/message_port_dispatcher.cc11
1 files changed, 10 insertions, 1 deletions
diff --git a/chrome/browser/worker_host/message_port_dispatcher.cc b/chrome/browser/worker_host/message_port_dispatcher.cc
index 41ebc37..c6e992d 100644
--- a/chrome/browser/worker_host/message_port_dispatcher.cc
+++ b/chrome/browser/worker_host/message_port_dispatcher.cc
@@ -193,8 +193,9 @@ void MessagePortDispatcher::OnQueueMessages(int message_port_id) {
}
MessagePort& port = message_ports_[message_port_id];
- port.queue_messages = true;
port.sender->Send(new WorkerProcessMsg_MessagesQueued(port.route_id));
+ port.queue_messages = true;
+ port.sender = NULL;
}
void MessagePortDispatcher::OnSendQueuedMessages(
@@ -212,6 +213,14 @@ void MessagePortDispatcher::OnSendQueuedMessages(
port.queued_messages.insert(port.queued_messages.begin(),
queued_messages.begin(),
queued_messages.end());
+ SendQueuedMessagesIfPossible(message_port_id);
+}
+
+void MessagePortDispatcher::SendQueuedMessagesIfPossible(int message_port_id) {
+ MessagePort& port = message_ports_[message_port_id];
+ if (port.queue_messages || !port.sender)
+ return;
+
for (QueuedMessages::iterator iter = port.queued_messages.begin();
iter != port.queued_messages.end(); ++iter) {
PostMessageTo(message_port_id, iter->first, iter->second);