diff options
author | ukai@chromium.org <ukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-26 05:21:45 +0000 |
---|---|---|
committer | ukai@chromium.org <ukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-26 05:21:45 +0000 |
commit | 0ea955e597c99d8eb40a22f169c18c3c9b48e40e (patch) | |
tree | 603b0a831c41c6ce704156341f2e435f431d1745 | |
parent | cf4e2a6035cc02b7b0957264afdbb57981926b75 (diff) | |
download | chromium_src-0ea955e597c99d8eb40a22f169c18c3c9b48e40e.zip chromium_src-0ea955e597c99d8eb40a22f169c18c3c9b48e40e.tar.gz chromium_src-0ea955e597c99d8eb40a22f169c18c3c9b48e40e.tar.bz2 |
Delay OnClose actions.
If we reset delegate_ in OnClose, some pending tasks for DoOnReceivedData
would fail to notify received data to the delegate.
Don't reset delegate_ and socket_ in OnClose. Do it in DoOnClose instead.
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/326010
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@30036 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | webkit/tools/test_shell/simple_socket_stream_bridge.cc | 55 |
1 files changed, 34 insertions, 21 deletions
diff --git a/webkit/tools/test_shell/simple_socket_stream_bridge.cc b/webkit/tools/test_shell/simple_socket_stream_bridge.cc index 508b943..223b8c1 100644 --- a/webkit/tools/test_shell/simple_socket_stream_bridge.cc +++ b/webkit/tools/test_shell/simple_socket_stream_bridge.cc @@ -58,7 +58,7 @@ class WebSocketStreamHandleBridgeImpl void DoOnConnected(int max_amount_send_allowed); void DoOnSentData(int amount_sent); void DoOnReceivedData(std::vector<char>* data); - void DoOnClose(webkit_glue::WebSocketStreamHandleDelegate* delegate); + void DoOnClose(); int socket_id_; MessageLoop* message_loop_; @@ -66,6 +66,8 @@ class WebSocketStreamHandleBridgeImpl webkit_glue::WebSocketStreamHandleDelegate* delegate_; scoped_refptr<net::SocketStream> socket_; + // Number of pending tasks to handle net::SocketStream::Delegate methods. + int num_pending_tasks_; DISALLOW_COPY_AND_ASSIGN(WebSocketStreamHandleBridgeImpl); }; @@ -76,15 +78,16 @@ WebSocketStreamHandleBridgeImpl::WebSocketStreamHandleBridgeImpl( : socket_id_(kNoSocketId), message_loop_(MessageLoop::current()), handle_(handle), - delegate_(delegate) { + delegate_(delegate), + num_pending_tasks_(0) { } WebSocketStreamHandleBridgeImpl::~WebSocketStreamHandleBridgeImpl() { - CHECK(socket_id_ == kNoSocketId); + DCHECK_EQ(socket_id_, kNoSocketId); } void WebSocketStreamHandleBridgeImpl::Connect(const GURL& url) { - CHECK(g_io_thread); + DCHECK(g_io_thread); AddRef(); // Released in DoOnClose(). g_io_thread->PostTask( FROM_HERE, @@ -96,7 +99,7 @@ void WebSocketStreamHandleBridgeImpl::Connect(const GURL& url) { bool WebSocketStreamHandleBridgeImpl::Send( const std::vector<char>& data) { - CHECK(g_io_thread); + DCHECK(g_io_thread); g_io_thread->PostTask( FROM_HERE, NewRunnableMethod(this, &WebSocketStreamHandleBridgeImpl::DoSend, @@ -105,7 +108,7 @@ bool WebSocketStreamHandleBridgeImpl::Send( } void WebSocketStreamHandleBridgeImpl::Close() { - CHECK(g_io_thread); + DCHECK(g_io_thread); g_io_thread->PostTask( FROM_HERE, NewRunnableMethod(this, &WebSocketStreamHandleBridgeImpl::DoClose)); @@ -113,6 +116,7 @@ void WebSocketStreamHandleBridgeImpl::Close() { void WebSocketStreamHandleBridgeImpl::OnConnected( net::SocketStream* socket, int max_pending_send_allowed) { + ++num_pending_tasks_; message_loop_->PostTask( FROM_HERE, NewRunnableMethod(this, &WebSocketStreamHandleBridgeImpl::DoOnConnected, @@ -121,6 +125,7 @@ void WebSocketStreamHandleBridgeImpl::OnConnected( void WebSocketStreamHandleBridgeImpl::OnSentData( net::SocketStream* socket, int amount_sent) { + ++num_pending_tasks_; message_loop_->PostTask( FROM_HERE, NewRunnableMethod(this, &WebSocketStreamHandleBridgeImpl::DoOnSentData, @@ -129,6 +134,7 @@ void WebSocketStreamHandleBridgeImpl::OnSentData( void WebSocketStreamHandleBridgeImpl::OnReceivedData( net::SocketStream* socket, const char* data, int len) { + ++num_pending_tasks_; message_loop_->PostTask( FROM_HERE, NewRunnableMethod(this, @@ -137,25 +143,24 @@ void WebSocketStreamHandleBridgeImpl::OnReceivedData( } void WebSocketStreamHandleBridgeImpl::OnClose(net::SocketStream* socket) { - webkit_glue::WebSocketStreamHandleDelegate* delegate = delegate_; - delegate_ = NULL; - socket_ = 0; + ++num_pending_tasks_; + // Release socket_ on IO thread. + socket_ = NULL; socket_id_ = kNoSocketId; message_loop_->PostTask( FROM_HERE, - NewRunnableMethod(this, &WebSocketStreamHandleBridgeImpl::DoOnClose, - delegate)); + NewRunnableMethod(this, &WebSocketStreamHandleBridgeImpl::DoOnClose)); } void WebSocketStreamHandleBridgeImpl::DoConnect(const GURL& url) { - CHECK(MessageLoop::current() == g_io_thread); + DCHECK(MessageLoop::current() == g_io_thread); socket_ = new net::SocketStream(url, this); socket_->set_context(g_request_context); socket_->Connect(); } void WebSocketStreamHandleBridgeImpl::DoSend(std::vector<char>* data) { - CHECK(MessageLoop::current() == g_io_thread); + DCHECK(MessageLoop::current() == g_io_thread); scoped_ptr<std::vector<char> > scoped_data(data); if (!socket_) return; @@ -164,7 +169,7 @@ void WebSocketStreamHandleBridgeImpl::DoSend(std::vector<char>* data) { } void WebSocketStreamHandleBridgeImpl::DoClose() { - CHECK(MessageLoop::current() == g_io_thread); + DCHECK(MessageLoop::current() == g_io_thread); if (!socket_) return; socket_->Close(); @@ -172,29 +177,37 @@ void WebSocketStreamHandleBridgeImpl::DoClose() { void WebSocketStreamHandleBridgeImpl::DoOnConnected( int max_pending_send_allowed) { - CHECK(MessageLoop::current() == message_loop_); + DCHECK(MessageLoop::current() == message_loop_); + --num_pending_tasks_; if (delegate_) delegate_->DidOpenStream(handle_, max_pending_send_allowed); } void WebSocketStreamHandleBridgeImpl::DoOnSentData(int amount_sent) { - CHECK(MessageLoop::current() == message_loop_); + DCHECK(MessageLoop::current() == message_loop_); + --num_pending_tasks_; if (delegate_) delegate_->DidSendData(handle_, amount_sent); } void WebSocketStreamHandleBridgeImpl::DoOnReceivedData( std::vector<char>* data) { - CHECK(MessageLoop::current() == message_loop_); + DCHECK(MessageLoop::current() == message_loop_); + --num_pending_tasks_; scoped_ptr<std::vector<char> > scoped_data(data); if (delegate_) delegate_->DidReceiveData(handle_, &(data->at(0)), data->size()); } -void WebSocketStreamHandleBridgeImpl::DoOnClose( - webkit_glue::WebSocketStreamHandleDelegate* delegate) { - CHECK(MessageLoop::current() == message_loop_); - CHECK(!socket_); +void WebSocketStreamHandleBridgeImpl::DoOnClose() { + DCHECK(MessageLoop::current() == message_loop_); + --num_pending_tasks_; + // Don't handle OnClose if there are pending tasks. + DCHECK_EQ(num_pending_tasks_, 0); + DCHECK(!socket_); + DCHECK_EQ(socket_id_, kNoSocketId); + webkit_glue::WebSocketStreamHandleDelegate* delegate = delegate_; + delegate_ = NULL; if (delegate) delegate->DidClose(handle_); Release(); |