diff options
Diffstat (limited to 'net/curvecp')
-rw-r--r-- | net/curvecp/curvecp_client_socket.cc | 5 | ||||
-rw-r--r-- | net/curvecp/curvecp_client_socket.h | 5 | ||||
-rw-r--r-- | net/curvecp/curvecp_server_socket.cc | 5 | ||||
-rw-r--r-- | net/curvecp/curvecp_server_socket.h | 7 | ||||
-rw-r--r-- | net/curvecp/messenger.cc | 38 | ||||
-rw-r--r-- | net/curvecp/messenger.h | 6 |
6 files changed, 55 insertions, 11 deletions
diff --git a/net/curvecp/curvecp_client_socket.cc b/net/curvecp/curvecp_client_socket.cc index 8074016..6772e38 100644 --- a/net/curvecp/curvecp_client_socket.cc +++ b/net/curvecp/curvecp_client_socket.cc @@ -105,6 +105,11 @@ int CurveCPClientSocket::Read(IOBuffer* buf, OldCompletionCallback* callback) { return messenger_.Read(buf, buf_len, callback); } +int CurveCPClientSocket::Read(IOBuffer* buf, + int buf_len, + const CompletionCallback& callback) { + return messenger_.Read(buf, buf_len, callback); +} int CurveCPClientSocket::Write(IOBuffer* buf, int buf_len, diff --git a/net/curvecp/curvecp_client_socket.h b/net/curvecp/curvecp_client_socket.h index 85f8817..8062c87 100644 --- a/net/curvecp/curvecp_client_socket.h +++ b/net/curvecp/curvecp_client_socket.h @@ -41,10 +41,13 @@ class CurveCPClientSocket : public StreamSocket { virtual int64 NumBytesRead() const OVERRIDE; virtual base::TimeDelta GetConnectTimeMicros() const OVERRIDE; - // Socket methods: + // Socket implementation. virtual int Read(IOBuffer* buf, int buf_len, OldCompletionCallback* callback) OVERRIDE; + virtual int Read(IOBuffer* buf, + int buf_len, + const CompletionCallback& callback) OVERRIDE; virtual int Write(IOBuffer* buf, int buf_len, OldCompletionCallback* callback) OVERRIDE; diff --git a/net/curvecp/curvecp_server_socket.cc b/net/curvecp/curvecp_server_socket.cc index 15185ff..6e7934c 100644 --- a/net/curvecp/curvecp_server_socket.cc +++ b/net/curvecp/curvecp_server_socket.cc @@ -52,6 +52,11 @@ int CurveCPServerSocket::Read(IOBuffer* buf, OldCompletionCallback* callback) { return messenger_.Read(buf, buf_len, callback); } +int CurveCPServerSocket::Read(IOBuffer* buf, + int buf_len, + const CompletionCallback& callback) { + return messenger_.Read(buf, buf_len, callback); +} int CurveCPServerSocket::Write(IOBuffer* buf, int buf_len, diff --git a/net/curvecp/curvecp_server_socket.h b/net/curvecp/curvecp_server_socket.h index 076eedc..a2ea1d7 100644 --- a/net/curvecp/curvecp_server_socket.h +++ b/net/curvecp/curvecp_server_socket.h @@ -33,17 +33,20 @@ class CurveCPServerSocket : public Socket, int Listen(const IPEndPoint& endpoint, Acceptor* acceptor); void Close(); - // Socket methods: + // Socket implementation. virtual int Read(IOBuffer* buf, int buf_len, OldCompletionCallback* callback) OVERRIDE; + virtual int Read(IOBuffer* buf, + int buf_len, + const CompletionCallback& callback) OVERRIDE; virtual int Write(IOBuffer* buf, int buf_len, OldCompletionCallback* callback) OVERRIDE; virtual bool SetReceiveBufferSize(int32 size) OVERRIDE; virtual bool SetSendBufferSize(int32 size) OVERRIDE; - // ServerMessenger::Acceptor methods: + // ServerMessenger::Acceptor implementation. virtual void OnAccept(ConnectionKey key) OVERRIDE; private: diff --git a/net/curvecp/messenger.cc b/net/curvecp/messenger.cc index 07f7d82..a99abda 100644 --- a/net/curvecp/messenger.cc +++ b/net/curvecp/messenger.cc @@ -59,7 +59,7 @@ Messenger::Messenger(Packetizer* packetizer) : packetizer_(packetizer), send_buffer_(kSendBufferSize), send_complete_callback_(NULL), - receive_complete_callback_(NULL), + old_receive_complete_callback_(NULL), pending_receive_length_(0), send_message_in_progress_(false), ALLOW_THIS_IN_INITIALIZER_LIST( @@ -72,7 +72,25 @@ Messenger::~Messenger() { int Messenger::Read(IOBuffer* buf, int buf_len, OldCompletionCallback* callback) { DCHECK(CalledOnValidThread()); - DCHECK(!receive_complete_callback_); + DCHECK(!old_receive_complete_callback_ && + receive_complete_callback_.is_null()); + + if (!received_list_.bytes_available()) { + old_receive_complete_callback_ = callback; + pending_receive_ = buf; + pending_receive_length_ = buf_len; + return ERR_IO_PENDING; + } + + int bytes_read = InternalRead(buf, buf_len); + DCHECK_LT(0, bytes_read); + return bytes_read; +} +int Messenger::Read(IOBuffer* buf, int buf_len, + const CompletionCallback& callback) { + DCHECK(CalledOnValidThread()); + DCHECK(!old_receive_complete_callback_ && + receive_complete_callback_.is_null()); if (!received_list_.bytes_available()) { receive_complete_callback_ = callback; @@ -338,12 +356,20 @@ void Messenger::RecvMessage() { } // If we have data available, and a read is pending, notify the callback. - if (received_list_.bytes_available() && receive_complete_callback_) { + if (received_list_.bytes_available() && + (old_receive_complete_callback_ || + !receive_complete_callback_.is_null())) { // Pass the data up to the caller. int bytes_read = InternalRead(pending_receive_, pending_receive_length_); - OldCompletionCallback* callback = receive_complete_callback_; - receive_complete_callback_ = NULL; - callback->Run(bytes_read); + if (old_receive_complete_callback_) { + OldCompletionCallback* callback = old_receive_complete_callback_; + old_receive_complete_callback_ = NULL; + callback->Run(bytes_read); + } else { + CompletionCallback callback = receive_complete_callback_; + receive_complete_callback_.Reset(); + callback.Run(bytes_read); + } } } diff --git a/net/curvecp/messenger.h b/net/curvecp/messenger.h index b6b2d69..bb67946 100644 --- a/net/curvecp/messenger.h +++ b/net/curvecp/messenger.h @@ -34,9 +34,10 @@ class Messenger : public base::NonThreadSafe, virtual ~Messenger(); int Read(IOBuffer* buf, int buf_len, OldCompletionCallback* callback); + int Read(IOBuffer* buf, int buf_len, const CompletionCallback& callback); int Write(IOBuffer* buf, int buf_len, OldCompletionCallback* callback); - // Packetizer::Listener methods: + // Packetizer::Listener implementation. virtual void OnConnection(ConnectionKey key) OVERRIDE; virtual void OnClose(Packetizer* packetizer, ConnectionKey key); virtual void OnMessage(Packetizer* packetizer, @@ -76,7 +77,8 @@ class Messenger : public base::NonThreadSafe, // The read_buffer is a list of pending data which has been unpacked from // messages and is awaiting delivery to the application. - OldCompletionCallback* receive_complete_callback_; + OldCompletionCallback* old_receive_complete_callback_; + CompletionCallback receive_complete_callback_; scoped_refptr<IOBuffer> pending_receive_; int pending_receive_length_; |