diff --git a/device/win_usb/win_usb.cpp b/device/win_usb/win_usb.cpp index c3f996f..3521bdf 100644 --- a/device/win_usb/win_usb.cpp +++ b/device/win_usb/win_usb.cpp @@ -886,8 +886,8 @@ void usb_monitor::register_monitor_wnd(const wchar_t* cls) void usb_monitor::notify_usb_event(usb_device*& dev, bool arrive) { std::lock_guard lock(lock_); - int ev = arrive ? LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED : LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT; - DEVID id = dev->id(); + int ev = arrive ? LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED : LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT; + DEVID id = dev->id(); if (arrive) { @@ -896,12 +896,20 @@ void usb_monitor::notify_usb_event(usb_device*& dev, bool arrive) { if (devices_[i]->id() == id) { - dev->release(); - dev = devices_[i]; - dev->add_ref(); - dev->set_online(true); - found = true; - break; + if (devices_[i]->is_online()) + { + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "%s is already in device queue and received ARRIVE again, discard this event.\n", dev->name().c_str()); + dev->release(); + return; + } + else + { + dev = devices_[i]; + dev->add_ref(); + dev->set_online(true); + found = true; + break; + } } } if (!found) @@ -922,7 +930,14 @@ void usb_monitor::notify_usb_event(usb_device*& dev, bool arrive) dev->add_ref(); if (dev->is_open()) { - dev->set_online(false); + if (dev->is_online()) + dev->set_online(false); + else + { + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "%s is already offline and received LEAVE again, discard this event.\n", dev->name().c_str()); + dev->release(); + return; + } } else { @@ -953,6 +968,8 @@ int usb_monitor::on_usb_pnp(WPARAM wp, LPARAM lp) if (wp == DBT_DEVICEQUERYREMOVE) return cur_dev_name_ != u2utf8(dev->dbcc_name); + VLOG_MINI_2(LOG_LEVEL_DEBUG_INFO, "event '%08x' of device %s\n", wp, u2utf8(dev->dbcc_name).c_str()); + usb_device* ud = new usb_device(u2utf8(dev->dbcc_name).c_str()); *ud = dev->dbcc_classguid; if (!PostThreadMessageW(handle_msg_id_, MSG_DEVICE_PNP, wp == DBT_DEVICEARRIVAL, (LPARAM)ud))