diff options
Diffstat (limited to 'tools/android/forwarder2/host_controller.h')
-rw-r--r-- | tools/android/forwarder2/host_controller.h | 68 |
1 files changed, 42 insertions, 26 deletions
diff --git a/tools/android/forwarder2/host_controller.h b/tools/android/forwarder2/host_controller.h index dc75f88..aaedb94 100644 --- a/tools/android/forwarder2/host_controller.h +++ b/tools/android/forwarder2/host_controller.h @@ -17,42 +17,53 @@ namespace forwarder2 { -class HostProxy; - +// This class partners with DeviceController and has the same lifetime and +// threading characteristics as DeviceListener. In a nutshell, this class +// operates on its own thread and is destroyed on the thread it was constructed +// on. The class' deletion can happen in two different ways: +// - Its destructor was called by its owner (HostControllersManager). +// - Its internal thread requested self-deletion after an error happened. In +// this case the owner (HostControllersManager) is notified on the +// construction thread through the provided DeletionCallback invoked with the +// HostController instance. When this callback is invoked, it's up to the +// owner to delete the instance. class HostController { public: // Callback used for self-deletion that lets the client perform some cleanup // work before deleting the HostController instance. - typedef base::Callback<void (HostController*)> DeleteCallback; + typedef base::Callback<void (scoped_ptr<HostController>)> DeletionCallback; - // If |device_port| is zero, it dynamically allocates a port. - HostController(int device_port, - const std::string& forward_to_host, - int forward_to_host_port, - int adb_port, - int exit_notifier_fd, - const DeleteCallback& delete_callback); + // If |device_port| is zero then a dynamic port is allocated (and retrievable + // through device_port() below). + static scoped_ptr<HostController> Create( + int device_port, + int host_port, + int adb_port, + int exit_notifier_fd, + const DeletionCallback& deletion_callback); ~HostController(); - // Connects to the device forwarder app and sets the |device_port_| to the - // dynamically allocated port (when the provided |device_port| is zero). - // Returns true on success. Clients must call Connect() before calling - // Start(). - bool Connect(); - // Starts the internal controller thread. void Start(); int adb_port() const { return adb_port_; } - // Gets the current device allocated port. Must be called after Connect(). int device_port() const { return device_port_; } private: - void ThreadHandler(); + HostController(int device_port, + int host_port, + int adb_port, + int exit_notifier_fd, + const DeletionCallback& deletion_callback, + scoped_ptr<Socket> adb_control_socket, + scoped_ptr<PipeNotifier> delete_controller_notifier); - void StartForwarder(scoped_ptr<Socket> host_server_data_socket_ptr); + void ReadNextCommandSoon(); + void ReadCommandOnInternalThread(); + + void StartForwarder(scoped_ptr<Socket> host_server_data_socket); // Helper method that creates a socket and adds the appropriate event file // descriptors. @@ -60,19 +71,24 @@ class HostController { void SelfDelete(); - Socket adb_control_socket_; - int device_port_; - const std::string forward_to_host_; - const int forward_to_host_port_; + static void SelfDeleteOnDeletionTaskRunner( + const DeletionCallback& deletion_callback, + scoped_ptr<HostController> controller); + + const int device_port_; + const int host_port_; const int adb_port_; // Used to notify the controller when the process is killed. const int global_exit_notifier_fd_; // Used to let the client delete the instance in case an error happened. - const DeleteCallback delete_callback_; + const DeletionCallback deletion_callback_; + scoped_ptr<Socket> adb_control_socket_; + scoped_ptr<PipeNotifier> delete_controller_notifier_; // Used to cancel the pending blocking IO operations when the host controller // instance is deleted. - PipeNotifier delete_controller_notifier_; - bool ready_; + // Task runner used for deletion set at construction time (i.e. the object is + // deleted on the same thread it is created on). + const scoped_refptr<base::SingleThreadTaskRunner> deletion_task_runner_; base::Thread thread_; DISALLOW_COPY_AND_ASSIGN(HostController); |