Chromium Code Reviews| Index: net/socket/ssl_client_socket_nss.cc |
| =================================================================== |
| --- net/socket/ssl_client_socket_nss.cc (revision 74087) |
| +++ net/socket/ssl_client_socket_nss.cc (working copy) |
| @@ -479,7 +479,8 @@ |
| predicted_npn_status_(kNextProtoUnsupported), |
| predicted_npn_proto_used_(false), |
| ssl_host_info_(ssl_host_info), |
| - dns_cert_checker_(dns_ctx) { |
| + dns_cert_checker_(dns_ctx), |
| + valid_thread_id_(base::kInvalidThreadId) { |
| EnterFunction(""); |
| } |
| @@ -627,6 +628,8 @@ |
| rv = OK; |
| } else { |
| user_connect_callback_ = callback; |
| + DetachFromThread(); |
| + EnsureThreadIdAssigned(); |
|
wtc
2011/02/11 22:43:50
Can you explain why you call DetachFromThread and
ramant (doing other things)
2011/02/11 23:42:41
Done.
|
| } |
| } else { |
| net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, NULL); |
| @@ -639,17 +642,19 @@ |
| void SSLClientSocketNSS::Disconnect() { |
| EnterFunction(""); |
| + // Shut down anything that may call us back (through buffer_send_callback_, |
| + // buffer_recv_callback, or handshake_io_callback_). |
| + verifier_.reset(); |
| + transport_->socket()->Disconnect(); |
| + |
| + CHECK(CalledOnValidThread()); |
| + |
| // TODO(wtc): Send SSL close_notify alert. |
| if (nss_fd_ != NULL) { |
| PR_Close(nss_fd_); |
| nss_fd_ = NULL; |
| } |
| - // Shut down anything that may call us back (through buffer_send_callback_, |
| - // buffer_recv_callback, or handshake_io_callback_). |
| - verifier_.reset(); |
| - transport_->socket()->Disconnect(); |
| - |
| // Reset object state |
| transport_send_busy_ = false; |
| transport_recv_busy_ = false; |
| @@ -2498,4 +2503,22 @@ |
| that->UpdateConnectionStatus(); |
| } |
| +void SSLClientSocketNSS::EnsureThreadIdAssigned() const { |
| + base::AutoLock auto_lock(lock_); |
| + if (valid_thread_id_ != base::kInvalidThreadId) |
| + return; |
| + valid_thread_id_ = base::PlatformThread::CurrentId(); |
| +} |
| + |
| +bool SSLClientSocketNSS::CalledOnValidThread() const { |
| + EnsureThreadIdAssigned(); |
| + base::AutoLock auto_lock(lock_); |
| + return valid_thread_id_ == base::PlatformThread::CurrentId(); |
| +} |
| + |
| +void SSLClientSocketNSS::DetachFromThread() { |
| + base::AutoLock auto_lock(lock_); |
| + valid_thread_id_ = base::kInvalidThreadId; |
| +} |
| + |
| } // namespace net |