Index: head/devel/android-tools-adb-devel/Makefile =================================================================== --- head/devel/android-tools-adb-devel/Makefile (revision 444761) +++ head/devel/android-tools-adb-devel/Makefile (revision 444762) @@ -1,42 +1,42 @@ # $FreeBSD$ # 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]* MASTERDIR= ${.CURDIR}/../android-tools-adb DISTINFO_FILE= ${.CURDIR}/distinfo FILESDIR= ${.CURDIR}/files EXTRA_PATCHES= ${.CURDIR}/files/patch-* GH_MYTAG= ${DISTVERSIONPREFIX}${DISTVERSION:C/-[0-9]*$//} USES= compiler:c++14-lang OPTIONS_DEFAULT=MDNSRESPONDER OPTIONS_DEFINE= MDNSRESPONDER TEST_PYTHON MDNSRESPONDER_LIB_DEPENDS= libdns_sd.so:net/mDNSResponder MDNSRESPONDER_USES= localbase:ldflags MDNSRESPONDER_LDFLAGS= -ldns_sd MDNSRESPONDER_MAKE_ENV_OFF= MDNSEXT=_unsupported TEST_BROKEN= logging.* tests always fail after 4e5fd111d84d TEST_PYTHON_DESC= ${TEST_DESC:S/tests/python &/} TEST_PYTHON_GH_PROJECT= platform_development:development TEST_PYTHON_GH_TAGNAME= ${GH_MYTAG}-83-gc5efdcc74:development TEST_PYTHON_BUILD_DEPENDS=${PYTHON_PKGNAMEPREFIX}mock>0:devel/py-mock TEST_PYTHON_USES= python:2.7,build pre-install-TEST_PYTHON-on: # XXX python tests may leave behind running adb server ${SETENV} PATH=${BUILD_WRKSRC}:${PATH} \ PYTHONPATH=${WRKSRC_development}/python-packages \ ${PYTHON_CMD} -m unittest discover -vs ${BUILD_WRKSRC} .include "${MASTERDIR}/Makefile" Index: head/devel/android-tools-adb-devel/files/patch-adb_client_usb__libusb.cpp =================================================================== --- head/devel/android-tools-adb-devel/files/patch-adb_client_usb__libusb.cpp (revision 444761) +++ head/devel/android-tools-adb-devel/files/patch-adb_client_usb__libusb.cpp (revision 444762) @@ -1,77 +1,123 @@ --- adb/client/usb_libusb.cpp.orig 2017-06-20 10:50:27 UTC +++ adb/client/usb_libusb.cpp @@ -28,7 +28,7 @@ #include #include -#include +#include #include #include @@ -89,7 +89,11 @@ struct transfer_info { }; namespace libusb { +#if defined(__linux__) || defined(__APPLE__) struct usb_handle : public ::usb_handle { +#else +struct usb_handle { +#endif 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>(); 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>(); - static void hotplug_thread() { - adb_thread_setname("libusb hotplug"); -@@ -449,6 +456,7 @@ static int hotplug_callback(libusb_context*, libusb_de + static std::atomic 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 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); } +#if defined(LIBUSB_API_VERSION) && LIBUSB_API_VERSION >= 0x01000102 // Register the hotplug callback. rc = libusb_hotplug_register_callback( nullptr, static_cast(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 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 lock(device_poll_mutex); ++ terminate_device_poll_thread = true; ++ ++ if (!device_poll_thread) { ++ return; ++ } ++ } ++ device_poll_cv.notify_all(); ++ device_poll_thread->join(); +#endif } // Dispatch a libusb transfer, unlock |device_lock|, and then wait for the result.