From 2cde429d3bd3adc2bfc7d268fb64aad97a07e0e1 Mon Sep 17 00:00:00 2001 From: Denis Shienkov Date: Mon, 2 Jun 2014 23:38:37 +0000 Subject: Use QScopedPointer (RAII) to do not care of the udev resources MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It is a good idea to get rid from the manually releasing of the allocated udev resources. Tested on ArchLinux 64 bit with on-board and PL2303 serial ports using Qt4 and then Qt5. Change-Id: Ib25e100bea37ad3cc0bee015b7de6d4de762f2cc Reviewed-by: Peter Kümmel Reviewed-by: Sergey Belyashov --- src/serialport/qserialportinfo_unix.cpp | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/src/serialport/qserialportinfo_unix.cpp b/src/serialport/qserialportinfo_unix.cpp index 61d21d6..0529973 100644 --- a/src/serialport/qserialportinfo_unix.cpp +++ b/src/serialport/qserialportinfo_unix.cpp @@ -217,6 +217,22 @@ QList availablePortsBySysfs() } struct ScopedPointerUdevDeleter +{ + static inline void cleanup(struct ::udev *pointer) + { + ::udev_unref(pointer); + } +}; + +struct ScopedPointerUdevEnumeratorDeleter +{ + static inline void cleanup(struct ::udev_enumerate *pointer) + { + ::udev_enumerate_unref(pointer); + } +}; + +struct ScopedPointerUdevDeviceDeleter { static inline void cleanup(struct ::udev_device *pointer) { @@ -284,24 +300,24 @@ QList availablePortsByUdev() static const QString rfcommDeviceName(QStringLiteral("rfcomm")); - struct ::udev *udev = ::udev_new(); + QScopedPointer udev(::udev_new()); + if (udev) { - struct ::udev_enumerate *enumerate = - ::udev_enumerate_new(udev); + QScopedPointer enumerate(::udev_enumerate_new(udev.data())); if (enumerate) { - ::udev_enumerate_add_match_subsystem(enumerate, "tty"); - ::udev_enumerate_scan_devices(enumerate); + ::udev_enumerate_add_match_subsystem(enumerate.data(), "tty"); + ::udev_enumerate_scan_devices(enumerate.data()); struct ::udev_list_entry *devices = - ::udev_enumerate_get_list_entry(enumerate); + ::udev_enumerate_get_list_entry(enumerate.data()); struct ::udev_list_entry *dev_list_entry; udev_list_entry_foreach(dev_list_entry, devices) { - QScopedPointer dev(::udev_device_new_from_syspath(udev, + QScopedPointer dev(::udev_device_new_from_syspath(udev.data(), ::udev_list_entry_get_name(dev_list_entry))); if (dev) { @@ -344,10 +360,8 @@ QList availablePortsByUdev() } - ::udev_enumerate_unref(enumerate); } - ::udev_unref(udev); } return serialPortInfoList; -- cgit v1.2.1