mirror of
https://github.com/shadps4-emu/ext-libusb.git
synced 2026-01-31 00:55:21 +01:00
- Added long-awaited support for multithreading. Since WebUSB still doesn't support accessing same device from multiple threads, this works by proxying I/O operations to the main thread as discussed on the original issue. For applications that run on the main thread nothing changes and they will continue to access WebUSB via Asyncify like before, while other threads will use blocking mechanism until an asynchronous response is available from the main thread. - Rewrote notification mechanism to use atomic waiting via sync Wasm instructions or `Atomics.waitAsync` depending on the thread. This results in simpler and faster notifications than the previous `postMessage`-based approach (which was used because `Atomics.waitAsync` wasn't yet available), as well as allows to send notifications across threads for multithreading scenario described above. - Fixed notification access to only wait/notify on the event we're interested instead of using a global lock. - Rewrote descriptor reading to query device for raw device & configuration descriptors instead of re-serializing them from JavaScript object representation. This incurs slight extra cost for the initial device opening, but fixes number of issues with information that is not yet exposed via WebUSB and allows to read supplementary descriptors such as string and BOS which were previously not supported. - Fixed listing only one alternate instead of all the available ones. - Fixed device closing & re-opening which could previously error out with "device busy" error. - Added mandatory Emscripten-specific linking flags to the generated pkgconfig. - Added device speed inference. This is not yet exposed via WebUSB, but we can at least make a best effort guess based on USB version and packet size, like some other backends already do. - Simplified & fixed device session ID generation which is now guaranteed to be truly unique, whereas previously it could clash with other devices of the same type. - Prepare code to support building for the Web without mandatory multithreading (which is costly on the Web) in the future. For now those `#ifdef`s are defunct as libusb is always compiled with `-pthread`, but some upcoming changes on the Emscripten side will allow to leverage those codepaths for smaller Wasm binaries. - Require explicit `--host=wasm32-unknown-emscripten` as we might want to add non-Emscripten WebAssembly backends in the future. - Various smaller fixes and improvements. Note that this requires Emscripten 3.1.48 or newer to build for some of the features used here, namely `co_await` support for JavaScript values (without it code would be both more complex and slower) and some proxying APIs. It shouldn't be a big deal in practice as most users retrieve Emscripten via the official emsdk installer or Docker images. Closes #1339
99 lines
2.4 KiB
Makefile
99 lines
2.4 KiB
Makefile
AUTOMAKE_OPTIONS = subdir-objects
|
|
|
|
AM_CFLAGS += -fvisibility=hidden $(THREAD_CFLAGS)
|
|
AM_CXXFLAGS += -fvisibility=hidden $(THREAD_CFLAGS)
|
|
|
|
lib_LTLIBRARIES = libusb-1.0.la
|
|
|
|
POSIX_PLATFORM_SRC = os/events_posix.h os/events_posix.c \
|
|
os/threads_posix.h os/threads_posix.c
|
|
WINDOWS_PLATFORM_SRC = os/events_windows.h os/events_windows.c \
|
|
os/threads_windows.h os/threads_windows.c
|
|
|
|
if PLATFORM_POSIX
|
|
PLATFORM_SRC = $(POSIX_PLATFORM_SRC)
|
|
else
|
|
PLATFORM_SRC = $(WINDOWS_PLATFORM_SRC)
|
|
endif
|
|
|
|
OS_DARWIN_SRC = os/darwin_usb.h os/darwin_usb.c
|
|
OS_HAIKU_SRC = os/haiku_usb.h os/haiku_usb_backend.cpp \
|
|
os/haiku_pollfs.cpp os/haiku_usb_raw.h os/haiku_usb_raw.cpp
|
|
OS_LINUX_SRC = os/linux_usbfs.h os/linux_usbfs.c
|
|
OS_EMSCRIPTEN_SRC = os/emscripten_webusb.cpp
|
|
OS_NETBSD_SRC = os/netbsd_usb.c
|
|
OS_NULL_SRC = os/null_usb.c
|
|
OS_OPENBSD_SRC = os/openbsd_usb.c
|
|
OS_SUNOS_SRC = os/sunos_usb.h os/sunos_usb.c
|
|
OS_WINDOWS_SRC = libusb-1.0.def libusb-1.0.rc \
|
|
os/windows_common.h os/windows_common.c \
|
|
os/windows_usbdk.h os/windows_usbdk.c \
|
|
os/windows_winusb.h os/windows_winusb.c
|
|
|
|
if OS_DARWIN
|
|
OS_SRC = $(OS_DARWIN_SRC)
|
|
endif
|
|
|
|
noinst_LTLIBRARIES =
|
|
|
|
if OS_HAIKU
|
|
noinst_LTLIBRARIES += libusb_haiku.la
|
|
libusb_haiku_la_SOURCES = $(OS_HAIKU_SRC)
|
|
libusb_1_0_la_LIBADD = libusb_haiku.la
|
|
endif
|
|
|
|
if OS_LINUX
|
|
OS_SRC = $(OS_LINUX_SRC)
|
|
if USE_UDEV
|
|
OS_SRC += os/linux_udev.c
|
|
else
|
|
OS_SRC += os/linux_netlink.c
|
|
endif
|
|
endif
|
|
|
|
if OS_EMSCRIPTEN
|
|
noinst_LTLIBRARIES += libusb_emscripten.la
|
|
libusb_emscripten_la_SOURCES = $(OS_EMSCRIPTEN_SRC)
|
|
AM_CXXFLAGS += -std=c++20
|
|
libusb_1_0_la_LIBADD = libusb_emscripten.la
|
|
endif
|
|
|
|
if OS_NETBSD
|
|
OS_SRC = $(OS_NETBSD_SRC)
|
|
endif
|
|
|
|
if OS_NULL
|
|
OS_SRC = $(OS_NULL_SRC)
|
|
endif
|
|
|
|
if OS_OPENBSD
|
|
OS_SRC = $(OS_OPENBSD_SRC)
|
|
endif
|
|
|
|
if OS_SUNOS
|
|
OS_SRC = $(OS_SUNOS_SRC)
|
|
endif
|
|
|
|
if OS_WINDOWS
|
|
OS_SRC = $(OS_WINDOWS_SRC)
|
|
|
|
include Makefile.am.extra
|
|
|
|
# Dependencies for compiling libusb-1.0.lo from libusb-1.0.rc
|
|
-include ./$(DEPDIR)/libusb-1.0.Plo
|
|
|
|
if CREATE_IMPORT_LIB
|
|
all-local: .libs/libusb-1.0.dll.a
|
|
# Rebuild the import lib from the .def so that MS and MinGW DLLs can be interchanged
|
|
.libs/libusb-1.0.dll.a: libusb-1.0.def libusb-1.0.la
|
|
$(AM_V_DLLTOOL)$(DLLTOOL) $(DLLTOOLFLAGS) --kill-at --input-def $< --dllname libusb-1.0.dll --output-lib $@
|
|
endif
|
|
endif
|
|
|
|
libusb_1_0_la_LDFLAGS = $(LT_LDFLAGS) $(EXTRA_LDFLAGS)
|
|
libusb_1_0_la_SOURCES = libusbi.h version.h version_nano.h \
|
|
core.c descriptor.c hotplug.c io.c strerror.c sync.c \
|
|
$(PLATFORM_SRC) $(OS_SRC)
|
|
|
|
pkginclude_HEADERS = libusb.h
|