Use safe thread class instead of std::thread
This commit is contained in:
parent
d84363019b
commit
4ba9248038
|
@ -20,6 +20,7 @@
|
||||||
#include "Report.h"
|
#include "Report.h"
|
||||||
#include "Receiver.h"
|
#include "Receiver.h"
|
||||||
#include "Error.h"
|
#include "Error.h"
|
||||||
|
#include "../../util/thread.h"
|
||||||
|
|
||||||
using namespace logid::backend::dj;
|
using namespace logid::backend::dj;
|
||||||
using namespace logid::backend;
|
using namespace logid::backend;
|
||||||
|
@ -214,13 +215,14 @@ std::string Receiver::getDeviceName(hidpp::DeviceIndex index)
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
hidpp::DeviceIndex Receiver::deviceDisconnectionEvent(hidpp::Report& report)
|
hidpp::DeviceIndex Receiver::deviceDisconnectionEvent(const hidpp::Report&
|
||||||
|
report)
|
||||||
{
|
{
|
||||||
assert(report.subId() == DeviceDisconnection);
|
assert(report.subId() == DeviceDisconnection);
|
||||||
return report.deviceIndex();
|
return report.deviceIndex();
|
||||||
}
|
}
|
||||||
|
|
||||||
hidpp::DeviceConnectionEvent Receiver::deviceConnectionEvent(
|
hidpp::DeviceConnectionEvent Receiver::deviceConnectionEvent(const
|
||||||
hidpp::Report &report)
|
hidpp::Report &report)
|
||||||
{
|
{
|
||||||
assert(report.subId() == DeviceConnection);
|
assert(report.subId() == DeviceConnection);
|
||||||
|
@ -322,7 +324,10 @@ Receiver::ConnectionStatusEvent Receiver::connectionStatusEvent(Report& report)
|
||||||
void Receiver::listen()
|
void Receiver::listen()
|
||||||
{
|
{
|
||||||
if(!_raw_device->isListening())
|
if(!_raw_device->isListening())
|
||||||
std::thread{[this]() { this->_raw_device->listen(); }}.detach();
|
///TODO: Kill RawDevice?
|
||||||
|
thread::spawn({[raw=this->_raw_device]() {
|
||||||
|
raw->listen();
|
||||||
|
}});
|
||||||
|
|
||||||
if(_raw_device->eventHandlers().find("RECV_HIDPP") ==
|
if(_raw_device->eventHandlers().find("RECV_HIDPP") ==
|
||||||
_raw_device->eventHandlers().end()) {
|
_raw_device->eventHandlers().end()) {
|
||||||
|
|
|
@ -140,9 +140,9 @@ namespace dj
|
||||||
std::string getDeviceName(hidpp::DeviceIndex index);
|
std::string getDeviceName(hidpp::DeviceIndex index);
|
||||||
|
|
||||||
static hidpp::DeviceIndex deviceDisconnectionEvent(
|
static hidpp::DeviceIndex deviceDisconnectionEvent(
|
||||||
hidpp::Report& report);
|
const hidpp::Report& report);
|
||||||
static hidpp::DeviceConnectionEvent deviceConnectionEvent(
|
static hidpp::DeviceConnectionEvent deviceConnectionEvent(
|
||||||
hidpp::Report& report);
|
const hidpp::Report& report);
|
||||||
|
|
||||||
void listen();
|
void listen();
|
||||||
void stopListening();
|
void stopListening();
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ReceiverMonitor.h"
|
#include "ReceiverMonitor.h"
|
||||||
|
#include "../../util/thread.h"
|
||||||
|
#include "../../util.h"
|
||||||
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
@ -55,14 +57,24 @@ void ReceiverMonitor::run()
|
||||||
/* Running in a new thread prevents deadlocks since the
|
/* Running in a new thread prevents deadlocks since the
|
||||||
* receiver may be enumerating.
|
* receiver may be enumerating.
|
||||||
*/
|
*/
|
||||||
std::thread{[this](hidpp::Report report) {
|
thread::spawn({[this, report]() {
|
||||||
if (report.subId() == Receiver::DeviceConnection)
|
if (report.subId() == Receiver::DeviceConnection)
|
||||||
this->addDevice(this->_receiver->deviceConnectionEvent(
|
this->addDevice(this->_receiver->deviceConnectionEvent
|
||||||
report));
|
(report));
|
||||||
else if (report.subId() == Receiver::DeviceDisconnection)
|
else if (report.subId() == Receiver::DeviceDisconnection)
|
||||||
this->removeDevice(this->_receiver->
|
this->removeDevice(this->_receiver->
|
||||||
deviceDisconnectionEvent(report));
|
deviceDisconnectionEvent(report));
|
||||||
}, report}.detach();
|
}}, {[report, path=this->_receiver->rawDevice()->hidrawPath()]
|
||||||
|
(std::exception& e) {
|
||||||
|
if(report.subId() == Receiver::DeviceConnection)
|
||||||
|
log_printf(ERROR, "Failed to add device %d to receiver "
|
||||||
|
"on %s: %s", report.deviceIndex(),
|
||||||
|
path.c_str(), e.what());
|
||||||
|
else if(report.subId() == Receiver::DeviceDisconnection)
|
||||||
|
log_printf(ERROR, "Failed to remove device %d from "
|
||||||
|
"receiver on %s: %s", report.deviceIndex()
|
||||||
|
,path.c_str(), e.what());
|
||||||
|
}});
|
||||||
};
|
};
|
||||||
|
|
||||||
_receiver->addHidppEventHandler("RECVMON", event_handler);
|
_receiver->addHidppEventHandler("RECVMON", event_handler);
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
#include "../../util/thread.h"
|
||||||
#include "Device.h"
|
#include "Device.h"
|
||||||
#include "Report.h"
|
#include "Report.h"
|
||||||
#include "../hidpp20/features/Root.h"
|
#include "../hidpp20/features/Root.h"
|
||||||
|
@ -182,7 +183,10 @@ Report Device::sendReport(Report& report)
|
||||||
void Device::listen()
|
void Device::listen()
|
||||||
{
|
{
|
||||||
if(!_raw_device->isListening())
|
if(!_raw_device->isListening())
|
||||||
std::thread{[=]() { _raw_device->listen(); }}.detach();
|
///TODO: Kill RawDevice?
|
||||||
|
thread::spawn({[raw=this->_raw_device]() {
|
||||||
|
raw->listen();
|
||||||
|
}});
|
||||||
|
|
||||||
// Pass all HID++ events with device index to this device.
|
// Pass all HID++ events with device index to this device.
|
||||||
std::shared_ptr<raw::RawEventHandler> handler;
|
std::shared_ptr<raw::RawEventHandler> handler;
|
||||||
|
|
|
@ -199,7 +199,7 @@ void Report::setType(Report::Type type)
|
||||||
_data[Offset::Type] = type;
|
_data[Offset::Type] = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
hidpp::DeviceIndex Report::deviceIndex()
|
hidpp::DeviceIndex Report::deviceIndex() const
|
||||||
{
|
{
|
||||||
return static_cast<hidpp::DeviceIndex>(_data[Offset::DeviceIndex]);
|
return static_cast<hidpp::DeviceIndex>(_data[Offset::DeviceIndex]);
|
||||||
}
|
}
|
||||||
|
@ -261,6 +261,26 @@ void Report::setAddress(uint8_t address)
|
||||||
_data[Offset::Address] = address;
|
_data[Offset::Address] = address;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<uint8_t>::iterator Report::paramBegin()
|
||||||
|
{
|
||||||
|
return _data.begin() + Offset::Parameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<uint8_t>::iterator Report::paramEnd()
|
||||||
|
{
|
||||||
|
return _data.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<uint8_t>::const_iterator Report::paramBegin() const
|
||||||
|
{
|
||||||
|
return _data.begin() + Offset::Parameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<uint8_t>::const_iterator Report::paramEnd() const
|
||||||
|
{
|
||||||
|
return _data.end();
|
||||||
|
}
|
||||||
|
|
||||||
void Report::setParams(const std::vector<uint8_t>& _params)
|
void Report::setParams(const std::vector<uint8_t>& _params)
|
||||||
{
|
{
|
||||||
assert(_params.size() <= _data.size()-HeaderLength);
|
assert(_params.size() <= _data.size()-HeaderLength);
|
||||||
|
|
|
@ -78,7 +78,7 @@ namespace hidpp
|
||||||
Report::Type type() const;
|
Report::Type type() const;
|
||||||
void setType(Report::Type type);
|
void setType(Report::Type type);
|
||||||
|
|
||||||
logid::backend::hidpp::DeviceIndex deviceIndex();
|
logid::backend::hidpp::DeviceIndex deviceIndex() const;
|
||||||
void setDeviceIndex(hidpp::DeviceIndex index);
|
void setDeviceIndex(hidpp::DeviceIndex index);
|
||||||
|
|
||||||
uint8_t feature() const;
|
uint8_t feature() const;
|
||||||
|
@ -96,11 +96,10 @@ namespace hidpp
|
||||||
uint8_t address() const;
|
uint8_t address() const;
|
||||||
void setAddress(uint8_t address);
|
void setAddress(uint8_t address);
|
||||||
|
|
||||||
std::vector<uint8_t>::iterator paramBegin()
|
std::vector<uint8_t>::iterator paramBegin();
|
||||||
{
|
std::vector<uint8_t>::iterator paramEnd();
|
||||||
return _data.begin() + Offset::Parameters;
|
std::vector<uint8_t>::const_iterator paramBegin() const;
|
||||||
}
|
std::vector<uint8_t>::const_iterator paramEnd() const;
|
||||||
std::vector<uint8_t>::iterator paramEnd() { return _data.end(); }
|
|
||||||
void setParams(const std::vector<uint8_t>& _params);
|
void setParams(const std::vector<uint8_t>& _params);
|
||||||
|
|
||||||
struct Hidpp10Error
|
struct Hidpp10Error
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "DeviceMonitor.h"
|
#include "DeviceMonitor.h"
|
||||||
|
#include "../../util/thread.h"
|
||||||
|
#include "../../util.h"
|
||||||
|
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include <system_error>
|
#include <system_error>
|
||||||
|
@ -96,13 +98,19 @@ void DeviceMonitor::run()
|
||||||
std::string devnode = udev_device_get_devnode(device);
|
std::string devnode = udev_device_get_devnode(device);
|
||||||
|
|
||||||
if (action == "add")
|
if (action == "add")
|
||||||
std::thread([this](const std::string name) {
|
thread::spawn([this, name=devnode]() {
|
||||||
this->addDevice(name);
|
this->addDevice(name);
|
||||||
}, devnode).detach();
|
}, [name=devnode](std::exception& e){
|
||||||
|
log_printf(WARN, "Error adding device %s: %s",
|
||||||
|
name.c_str(), e.what());
|
||||||
|
});
|
||||||
else if (action == "remove")
|
else if (action == "remove")
|
||||||
std::thread([this](const std::string name) {
|
thread::spawn([this, name=devnode]() {
|
||||||
this->removeDevice(name);
|
this->removeDevice(name);
|
||||||
}, devnode).detach();
|
}, [name=devnode](std::exception& e){
|
||||||
|
log_printf(WARN, "Error removing device %s: %s",
|
||||||
|
name.c_str(), e.what());
|
||||||
|
});
|
||||||
|
|
||||||
udev_device_unref (device);
|
udev_device_unref (device);
|
||||||
}
|
}
|
||||||
|
@ -149,9 +157,12 @@ void DeviceMonitor::enumerate()
|
||||||
std::string devnode = udev_device_get_devnode(device);
|
std::string devnode = udev_device_get_devnode(device);
|
||||||
udev_device_unref(device);
|
udev_device_unref(device);
|
||||||
|
|
||||||
std::thread([this](const std::string& name) {
|
thread::spawn([this, name=devnode]() {
|
||||||
this->addDevice(name);
|
this->addDevice(name);
|
||||||
}, devnode).detach();
|
}, [name=devnode](std::exception& e){
|
||||||
|
log_printf(ERROR, "Error adding device %s: %s",
|
||||||
|
name.c_str(), e.what());
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
udev_enumerate_unref(udev_enum);
|
udev_enumerate_unref(udev_enum);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user