diff options
author | Denis Shienkov <denis.shienkov@gmail.com> | 2014-06-02 23:38:37 +0000 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-06-07 17:58:25 +0200 |
commit | 2cde429d3bd3adc2bfc7d268fb64aad97a07e0e1 (patch) | |
tree | 374e5b6fb49eb554b2b93dff05ec8d4d6badb3ca | |
parent | 6aa21015ea0a956d8a563dd3b52f4701368b4f2d (diff) | |
download | qtserialport-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.cpp | 32 |
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; |