diff options
Diffstat (limited to 'client')
-rw-r--r-- | client/main.cpp | 15 | ||||
-rw-r--r-- | client/usb_dispatch.cpp | 6 | ||||
-rw-r--r-- | client/usb_libusb.cpp | 20 | ||||
-rw-r--r-- | client/usb_windows.cpp | 2 |
4 files changed, 34 insertions, 9 deletions
diff --git a/client/main.cpp b/client/main.cpp index fe5099c..bd9ad01 100644 --- a/client/main.cpp +++ b/client/main.cpp @@ -92,6 +92,16 @@ static BOOL WINAPI ctrlc_handler(DWORD type) { } #endif +void adb_server_cleanup() { + // Upon exit, we want to clean up in the following order: + // 1. close_smartsockets, so that we don't get any new clients + // 2. kick_all_transports, to avoid writing only part of a packet to a transport. + // 3. usb_cleanup, to tear down the USB stack. + close_smartsockets(); + kick_all_transports(); + usb_cleanup(); +} + int adb_server_main(int is_daemon, const std::string& socket_spec, int ack_reply_fd) { #if defined(_WIN32) // adb start-server starts us up with stdout and stderr hooked up to @@ -111,12 +121,13 @@ int adb_server_main(int is_daemon, const std::string& socket_spec, int ack_reply SetConsoleCtrlHandler(ctrlc_handler, TRUE); #else signal(SIGINT, [](int) { - android::base::quick_exit(0); + fdevent_run_on_main_thread([]() { android::base::quick_exit(0); }); }); #endif - init_transport_registration(); + android::base::at_quick_exit(adb_server_cleanup); + init_transport_registration(); init_mdns_transport_discovery(); usb_init(); diff --git a/client/usb_dispatch.cpp b/client/usb_dispatch.cpp index 710a3ce..c4eed78 100644 --- a/client/usb_dispatch.cpp +++ b/client/usb_dispatch.cpp @@ -27,6 +27,12 @@ void usb_init() { } } +void usb_cleanup() { + if (should_use_libusb()) { + libusb::usb_cleanup(); + } +} + int usb_write(usb_handle* h, const void* data, int len) { return should_use_libusb() ? libusb::usb_write(reinterpret_cast<libusb::usb_handle*>(h), data, len) diff --git a/client/usb_libusb.cpp b/client/usb_libusb.cpp index 5a65865..18a8ff2 100644 --- a/client/usb_libusb.cpp +++ b/client/usb_libusb.cpp @@ -415,15 +415,21 @@ void usb_init() { // Spawn a thread to do device enumeration. // TODO: Use libusb_hotplug_* instead? + std::unique_lock<std::mutex> lock(device_poll_mutex); device_poll_thread = new std::thread(poll_for_devices); - android::base::at_quick_exit([]() { - { - std::unique_lock<std::mutex> lock(device_poll_mutex); - terminate_device_poll_thread = true; +} + +void usb_cleanup() { + { + std::unique_lock<std::mutex> lock(device_poll_mutex); + terminate_device_poll_thread = true; + + if (!device_poll_thread) { + return; } - device_poll_cv.notify_all(); - device_poll_thread->join(); - }); + } + device_poll_cv.notify_all(); + device_poll_thread->join(); } // Dispatch a libusb transfer, unlock |device_lock|, and then wait for the result. diff --git a/client/usb_windows.cpp b/client/usb_windows.cpp index ec55b0e..1620e6e 100644 --- a/client/usb_windows.cpp +++ b/client/usb_windows.cpp @@ -265,6 +265,8 @@ void usb_init() { std::thread(_power_notification_thread).detach(); } +void usb_cleanup() {} + usb_handle* do_usb_open(const wchar_t* interface_name) { unsigned long name_len = 0; |