Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/socket/tcp_client_socket_win.h" | 5 #include "net/socket/tcp_client_socket_win.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
| 9 #include "base/field_trial.h" // for SlowStart trial | 9 #include "base/field_trial.h" // for SlowStart trial |
| 10 #include "base/memory_debug.h" | 10 #include "base/memory_debug.h" |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 119 //----------------------------------------------------------------------------- | 119 //----------------------------------------------------------------------------- |
| 120 | 120 |
| 121 // This class encapsulates all the state that has to be preserved as long as | 121 // This class encapsulates all the state that has to be preserved as long as |
| 122 // there is a network IO operation in progress. If the owner TCPClientSocketWin | 122 // there is a network IO operation in progress. If the owner TCPClientSocketWin |
| 123 // is destroyed while an operation is in progress, the Core is detached and it | 123 // is destroyed while an operation is in progress, the Core is detached and it |
| 124 // lives until the operation completes and the OS doesn't reference any resource | 124 // lives until the operation completes and the OS doesn't reference any resource |
| 125 // declared on this class anymore. | 125 // declared on this class anymore. |
| 126 class TCPClientSocketWin::Core : public base::RefCounted<Core> { | 126 class TCPClientSocketWin::Core : public base::RefCounted<Core> { |
| 127 public: | 127 public: |
| 128 explicit Core(TCPClientSocketWin* socket); | 128 explicit Core(TCPClientSocketWin* socket); |
| 129 ~Core(); | |
| 130 | 129 |
| 131 // Start watching for the end of a read or write operation. | 130 // Start watching for the end of a read or write operation. |
| 132 void WatchForRead(); | 131 void WatchForRead(); |
| 133 void WatchForWrite(); | 132 void WatchForWrite(); |
| 134 | 133 |
| 135 // The TCPClientSocketWin is going away. | 134 // The TCPClientSocketWin is going away. |
| 136 void Detach() { socket_ = NULL; } | 135 void Detach() { socket_ = NULL; } |
| 137 | 136 |
| 138 // The separate OVERLAPPED variables for asynchronous operation. | 137 // The separate OVERLAPPED variables for asynchronous operation. |
| 139 // |read_overlapped_| is used for both Connect() and Read(). | 138 // |read_overlapped_| is used for both Connect() and Read(). |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 154 return size; | 153 return size; |
| 155 | 154 |
| 156 if (slow_start_throttle_ < kMaxSlowStartThrottle) { | 155 if (slow_start_throttle_ < kMaxSlowStartThrottle) { |
| 157 size = std::min(size, slow_start_throttle_); | 156 size = std::min(size, slow_start_throttle_); |
| 158 slow_start_throttle_ *= 2; | 157 slow_start_throttle_ *= 2; |
| 159 } | 158 } |
| 160 return size; | 159 return size; |
| 161 } | 160 } |
| 162 | 161 |
| 163 private: | 162 private: |
| 163 friend class base::RefCounted<Core>; | |
| 164 | |
| 165 ~Core(); | |
|
eroman
2009/11/05 20:52:19
nit: move this after the inner class definitions.
jam
2009/11/05 21:56:02
Done.
| |
| 166 | |
| 164 class ReadDelegate : public base::ObjectWatcher::Delegate { | 167 class ReadDelegate : public base::ObjectWatcher::Delegate { |
| 165 public: | 168 public: |
| 166 explicit ReadDelegate(Core* core) : core_(core) {} | 169 explicit ReadDelegate(Core* core) : core_(core) {} |
| 167 virtual ~ReadDelegate() {} | 170 virtual ~ReadDelegate() {} |
| 168 | 171 |
| 169 // base::ObjectWatcher::Delegate methods: | 172 // base::ObjectWatcher::Delegate methods: |
| 170 virtual void OnObjectSignaled(HANDLE object); | 173 virtual void OnObjectSignaled(HANDLE object); |
| 171 | 174 |
| 172 private: | 175 private: |
| 173 Core* const core_; | 176 Core* const core_; |
| (...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 691 BOOL ok = WSAGetOverlappedResult(socket_, &core_->write_overlapped_, | 694 BOOL ok = WSAGetOverlappedResult(socket_, &core_->write_overlapped_, |
| 692 &num_bytes, FALSE, &flags); | 695 &num_bytes, FALSE, &flags); |
| 693 WSAResetEvent(core_->write_overlapped_.hEvent); | 696 WSAResetEvent(core_->write_overlapped_.hEvent); |
| 694 TRACE_EVENT_END("socket.write", this, StringPrintf("%d bytes", num_bytes)); | 697 TRACE_EVENT_END("socket.write", this, StringPrintf("%d bytes", num_bytes)); |
| 695 waiting_write_ = false; | 698 waiting_write_ = false; |
| 696 core_->write_iobuffer_ = NULL; | 699 core_->write_iobuffer_ = NULL; |
| 697 DoWriteCallback(ok ? num_bytes : MapWinsockError(WSAGetLastError())); | 700 DoWriteCallback(ok ? num_bytes : MapWinsockError(WSAGetLastError())); |
| 698 } | 701 } |
| 699 | 702 |
| 700 } // namespace net | 703 } // namespace net |
| OLD | NEW |