diff options
author | Andras Becsi <andras.becsi@digia.com> | 2013-12-11 21:33:03 +0100 |
---|---|---|
committer | Andras Becsi <andras.becsi@digia.com> | 2013-12-13 12:34:07 +0100 |
commit | f2a33ff9cbc6d19943f1c7fbddd1f23d23975577 (patch) | |
tree | 0586a32aa390ade8557dfd6b4897f43a07449578 /chromium/base/async_socket_io_handler.h | |
parent | 5362912cdb5eea702b68ebe23702468d17c3017a (diff) | |
download | qtwebengine-chromium-f2a33ff9cbc6d19943f1c7fbddd1f23d23975577.tar.gz |
Update Chromium to branch 1650 (31.0.1650.63)
Change-Id: I57d8c832eaec1eb2364e0a8e7352a6dd354db99f
Reviewed-by: Jocelyn Turcotte <jocelyn.turcotte@digia.com>
Diffstat (limited to 'chromium/base/async_socket_io_handler.h')
-rw-r--r-- | chromium/base/async_socket_io_handler.h | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/chromium/base/async_socket_io_handler.h b/chromium/base/async_socket_io_handler.h new file mode 100644 index 00000000000..2f4b13d74a1 --- /dev/null +++ b/chromium/base/async_socket_io_handler.h @@ -0,0 +1,110 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_ASYNC_SOCKET_IO_HANDLER_H_ +#define BASE_ASYNC_SOCKET_IO_HANDLER_H_ + +#include "base/message_loop/message_loop.h" +#include "base/sync_socket.h" +#include "base/threading/non_thread_safe.h" + +namespace base { + +// Extends the CancelableSyncSocket class to allow reading from a socket +// asynchronously on a TYPE_IO message loop thread. This makes it easy to share +// a thread that uses a message loop (e.g. for IPC and other things) and not +// require a separate thread to read from the socket. +// +// Example usage (also see the unit tests): +// +// class SocketReader { +// public: +// SocketReader(base::CancelableSyncSocket* socket) +// : socket_(socket), buffer_() { +// io_handler.Initialize(socket_->handle(), +// base::Bind(&SocketReader::OnDataAvailable, +// base::Unretained(this)); +// } +// +// void AsyncRead() { +// CHECK(io_handler.Read(&buffer_[0], sizeof(buffer_))); +// } +// +// private: +// void OnDataAvailable(int bytes_read) { +// if (ProcessData(&buffer_[0], bytes_read)) { +// // Issue another read. +// CHECK(io_handler.Read(&buffer_[0], sizeof(buffer_))); +// } +// } +// +// base::AsyncSocketIoHandler io_handler; +// base::CancelableSyncSocket* socket_; +// char buffer_[kBufferSize]; +// }; +// +class BASE_EXPORT AsyncSocketIoHandler + : public NON_EXPORTED_BASE(base::NonThreadSafe), +// The message loop callback interface is different based on platforms. +#if defined(OS_WIN) + public NON_EXPORTED_BASE(base::MessageLoopForIO::IOHandler) { +#else + public NON_EXPORTED_BASE(base::MessageLoopForIO::Watcher) { +#endif + public: + AsyncSocketIoHandler(); + virtual ~AsyncSocketIoHandler(); + + // Type definition for the callback. The parameter tells how many + // bytes were read and is 0 if an error occurred. + typedef base::Callback<void(int)> ReadCompleteCallback; + + // Initializes the AsyncSocketIoHandler by hooking it up to the current + // thread's message loop (must be TYPE_IO), to do async reads from the socket + // on the current thread. The |callback| will be invoked whenever a Read() + // has completed. + bool Initialize(base::SyncSocket::Handle socket, + const ReadCompleteCallback& callback); + + // Attempts to read from the socket. The return value will be |false| + // if an error occurred and |true| if data was read or a pending read + // was issued. Regardless of async or sync operation, the + // ReadCompleteCallback (see above) will be called when data is available. + bool Read(char* buffer, int buffer_len); + + private: +#if defined(OS_WIN) + // Implementation of IOHandler on Windows. + virtual void OnIOCompleted(base::MessageLoopForIO::IOContext* context, + DWORD bytes_transfered, + DWORD error) OVERRIDE; +#elif defined(OS_POSIX) + // Implementation of base::MessageLoopForIO::Watcher. + virtual void OnFileCanWriteWithoutBlocking(int socket) OVERRIDE {} + virtual void OnFileCanReadWithoutBlocking(int socket) OVERRIDE; + + void EnsureWatchingSocket(); +#endif + + base::SyncSocket::Handle socket_; +#if defined(OS_WIN) + base::MessageLoopForIO::IOContext* context_; + bool is_pending_; +#elif defined(OS_POSIX) + base::MessageLoopForIO::FileDescriptorWatcher socket_watcher_; + // |pending_buffer_| and |pending_buffer_len_| are valid only between + // Read() and OnFileCanReadWithoutBlocking(). + char* pending_buffer_; + int pending_buffer_len_; + // |true| iff the message loop is watching the socket for IO events. + bool is_watching_; +#endif + ReadCompleteCallback read_complete_; + + DISALLOW_COPY_AND_ASSIGN(AsyncSocketIoHandler); +}; + +} // namespace base. + +#endif // BASE_ASYNC_SOCKET_IO_HANDLER_H_ |