Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2161)

Unified Diff: remoting/base/buffered_socket_writer.h

Issue 1197853003: Add P2PDatagramSocket and P2PStreamSocket interfaces. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | remoting/base/buffered_socket_writer.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: remoting/base/buffered_socket_writer.h
diff --git a/remoting/base/buffered_socket_writer.h b/remoting/base/buffered_socket_writer.h
index c6012e37e8bc97efe98cc09ba43a876c01596a24..255b2e5d0f26911f267df2df51975c50b301b88b 100644
--- a/remoting/base/buffered_socket_writer.h
+++ b/remoting/base/buffered_socket_writer.h
@@ -8,10 +8,11 @@
#include <list>
#include "base/callback.h"
+#include "base/memory/weak_ptr.h"
#include "base/synchronization/lock.h"
-#include "base/threading/non_thread_safe.h"
+#include "base/threading/thread_checker.h"
+#include "net/base/completion_callback.h"
#include "net/base/io_buffer.h"
-#include "net/socket/socket.h"
namespace net {
class Socket;
@@ -19,105 +20,57 @@ class Socket;
namespace remoting {
-// BufferedSocketWriter and BufferedDatagramWriter implement write data queue
-// for stream and datagram sockets. BufferedSocketWriterBase is a base class
-// that implements base functionality common for streams and datagrams.
-// These classes are particularly useful when data comes from a thread
-// that doesn't own the socket, as Write() can be called from any thread.
-// Whenever new data is written it is just put in the queue, and then written
-// on the thread that owns the socket. GetBufferChunks() and GetBufferSize()
-// can be used to throttle writes.
-
-class BufferedSocketWriterBase : public base::NonThreadSafe {
+// BufferedSocketWriter implement write data queue for stream sockets.
+class BufferedSocketWriter {
public:
+ typedef base::Callback<int(const scoped_refptr<net::IOBuffer>& buf,
+ int buf_len,
+ const net::CompletionCallback& callback)>
+ WriteCallback;
typedef base::Callback<void(int)> WriteFailedCallback;
- BufferedSocketWriterBase();
- virtual ~BufferedSocketWriterBase();
+ static scoped_ptr<BufferedSocketWriter> CreateForSocket(
+ net::Socket* socket,
+ const WriteFailedCallback& write_failed_callback);
+
+ BufferedSocketWriter();
+ virtual ~BufferedSocketWriter();
- // Initializes the writer. Must be called on the thread that will be used
- // to access the socket in the future. |callback| will be called after each
- // failed write. Caller retains ownership of |socket|.
- // TODO(sergeyu): Change it so that it take ownership of |socket|.
- void Init(net::Socket* socket, const WriteFailedCallback& callback);
+ // Initializes the writer. |write_callback| is called to write data to the
+ // socket. |write_failed_callback| is called when write operation fails.
+ // Writing stops after the first failed write.
+ void Init(const WriteCallback& write_callback,
+ const WriteFailedCallback& write_failed_callback);
- // Puts a new data chunk in the buffer. Returns false and doesn't enqueue
- // the data if called before Init(). Can be called on any thread.
- bool Write(scoped_refptr<net::IOBufferWithSize> buffer,
+ // Puts a new data chunk in the buffer. Returns false if writing has stopped
+ // because of an error.
+ bool Write(const scoped_refptr<net::IOBufferWithSize>& buffer,
const base::Closure& done_task);
// Returns true when there is data waiting to be written.
bool has_data_pending() { return !queue_.empty(); }
- // Stops writing and drops current buffers. Must be called on the
- // network thread.
- void Close();
-
- protected:
+ private:
struct PendingPacket;
typedef std::list<PendingPacket*> DataQueue;
- DataQueue queue_;
-
- // Removes element from the front of the queue and returns |done_task| for
- // that element. Called from AdvanceBufferPosition() implementation, which
- // then returns result of this function to its caller.
- base::Closure PopQueue();
-
- // Following three methods must be implemented in child classes.
-
- // Returns next packet that needs to be written to the socket. Implementation
- // must set |*buffer| to nullptr if there is nothing left in the queue.
- virtual void GetNextPacket(net::IOBuffer** buffer, int* size) = 0;
+ // Returns true if the writer is closed due to an error.
+ bool is_closed();
- // Returns closure that must be executed or null closure if the last write
- // didn't complete any messages.
- virtual base::Closure AdvanceBufferPosition(int written) = 0;
-
- // This method is called whenever there is an error writing to the socket.
- virtual void OnError(int result) = 0;
-
- private:
void DoWrite();
- void HandleWriteResult(int result, bool* write_again);
+ void HandleWriteResult(int result);
void OnWritten(int result);
- // This method is called when an error is encountered.
- void HandleError(int result);
+ base::ThreadChecker thread_checker_;
- net::Socket* socket_;
+ WriteCallback write_callback_;
WriteFailedCallback write_failed_callback_;
- bool write_pending_;
-
- bool closed_;
-
- bool* destroyed_flag_;
-};
-
-class BufferedSocketWriter : public BufferedSocketWriterBase {
- public:
- BufferedSocketWriter();
- ~BufferedSocketWriter() override;
-
- protected:
- void GetNextPacket(net::IOBuffer** buffer, int* size) override;
- base::Closure AdvanceBufferPosition(int written) override;
- void OnError(int result) override;
-
- private:
- scoped_refptr<net::DrainableIOBuffer> current_buf_;
-};
+ DataQueue queue_;
-class BufferedDatagramWriter : public BufferedSocketWriterBase {
- public:
- BufferedDatagramWriter();
- ~BufferedDatagramWriter() override;
+ bool write_pending_ = false;
- protected:
- void GetNextPacket(net::IOBuffer** buffer, int* size) override;
- base::Closure AdvanceBufferPosition(int written) override;
- void OnError(int result) override;
+ base::WeakPtrFactory<BufferedSocketWriter> weak_factory_;
};
} // namespace remoting
« no previous file with comments | « no previous file | remoting/base/buffered_socket_writer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698