diff options
author | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-21 22:13:31 +0000 |
---|---|---|
committer | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-21 22:13:31 +0000 |
commit | 4d5a37cdab721adbb9f64a3a0a11be16df8f91e1 (patch) | |
tree | 3f64283331452a383f94f6890ba6e812b2776f9c /chrome/browser/worker_host/message_port_dispatcher.cc | |
parent | b78e168b1640e456e1fc5a1ca8956a4a50c7df94 (diff) | |
download | chromium_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.cc | 11 |
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); |