From: Kirill Moizik <kmoizik@xxxxxxxxxx> This patches series make start/stop usb redirection flows run in their own threads. It solve spice freeze problem since start and stop redirection is time consuming operations. This series includes new api exposure, threads syncronization and new usb redirection widget behavior. When redirection starts/ends widget will turn inactive/active Synchronization strategy explanation: To avoid application freeze during usb redirection flow connect and disconnect flows will run in separate thread. Theads synchronization underlying ideas is as following. 1) Main thread is already syncronized with usb handler thread. 2) connect/disconnect flows should be serialized, i.e 2 parallel redirection flows could not run concurrently New thread use SpiceUsbredirChannel object during the flow. More specifically it use next object fields : channel->priv->state channel->priv->host channel->priv->device channel->priv->catch_error channel->priv->spice_device Threads synchronization goal is to prevent concurrent access to those fields fromm main thread/ usb handler thread and prevent calls to non thread safe usbredir functions. It is achieved next steps: 1) to make sure channel is not disposed while redirection in progress, add reference on flow start and unref on the end 2) make channel reset use disconnect async api 3) on redirection start/stop acquire lock and release it when resources are not in use anymore 4) all critical sections which can be reached in main thread guarded with lock (critical section is a section uses same resources as a thread or section make a call to non thread safe usbredir function) v3 changeset: remove spice_g_udev_handle_device_change api cosmetic changes set redirection state at usbdevice manager level remove set_redirecton and set_sensitive_all check for redirection state at check_can_redirect expose mutex to guard all critical sections v2 changeset: fix trailing whitespace fix linux build with usb redirection fix linux build without ussb redirection set redirecting state as gobject property separate commit for widget manipulations commit messages fixes Kirill Moizik (13): Usbredir channel: expose mutex Add redirecting state GUdevClient: Do not process udb add/remove events if redirection in progress UsbDeviceManager: move existing code to separate function UsbDeviceManager and redirect channel: spawn a different thread for connect device flow Usbredir Channel: Change disconnect signature to reuse in async context UsbDeviceManager and redirect channel: spawn a different thread for disconnect device flow Usbredir channel: use disconnect_async Add additional locks to critical sections of redirection flows UsbDeviceWidget: if redirecting update infobar accordingly UsbDeviceWidget: consider asynchronous redirecting flow UsbDeviceWidget: use async disconnect Fix preprocessor commands for different kinds of build src/channel-usbredir-priv.h | 12 ++- src/channel-usbredir.c | 145 +++++++++++++++++++++----- src/map-file | 2 + src/usb-device-manager.c | 241 ++++++++++++++++++++++++++++++++++++-------- src/usb-device-manager.h | 8 ++ src/usb-device-widget.c | 77 +++++++++----- src/win-usb-dev.c | 16 +++ src/win-usb-dev.h | 1 + 8 files changed, 412 insertions(+), 90 deletions(-) -- 2.4.3 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel