diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/base/listen_socket.cc | 28 | ||||
-rw-r--r-- | net/base/listen_socket.h | 21 | ||||
-rw-r--r-- | net/base/listen_socket_unittest.h | 3 | ||||
-rw-r--r-- | net/base/telnet_server.cc | 10 | ||||
-rw-r--r-- | net/base/telnet_server.h | 7 | ||||
-rw-r--r-- | net/base/telnet_server_unittest.cc | 2 | ||||
-rw-r--r-- | net/url_request/url_request_file_job.cc | 11 | ||||
-rw-r--r-- | net/url_request/url_request_file_job.h | 17 |
8 files changed, 47 insertions, 52 deletions
diff --git a/net/base/listen_socket.cc b/net/base/listen_socket.cc index 4893dcc..182aa63 100644 --- a/net/base/listen_socket.cc +++ b/net/base/listen_socket.cc @@ -33,27 +33,23 @@ #include "net/base/listen_socket.h" -#include "base/thread.h" - #define READ_BUF_SIZE 200 -ListenSocket::ListenSocket(SOCKET s, ListenSocketDelegate *del, - MessageLoop *loop) - : socket_(s), socket_delegate_(del), loop_(loop) { +ListenSocket::ListenSocket(SOCKET s, ListenSocketDelegate *del) + : socket_(s), + socket_delegate_(del) { socket_event_ = WSACreateEvent(); WSAEventSelect(socket_, socket_event_, FD_ACCEPT | FD_CLOSE | FD_READ); - loop_->WatchObject(socket_event_, this); + watcher_.StartWatching(socket_event_, this); } ListenSocket::~ListenSocket() { - DCHECK(MessageLoop::current() == loop_); if (socket_event_) { - loop_->WatchObject(socket_event_, NULL); + watcher_.StopWatching(); WSACloseEvent(socket_event_); } - if (socket_) { + if (socket_) closesocket(socket_); - } } SOCKET ListenSocket::Listen(std::string ip, int port) { @@ -72,12 +68,12 @@ SOCKET ListenSocket::Listen(std::string ip, int port) { } ListenSocket* ListenSocket::Listen(std::string ip, int port, - ListenSocketDelegate* del, MessageLoop* l) { + ListenSocketDelegate* del) { SOCKET s = Listen(ip, port); if (s == INVALID_SOCKET) { // TODO(erikkay): error handling } else { - ListenSocket* sock = new ListenSocket(s, del, l); + ListenSocket* sock = new ListenSocket(s, del); sock->Listen(); return sock; } @@ -85,7 +81,6 @@ ListenSocket* ListenSocket::Listen(std::string ip, int port, } void ListenSocket::Listen() { - DCHECK(MessageLoop::current() == loop_); int backlog = 10; // TODO(erikkay): maybe don't allow any backlog? listen(socket_, backlog); // TODO(erikkay): handle error @@ -109,7 +104,7 @@ void ListenSocket::Accept() { // TODO } else { scoped_refptr<ListenSocket> sock = - new ListenSocket(conn, socket_delegate_, loop_); + new ListenSocket(conn, socket_delegate_); // it's up to the delegate to AddRef if it wants to keep it around socket_delegate_->DidAccept(this, sock); } @@ -150,6 +145,10 @@ void ListenSocket::OnObjectSignaled(HANDLE object) { // TODO return; } + + // The object was reset by WSAEnumNetworkEvents. Watch for the next signal. + watcher_.StartWatching(object, this); + if (ev.lNetworkEvents == 0) { // Occasionally the event is set even though there is no new data. // The net seems to think that this is ignorable. @@ -167,7 +166,6 @@ void ListenSocket::OnObjectSignaled(HANDLE object) { } void ListenSocket::SendInternal(const char* bytes, int len) { - DCHECK(MessageLoop::current() == loop_); int sent = send(socket_, bytes, len, 0); if (sent == SOCKET_ERROR) { // TODO diff --git a/net/base/listen_socket.h b/net/base/listen_socket.h index 92df390..f9c6a83 100644 --- a/net/base/listen_socket.h +++ b/net/base/listen_socket.h @@ -33,18 +33,18 @@ // happen in that loop's thread always and that all other methods (including // constructors and destructors) should also be called from the same thread. -#ifndef NET_BASE_SOCKET_H__ -#define NET_BASE_SOCKET_H__ +#ifndef NET_BASE_SOCKET_H_ +#define NET_BASE_SOCKET_H_ #include "base/basictypes.h" -#include "base/message_loop.h" +#include "base/object_watcher.h" #include "base/ref_counted.h" #include <winsock2.h> // Implements a raw socket interface class ListenSocket : public base::RefCountedThreadSafe<ListenSocket>, - public MessageLoop::Watcher { + public base::ObjectWatcher::Delegate { public: // TODO(erikkay): this delegate should really be split into two parts // to split up the listener from the connected socket. Perhaps this class @@ -62,8 +62,7 @@ class ListenSocket : public base::RefCountedThreadSafe<ListenSocket>, // Listen on port for the specified IP address. Use 127.0.0.1 to only // accept local connections. static ListenSocket* Listen(std::string ip, int port, - ListenSocketDelegate* del, - MessageLoop* loop); + ListenSocketDelegate* del); virtual ~ListenSocket(); // send data to the socket @@ -71,14 +70,14 @@ class ListenSocket : public base::RefCountedThreadSafe<ListenSocket>, void Send(const std::string& str, bool append_linefeed = false); protected: - ListenSocket(SOCKET s, ListenSocketDelegate* del, MessageLoop* loop); + ListenSocket(SOCKET s, ListenSocketDelegate* del); static SOCKET Listen(std::string ip, int port); // if valid, returned SOCKET is non-blocking static SOCKET Accept(SOCKET s); virtual void SendInternal(const char* bytes, int len); - // MessageLoop watcher callback + // ObjectWatcher delegate virtual void OnObjectSignaled(HANDLE object); virtual void Listen(); @@ -89,11 +88,11 @@ class ListenSocket : public base::RefCountedThreadSafe<ListenSocket>, SOCKET socket_; HANDLE socket_event_; ListenSocketDelegate *socket_delegate_; - MessageLoop* loop_; + + base::ObjectWatcher watcher_; private: - DISALLOW_EVIL_CONSTRUCTORS(ListenSocket); }; -#endif // BASE_SOCKET_H__ +#endif // NET_BASE_SOCKET_H_ diff --git a/net/base/listen_socket_unittest.h b/net/base/listen_socket_unittest.h index 243696c..57b4316 100644 --- a/net/base/listen_socket_unittest.h +++ b/net/base/listen_socket_unittest.h @@ -37,6 +37,7 @@ #include "base/basictypes.h" #include "base/logging.h" +#include "base/message_loop.h" #include "base/string_util.h" #include "base/thread.h" #include "net/base/listen_socket.h" @@ -81,7 +82,7 @@ class ListenSocketTester : public base::RefCountedThreadSafe<ListenSocketTester> { protected: virtual ListenSocket* DoListen() { - return ListenSocket::Listen("127.0.0.1", TEST_PORT, this, loop_); + return ListenSocket::Listen("127.0.0.1", TEST_PORT, this); } public: diff --git a/net/base/telnet_server.cc b/net/base/telnet_server.cc index 75d9361..82506a0 100644 --- a/net/base/telnet_server.cc +++ b/net/base/telnet_server.cc @@ -90,8 +90,8 @@ class TelnetProtocol { /////////////////////// // must run in the IO thread -TelnetServer::TelnetServer(SOCKET s, ListenSocketDelegate* del, MessageLoop *l) - : ListenSocket(s, del, l) { +TelnetServer::TelnetServer(SOCKET s, ListenSocketDelegate* del) + : ListenSocket(s, del) { input_state_ = NOT_IN_IAC_OR_ESC_SEQUENCE; } @@ -133,7 +133,7 @@ void TelnetServer::Accept() { // TODO } else { scoped_refptr<TelnetServer> sock = - new TelnetServer(conn, socket_delegate_, loop_); + new TelnetServer(conn, socket_delegate_); // Setup the way we want to communicate sock->SendIAC(TelnetProtocol::DO, TelnetProtocol::ECHO); @@ -148,12 +148,12 @@ void TelnetServer::Accept() { } TelnetServer* TelnetServer::Listen(std::string ip, int port, - ListenSocketDelegate *del, MessageLoop* l) { + ListenSocketDelegate *del) { SOCKET s = ListenSocket::Listen(ip, port); if (s == INVALID_SOCKET) { // TODO } else { - TelnetServer *serv = new TelnetServer(s, del, l); + TelnetServer *serv = new TelnetServer(s, del); serv->Listen(); return serv; } diff --git a/net/base/telnet_server.h b/net/base/telnet_server.h index 8b509be..45697c8 100644 --- a/net/base/telnet_server.h +++ b/net/base/telnet_server.h @@ -38,8 +38,7 @@ class TelnetServer : public ListenSocket { public: static TelnetServer* Listen(std::string ip, int port, - ListenSocketDelegate *del, - MessageLoop* loop); + ListenSocketDelegate *del); virtual ~TelnetServer(); protected: @@ -61,7 +60,7 @@ private: EXPECTING_NUMBER_SEMICOLON_OR_END // Processing "ESC [" sequence. }; - TelnetServer(SOCKET s, ListenSocketDelegate* del, MessageLoop* loop); + TelnetServer(SOCKET s, ListenSocketDelegate* del); // telnet commands void SendIAC(int command, int option); @@ -75,4 +74,4 @@ private: DISALLOW_EVIL_CONSTRUCTORS(TelnetServer); }; -#endif // BASE_TELNET_SERVER_H_
\ No newline at end of file +#endif // BASE_TELNET_SERVER_H_ diff --git a/net/base/telnet_server_unittest.cc b/net/base/telnet_server_unittest.cc index 2ec1164..5cdf99a 100644 --- a/net/base/telnet_server_unittest.cc +++ b/net/base/telnet_server_unittest.cc @@ -39,7 +39,7 @@ const std::string CRLF("\r\n"); class TelnetServerTester : public ListenSocketTester { public: virtual ListenSocket* DoListen() { - return TelnetServer::Listen("127.0.0.1", TEST_PORT, this, loop_); + return TelnetServer::Listen("127.0.0.1", TEST_PORT, this); } virtual void SetUp() { diff --git a/net/url_request/url_request_file_job.cc b/net/url_request/url_request_file_job.cc index a738b3a..9f828d4 100644 --- a/net/url_request/url_request_file_job.cc +++ b/net/url_request/url_request_file_job.cc @@ -40,7 +40,7 @@ // attempts to read more from the file to fill its buffer. If reading from the // file does not complete synchronously, then the URLRequestFileJob waits for a // signal from the OS that the overlapped read has completed. It does so by -// leveraging the MessageLoop::WatchObject API. +// leveraging the ObjectWatcher API. #include <process.h> #include <windows.h> @@ -57,6 +57,7 @@ #include "net/url_request/url_request.h" #include "net/url_request/url_request_file_dir_job.h" +// TODO(darin): The file job should not depend on WinInet!! using net::WinInetUtil; namespace { @@ -165,7 +166,7 @@ void URLRequestFileJob::Start() { void URLRequestFileJob::Kill() { // If we are killed while waiting for an overlapped result... if (is_waiting_) { - MessageLoop::current()->WatchObject(overlapped_.hEvent, NULL); + watcher_.StopWatching(); is_waiting_ = false; Release(); } @@ -203,7 +204,7 @@ bool URLRequestFileJob::ReadRawData(char* dest, int dest_size, DWORD err = GetLastError(); if (err == ERROR_IO_PENDING) { // OK, wait for the object to become signaled - MessageLoop::current()->WatchObject(overlapped_.hEvent, this); + watcher_.StartWatching(overlapped_.hEvent, this); is_waiting_ = true; SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0)); AddRef(); @@ -284,9 +285,7 @@ void URLRequestFileJob::OnObjectSignaled(HANDLE object) { DCHECK(overlapped_.hEvent == object); DCHECK(is_waiting_); - // We'll resume watching this handle if need be when we do - // another IO. - MessageLoop::current()->WatchObject(object, NULL); + // We'll resume watching this handle if need be when we do another IO. is_waiting_ = false; DWORD bytes_read = 0; diff --git a/net/url_request/url_request_file_job.h b/net/url_request/url_request_file_job.h index 1851444..d5e63fb 100644 --- a/net/url_request/url_request_file_job.h +++ b/net/url_request/url_request_file_job.h @@ -27,11 +27,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -#ifndef BASE_URL_REQUEST_URL_REQUEST_FILE_JOB_H__ -#define BASE_URL_REQUEST_URL_REQUEST_FILE_JOB_H__ +#ifndef BASE_URL_REQUEST_URL_REQUEST_FILE_JOB_H_ +#define BASE_URL_REQUEST_URL_REQUEST_FILE_JOB_H_ #include "base/lock.h" #include "base/message_loop.h" +#include "base/object_watcher.h" #include "base/thread.h" #include "net/url_request/url_request.h" #include "net/url_request/url_request_job.h" @@ -39,7 +40,7 @@ // A request job that handles reading file URLs class URLRequestFileJob : public URLRequestJob, - protected MessageLoop::Watcher { + public base::ObjectWatcher::Delegate { public: URLRequestFileJob(URLRequest* request); virtual ~URLRequestFileJob(); @@ -62,13 +63,10 @@ class URLRequestFileJob : public URLRequestJob, std::wstring file_path_; private: - // The net util test wants to run our FileURLToFilePath function. - FRIEND_TEST(NetUtilTest, FileURLConversion); - void CloseHandles(); void StartAsync(); - // MessageLoop::Watcher callback + // base::ObjectWatcher::Delegate implementation: virtual void OnObjectSignaled(HANDLE object); // We use overlapped reads to ensure that reads from network file systems do @@ -79,6 +77,8 @@ class URLRequestFileJob : public URLRequestJob, bool is_directory_; // true when the file request is for a direcotry. bool is_not_found_; // true when the file requested does not exist. + base::ObjectWatcher watcher_; + // This lock ensure that the network_file_thread is not using the loop_ after // is has been set to NULL in Kill(). Lock loop_lock_; @@ -94,5 +94,4 @@ class URLRequestFileJob : public URLRequestJob, DISALLOW_EVIL_CONSTRUCTORS(URLRequestFileJob); }; - -#endif // BASE_URL_REQUEST_URL_REQUEST_FILE_JOB_H__ +#endif // BASE_URL_REQUEST_URL_REQUEST_FILE_JOB_H_ |