Compare commits

...

No commits in common. "c8" and "c9s" have entirely different histories.
c8 ... c9s

8 changed files with 249 additions and 9 deletions

1
.fmf/version Normal file
View File

@ -0,0 +1 @@
1

28
.gitignore vendored
View File

@ -1 +1,27 @@
SOURCES/libgusb-0.3.0.tar.xz
/libgusb-0.1.0.tar.xz
/libgusb-0.1.1.tar.xz
/libgusb-0.1.2.tar.xz
/libgusb-0.1.3.tar.xz
/libgusb-0.1.4.tar.xz
/libgusb-0.1.5.tar.xz
/libgusb-0.1.6.tar.xz
/libgusb-0.2.0.tar.xz
/libgusb-0.2.1.tar.xz
/libgusb-0.2.2.tar.xz
/libgusb-0.2.3.tar.xz
/libgusb-0.2.4.tar.xz
/libgusb-0.2.5.tar.xz
/libgusb-0.2.6.tar.xz
/libgusb-0.2.7.tar.xz
/libgusb-0.2.8.tar.xz
/libgusb-0.2.9.tar.xz
/libgusb-0.2.10.tar.xz
/libgusb-0.2.11.tar.xz
/libgusb-0.3.0.tar.xz
/libgusb-0.3.1.tar.xz
/libgusb-0.3.2.tar.xz
/libgusb-0.3.3.tar.xz
/libgusb-0.3.4.tar.xz
/libgusb-0.3.5.tar.xz
/libgusb-0.3.6.tar.xz
/libgusb-0.3.8.tar.xz

View File

@ -1 +0,0 @@
25f1cc3455ab6105d8c34305a79876a7c3f707e0 SOURCES/libgusb-0.3.0.tar.xz

6
gating.yaml Normal file
View File

@ -0,0 +1,6 @@
--- !Policy
product_versions:
- rhel-9
decision_context: osci_compose_gate
rules:
- !PassingTestCaseRule {test_case_name: desktop-qe.desktop-ci.tier1-gating.functional}

126
idle-events-mutex.patch Normal file
View File

