diff options
author | jbeich <jbeich@FreeBSD.org> | 2017-06-30 23:11:54 +0800 |
---|---|---|
committer | jbeich <jbeich@FreeBSD.org> | 2017-06-30 23:11:54 +0800 |
commit | ece54977329f353d88ea30db8f3729765861b588 (patch) | |
tree | 5e8fb49d88cc6653b76f84c3db41b43e3a0db25c /devel | |
parent | 9968b4daca26627c4ba2729a6f875b465f9677a5 (diff) | |
download | freebsd-ports-gnome-ece54977329f353d88ea30db8f3729765861b588.tar.gz freebsd-ports-gnome-ece54977329f353d88ea30db8f3729765861b588.tar.zst freebsd-ports-gnome-ece54977329f353d88ea30db8f3729765861b588.zip |
devel/android-tools-adb-devel: restore USB transport for < 11.0
https://android.googlesource.com/platform/system/core/+/6da1cd49b5ea%5E%21/
Diffstat (limited to 'devel')
-rw-r--r-- | devel/android-tools-adb-devel/Makefile | 2 | ||||
-rw-r--r-- | devel/android-tools-adb-devel/files/patch-adb_client_usb__libusb.cpp | 72 |
2 files changed, 60 insertions, 14 deletions
diff --git a/devel/android-tools-adb-devel/Makefile b/devel/android-tools-adb-devel/Makefile index 6406bce82ab3..61092c047f5b 100644 --- a/devel/android-tools-adb-devel/Makefile +++ b/devel/android-tools-adb-devel/Makefile @@ -3,7 +3,7 @@ # Hint: git describe --abbrev=12 --match android-o-preview-2 DISTVERSION= o-preview-2-332 DISTVERSIONSUFFIX= -gd1e9e7bc06f0 -PORTREVISION= 0 +PORTREVISION= 1 PKGNAMESUFFIX= -devel CONFLICTS_INSTALL= ${PORTNAME}-[0-9]* diff --git a/devel/android-tools-adb-devel/files/patch-adb_client_usb__libusb.cpp b/devel/android-tools-adb-devel/files/patch-adb_client_usb__libusb.cpp index 2d115b65bd68..ad3fd7ea9888 100644 --- a/devel/android-tools-adb-devel/files/patch-adb_client_usb__libusb.cpp +++ b/devel/android-tools-adb-devel/files/patch-adb_client_usb__libusb.cpp @@ -21,33 +21,62 @@ usb_handle(const std::string& device_address, const std::string& serial, unique_device_handle&& device_handle, uint8_t interface, uint8_t bulk_in, uint8_t bulk_out, size_t zero_mask, size_t max_packet_size) -@@ -152,7 +156,9 @@ struct usb_handle : public ::usb_handle { +@@ -152,7 +156,14 @@ struct usb_handle : public ::usb_handle { static auto& usb_handles = *new std::unordered_map<std::string, std::unique_ptr<usb_handle>>(); static auto& usb_handles_mutex = *new std::mutex(); +#if defined(LIBUSB_API_VERSION) && LIBUSB_API_VERSION >= 0x01000102 static libusb_hotplug_callback_handle hotplug_handle; ++#else ++static std::thread* device_poll_thread = nullptr; ++static bool terminate_device_poll_thread = false; ++static auto& device_poll_mutex = *new std::mutex(); ++static auto& device_poll_cv = *new std::condition_variable(); +#endif static std::string get_device_address(libusb_device* device) { return StringPrintf("usb:%d:%d", libusb_get_bus_number(device), -@@ -420,6 +426,7 @@ static void device_disconnected(libusb_device* device) - } +@@ -380,6 +391,7 @@ static void process_device(libusb_device* device) { + LOG(INFO) << "registered new usb device '" << device_serial << "'"; } +#if defined(LIBUSB_API_VERSION) && LIBUSB_API_VERSION >= 0x01000102 - static auto& hotplug_queue = *new BlockingQueue<std::pair<libusb_hotplug_event, libusb_device*>>(); - static void hotplug_thread() { - adb_thread_setname("libusb hotplug"); -@@ -449,6 +456,7 @@ static int hotplug_callback(libusb_context*, libusb_de + static std::atomic<int> connecting_devices(0); + + static void device_connected(libusb_device* device) { +@@ -449,7 +461,31 @@ static int hotplug_callback(libusb_context*, libusb_de hotplug_queue.Push({event, device}); return 0; } -+#endif ++#else ++static void poll_for_devices() { ++ libusb_device** list; ++ adb_thread_setname("device poll"); ++ while (true) { ++ const ssize_t device_count = libusb_get_device_list(nullptr, &list); ++ LOG(VERBOSE) << "found " << device_count << " attached devices"; ++ ++ for (ssize_t i = 0; i < device_count; ++i) { ++ process_device(list[i]); ++ } ++ ++ libusb_free_device_list(list, 1); ++ ++ adb_notify_device_scan_complete(); ++ ++ std::unique_lock<std::mutex> lock(device_poll_mutex); ++ if (device_poll_cv.wait_for(lock, 500ms, []() { return terminate_device_poll_thread; })) { ++ return; ++ } ++ } ++} ++#endif ++ void usb_init() { LOG(DEBUG) << "initializing libusb..."; -@@ -457,6 +465,7 @@ void usb_init() { + int rc = libusb_init(nullptr); +@@ -457,6 +493,7 @@ void usb_init() { LOG(FATAL) << "failed to initialize libusb: " << libusb_error_name(rc); } @@ -55,22 +84,39 @@ // Register the hotplug callback. rc = libusb_hotplug_register_callback( nullptr, static_cast<libusb_hotplug_event>(LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED | -@@ -467,6 +476,9 @@ void usb_init() { +@@ -467,6 +504,7 @@ void usb_init() { if (rc != LIBUSB_SUCCESS) { LOG(FATAL) << "failed to register libusb hotplug callback"; } -+#else -+ LOG(FATAL) << "libusb doesn't support hotplug but scanning isn't implemented"; +#endif // Spawn a thread for libusb_handle_events. std::thread([]() { -@@ -478,7 +490,9 @@ void usb_init() { +@@ -475,10 +513,28 @@ void usb_init() { + libusb_handle_events(nullptr); + } + }).detach(); ++ ++#if !defined(LIBUSB_API_VERSION) || LIBUSB_API_VERSION < 0x01000102 ++ std::unique_lock<std::mutex> lock(device_poll_mutex); ++ device_poll_thread = new std::thread(poll_for_devices); ++#endif } void usb_cleanup() { +#if defined(LIBUSB_API_VERSION) && LIBUSB_API_VERSION >= 0x01000102 libusb_hotplug_deregister_callback(nullptr, hotplug_handle); ++#else ++ { ++ 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(); +#endif } |