summaryrefslogtreecommitdiffstats
path: root/tools/android/forwarder2/host_controller.h
diff options
context:
space:
mode:
Diffstat (limited to 'tools/android/forwarder2/host_controller.h')
-rw-r--r--tools/android/forwarder2/host_controller.h68
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);