@ -0,0 +1,126 @@
diff -urNp libgusb-0.3.8.old/gusb/gusb-context.c libgusb-0.3.8/gusb/gusb-context.c
--- libgusb-0.3.8.old/gusb/gusb-context.c 2023-07-31 10:27:45.903816362 +0100
+++ libgusb-0.3.8/gusb/gusb-context.c 2023-07-31 10:41:22.973605806 +0100
@@ -54,6 +54,9 @@ struct _GUsbContextPrivate
GUsbContextFlags flags;
libusb_context *ctx;
libusb_hotplug_callback_handle hotplug_id;
+ GPtrArray *idle_events;
+ GMutex idle_events_mutex;
+ guint idle_events_id;
};
/* not defined in FreeBSD */
@@ -123,12 +126,18 @@ g_usb_context_dispose (GObject *object)
g_source_remove (priv->hotplug_poll_id);
priv->hotplug_poll_id = 0;
}
+ if (priv->idle_events_id > 0) {
+ g_source_remove(priv->idle_events_id);
+ priv->idle_events_id = 0;
+ }
g_clear_pointer (&priv->main_ctx, g_main_context_unref);
g_clear_pointer (&priv->devices, g_ptr_array_unref);
g_clear_pointer (&priv->dict_usb_ids, g_hash_table_unref);
g_clear_pointer (&priv->dict_replug, g_hash_table_unref);
g_clear_pointer (&priv->ctx, libusb_exit);
+ g_clear_pointer(&priv->idle_events, g_ptr_array_unref);
+ g_mutex_clear(&priv->idle_events_mutex);
G_OBJECT_CLASS (g_usb_context_parent_class)->dispose (object);
}
@@ -377,23 +386,48 @@ g_usb_context_idle_helper_free (GUsbCont
g_free (helper);
}
+static gpointer
+g_usb_context_idle_helper_copy(gconstpointer src, gpointer user_data)
+{
+ GUsbContextIdleHelper *helper_src = (GUsbContextIdleHelper *)src;
+ GUsbContextIdleHelper *helper_dst = g_new0(GUsbContextIdleHelper, 1);
+ helper_dst->context = g_object_ref(helper_src->context);
+ helper_dst->dev = libusb_ref_device(helper_src->dev);
+ helper_dst->event = helper_src->event;
+ return helper_dst;
+}
+
+/* always in the main thread */
static gboolean
g_usb_context_idle_hotplug_cb (gpointer user_data)
{
- GUsbContextIdleHelper *helper = (GUsbContextIdleHelper *) user_data;
+ GUsbContext *context = G_USB_CONTEXT(user_data);
+ GUsbContextPrivate *priv = context->priv;
+ g_autoptr(GPtrArray) idle_events = NULL;
- switch (helper->event) {
- case LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED:
- g_usb_context_add_device (helper->context, helper->dev);
- break;
- case LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT:
- g_usb_context_remove_device (helper->context, helper->dev);
- break;
- default:
- break;
+ /* drain the idle events with the lock held */
+ g_mutex_lock(&priv->idle_events_mutex);
+ idle_events = g_ptr_array_copy(priv->idle_events, g_usb_context_idle_helper_copy, NULL);
+ g_ptr_array_set_size(priv->idle_events, 0);
+ priv->idle_events_id = 0;
+ g_mutex_unlock(&priv->idle_events_mutex);
+
+ /* run the callbacks when not locked */
+ for (guint i = 0; i < idle_events->len; i++) {
+ GUsbContextIdleHelper *helper = g_ptr_array_index(idle_events, i);
+ switch (helper->event) {
+ case LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED:
+ g_usb_context_add_device(helper->context, helper->dev);
+ break;
+ case LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT:
+ g_usb_context_remove_device(helper->context, helper->dev);
+ break;
+ default:
+ break;
+ }
}
- g_usb_context_idle_helper_free (helper);
+ /* all done */
return FALSE;
}
@@ -405,13 +439,19 @@ g_usb_context_hotplug_cb (struct libusb_
{
GUsbContext *context = G_USB_CONTEXT (user_data);
GUsbContextIdleHelper *helper;
+ GUsbContextPrivate *priv = context->priv;
+ g_autoptr(GMutexLocker) locker = g_mutex_locker_new(&priv->idle_events_mutex);
+
+ g_assert(locker != NULL);
helper = g_new0 (GUsbContextIdleHelper, 1);
- helper->context = context;
+ helper->context = g_object_ref(context);
helper->dev = libusb_ref_device (dev);
helper->event = event;
- g_idle_add (g_usb_context_idle_hotplug_cb, helper);
+ g_ptr_array_add(priv->idle_events, helper);
+ if (priv->idle_events_id == 0)
+ priv->idle_events_id = g_idle_add(g_usb_context_idle_hotplug_cb, context);
return 0;
}
@@ -605,6 +645,11 @@ g_usb_context_init (GUsbContext *context
priv->dict_usb_ids = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
priv->dict_replug = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, NULL);
+
+ /* to escape the thread into the mainloop */
+ g_mutex_init(&priv->idle_events_mutex);
+ priv->idle_events =
+ g_ptr_array_new_with_free_func((GDestroyNotify)g_usb_context_idle_helper_free);
}
static gboolean

View File

@ -1,18 +1,20 @@
Summary: GLib wrapper around libusb1
Name: libgusb
Version: 0.3.0
Release: 1%{?dist}
Version: 0.3.8
Release: 2%{?dist}
License: LGPLv2+
URL: https://github.com/hughsie/libgusb
Source0: http://people.freedesktop.org/~hughsient/releases/%{name}-%{version}.tar.xz
# backport from upstream
Patch0: idle-events-mutex.patch
BuildRequires: glib2-devel >= 2.38.0
BuildRequires: gobject-introspection-devel
BuildRequires: gtk-doc
BuildRequires: libusb1-devel >= 1.0.19
BuildRequires: meson
BuildRequires: vala-devel
BuildRequires: vala-tools
BuildRequires: vala
%description
GUsb is a GObject wrapper for libusb1 that makes it easy to do
@ -27,7 +29,7 @@ Requires: %{name} = %{version}-%{release}
GLib headers and libraries for gusb.
%prep
%setup -q
%autosetup -p1
%build
%meson -Dvapi=true -Dtests=true
@ -40,14 +42,12 @@ GLib headers and libraries for gusb.
%ldconfig_scriptlets
%files
%defattr(-,root,root,-)
%doc README.md AUTHORS NEWS COPYING
%{_libdir}/libgusb.so.?
%{_libdir}/libgusb.so.?.0.*
%{_libdir}/girepository-1.0/GUsb-1.0.typelib
%files devel
%defattr(-,root,root,-)
%{_includedir}/gusb-1
%{_bindir}/gusbcmd
%{_libdir}/libgusb.so
@ -58,6 +58,76 @@ GLib headers and libraries for gusb.
%{_datadir}/vala/vapi/gusb.vapi
%changelog
* Mon Jul 31 2023 Richard Hughes <richard@hughsie.com> 0.3.8-2
- Backport a patch to fix a rare multithreaded crash on device replug
- Resolves: rhbz#2227760
* Wed Oct 06 2021 Richard Hughes <richard@hughsie.com> 0.3.8-1
- New upstream version
- Add new API requested by fwupd
- Add the GUsbEndpoint methods to the docs
- Fix hotplug handling and signal emission during enumerate
- Do not double-reference USB devices
- Resolves: rhbz#1965885
* Mon Aug 09 2021 Mohan Boddu <mboddu@redhat.com> - 0.3.6-3
- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
Related: rhbz#1991688
* Fri Apr 16 2021 Mohan Boddu <mboddu@redhat.com> - 0.3.6-2
- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937
* Fri Mar 12 2021 Richard Hughes <richard@hughsie.com> 0.3.6-1
- New upstream version
- Add g_usb_device_get_string_descriptor_bytes()
- Fix cancellation if cancellable is already cancelled
* Tue Jan 26 2021 Fedora Release Engineering <releng@fedoraproject.org> - 0.3.5-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
* Thu Jul 30 2020 Richard Hughes <richard@hughsie.com> 0.3.5-1
- New upstream version
- Add a way to get iConfiguration
- Allow building GtkDoc when building as a subproject
* Tue Jul 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 0.3.4-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
* Thu Feb 20 2020 Richard Hughes <richard@hughsie.com> 0.3.4-1
- New upstream version
- Include the USB bus in the generated platform_id
- Validate the exported symbol list during check
* Thu Jan 30 2020 Richard Hughes <richard@hughsie.com> 0.3.3-1
- New upstream version
- Add a thin glib wrapper around libusb_endpoint_descriptor
- Fix high number of wakeups when checking the GUsbContext
* Wed Jan 29 2020 Fedora Release Engineering <releng@fedoraproject.org> - 0.3.2-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
* Mon Jan 06 2020 Richard Hughes <richard@hughsie.com> 0.3.2-1
- New upstream version
- Do not use deprecated libusb API
- Use a 1ms timeout in the Windows event thread
* Sat Nov 16 2019 Richard Hughes <richard@hughsie.com> 0.3.1-1
- New upstream version
- Add some new API for fwupd
- Fix GI length introspection annotations
* Thu Jul 25 2019 Fedora Release Engineering <releng@fedoraproject.org> - 0.3.0-5
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
* Mon Feb 04 2019 Kalev Lember <klember@redhat.com> - 0.3.0-4
- Update BRs for vala packaging changes
* Fri Feb 01 2019 Fedora Release Engineering <releng@fedoraproject.org> - 0.3.0-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
* Fri Jul 13 2018 Fedora Release Engineering <releng@fedoraproject.org> - 0.3.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
* Thu Feb 15 2018 Richard Hughes <richard@hughsie.com> 0.3.0-1
- New upstream version
- Port to the Meson build system

11
main.fmf Normal file
View File

@ -0,0 +1,11 @@
summary: Run internal libgusb tests
discover:
- name: Internal libgusb gating tests
how: fmf
url: https://gitlab.cee.redhat.com/desktopqe/libgusb.git
path: /
ref: rhel-9
filter: 'tag:gate'
execute:
how: tmt

1
sources Normal file
View File

@ -0,0 +1 @@
SHA512 (libgusb-0.3.8.tar.xz) = d0df0d6d94ef1920bd8114d63c078cdaaa04b5fe84f77ab6699cb60d0db75f60dc2a3f39ed4e04dc122fc3590f677719a3448a93a8f779e4dc8ce6c191ddb416