[Spice-devel] [PATCH spice-gtk 07/10] usbredir: Handle usb events from a thread

Hans de Goede hdegoede at redhat.com
Mon Jan 2 06:03:59 PST 2012


Hi,

On 01/02/2012 02:23 PM, Christophe Fergeau wrote:
> On Mon, Dec 19, 2011 at 12:24:40PM +0100, Hans de Goede wrote:
>> This solves various latency issues with USB handling.
>>
>> Signed-off-by: Hans de Goede<hdegoede at redhat.com>

<snip>

>> +static gpointer spice_usb_device_magager_usb_ev_thread(gpointer user_data)
>
> s/magager/manager
>

Will fix.

>> +{
>> +    SpiceUsbDeviceManager *self = SPICE_USB_DEVICE_MANAGER(user_data);
>> +    SpiceUsbDeviceManagerPrivate *priv = self->priv;
>> +
>> +    while (priv->event_thread_run) {
>> +        libusb_handle_events(_g_usb_context_get_context(priv->context));
>> +    }
>
> Maybe we should log something when libusb_handle_events returns
> LIBUSB_ERROR_* ?
>

That seems like a good idea, will fix.

>> +
>> +    return NULL;
>> +}
>> +
>>   gboolean spice_usb_device_manager_start_event_listening(
>>       SpiceUsbDeviceManager *self, GError **err)
>>   {
>> @@ -491,10 +507,18 @@ gboolean spice_usb_device_manager_start_event_listening(
>>       if (priv->event_listeners>  1)
>>           return TRUE;
>>
>> -    g_return_val_if_fail(priv->source == NULL, FALSE);
>> -
>> -    priv->source = g_usb_source_new(priv->main_context, priv->context, err);
>> -    return priv->source != NULL;
>> +    /* We don't join the thread when we stop event listening, as the
>> +       libusb_handle_events call in the thread won't exit until the
>> +       libusb_close call for the device is made from usbredirhost_close. */
>> +    if (priv->event_thread) {
>> +         g_thread_join(priv->event_thread);
>> +         priv->event_thread = NULL;
>> +    }
>> +    priv->event_thread_run = TRUE;
>> +    priv->event_thread = g_thread_create(
>> +                             spice_usb_device_magager_usb_ev_thread,
>> +                             self, TRUE, err);
>
> Do we need to join threads at all? Not needing to call g_thread_join would
> make the code simpler. Ie the 3rd arg could be FALSE here.

Yes, because the thread must be stopped before we can close the libusb_context,
which we do on usbdevicemanager destriction, which happens when a session is closed.

Is it ok for me to push this with the 2 changes agreed upon above?

Regards,

Hans


More information about the Spice-devel mailing list