Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(16)

Unified Diff: webkit/tools/test_shell/simple_socket_stream_bridge.cc

Issue 326010: Delay OnClose actions. (Closed)
Patch Set: s/there is/there are/ Created 11 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/tools/test_shell/simple_socket_stream_bridge.cc
diff --git a/webkit/tools/test_shell/simple_socket_stream_bridge.cc b/webkit/tools/test_shell/simple_socket_stream_bridge.cc
index 508b9439ff226483f78bdd1457c9b1ada6a6444a..223b8c1d3cafd0ac7f42498bf6e9bacd3d2fe6cd 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();
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698