diff options
| author | Léo Lam <leo@innovatetechnologi.es> | 2017-01-15 20:50:26 +0100 |
|---|---|---|
| committer | Léo Lam <leo@innovatetechnologi.es> | 2017-02-05 11:36:48 +0100 |
| commit | c8a6dc6c23a5efe99b4bf937003ba3f2f7f8f200 (patch) | |
| tree | 44e1e1fac10808bad10e20a72c18c54777e5f1bf /Source/Core/UICommon/USBUtils.cpp | |
| parent | 73e55ccf4472db8c85255dd97ebb3c7596d5201f (diff) | |
Use a single libusb context
libusb on Windows is limited to only a single context. Trying to open
more than one can cause device enumerations to fail randomly.
libusb is thread-safe and we don't use the manual polling support (with
`poll()`) so this should be safe.
Diffstat (limited to 'Source/Core/UICommon/USBUtils.cpp')
| -rw-r--r-- | Source/Core/UICommon/USBUtils.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/Source/Core/UICommon/USBUtils.cpp b/Source/Core/UICommon/USBUtils.cpp index 8f0ba21d52..da7c603580 100644 --- a/Source/Core/UICommon/USBUtils.cpp +++ b/Source/Core/UICommon/USBUtils.cpp @@ -2,8 +2,11 @@ // Licensed under GPLv2+ // Refer to the license.txt file included. +#include <memory> + #ifdef __LIBUSB__ #include <libusb.h> +#include "Common/LibusbContext.h" #endif #include "Common/CommonTypes.h" @@ -11,7 +14,7 @@ #include "UICommon/USBUtils.h" #ifdef __LIBUSB__ -static libusb_context* s_libusb_context; +static std::shared_ptr<libusb_context> s_libusb_context; #endif // Because opening and getting the device name from devices is slow, especially on Windows @@ -36,14 +39,14 @@ namespace USBUtils void Init() { #ifdef __LIBUSB__ - libusb_init(&s_libusb_context); + s_libusb_context = LibusbContext::Get(); #endif } void Shutdown() { #ifdef __LIBUSB__ - libusb_exit(s_libusb_context); + s_libusb_context = nullptr; #endif } @@ -56,7 +59,7 @@ std::map<std::pair<u16, u16>, std::string> GetInsertedDevices() return devices; libusb_device** list; - const ssize_t cnt = libusb_get_device_list(s_libusb_context, &list); + const ssize_t cnt = libusb_get_device_list(s_libusb_context.get(), &list); for (ssize_t i = 0; i < cnt; ++i) { libusb_device_descriptor descr; |
