summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Shienkov <denis.shienkov@gmail.com>2014-06-02 23:38:37 +0000
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-06-07 17:58:25 +0200
commit2cde429d3bd3adc2bfc7d268fb64aad97a07e0e1 (patch)
tree374e5b6fb49eb554b2b93dff05ec8d4d6badb3ca
parent6aa21015ea0a956d8a563dd3b52f4701368b4f2d (diff)
downloadqtserialport-2cde429d3bd3adc2bfc7d268fb64aad97a07e0e1.tar.gz
Use QScopedPointer (RAII) to do not care of the udev resources
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 <syntheticpp@gmx.net> Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
-rw-r--r--src/serialport/qserialportinfo_unix.cpp32
1 files 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
@@ -218,6 +218,22 @@ QList<QSerialPortInfo> 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)
{
::udev_device_unref(pointer);
@@ -284,24 +300,24 @@ QList<QSerialPortInfo> availablePortsByUdev()
static const QString rfcommDeviceName(QStringLiteral("rfcomm"));
- struct ::udev *udev = ::udev_new();
+ QScopedPointer<struct ::udev, ScopedPointerUdevDeleter> udev(::udev_new());
+
if (udev) {
- struct ::udev_enumerate *enumerate =
- ::udev_enumerate_new(udev);
+ QScopedPointer<struct ::udev_enumerate, ScopedPointerUdevEnumeratorDeleter> 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<struct ::udev_device, ScopedPointerUdevDeleter> dev(::udev_device_new_from_syspath(udev,
+ QScopedPointer<struct ::udev_device, ScopedPointerUdevDeviceDeleter> dev(::udev_device_new_from_syspath(udev.data(),
::udev_list_entry_get_name(dev_list_entry)));
if (dev) {
@@ -344,10 +360,8 @@ QList<QSerialPortInfo> availablePortsByUdev()
}
- ::udev_enumerate_unref(enumerate);
}
- ::udev_unref(udev);
}
return serialPortInfoList;