summaryrefslogtreecommitdiffstats
path: root/webkit/tools/test_shell/simple_socket_stream_bridge.cc
diff options
context:
space:
mode:
authorukai@chromium.org <ukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-26 05:21:45 +0000
committerukai@chromium.org <ukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-26 05:21:45 +0000
commit0ea955e597c99d8eb40a22f169c18c3c9b48e40e (patch)
tree603b0a831c41c6ce704156341f2e435f431d1745 /webkit/tools/test_shell/simple_socket_stream_bridge.cc
parentcf4e2a6035cc02b7b0957264afdbb57981926b75 (diff)
downloadchromium_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
Diffstat (limited to 'webkit/tools/test_shell/simple_socket_stream_bridge.cc')
-rw-r--r--webkit/tools/test_shell/simple_socket_stream_bridge.cc55
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();