C++: Make hardware device instances user owned.
This commit is contained in:
parent
8fa3fc7c60
commit
a4e4745458
|
@ -256,8 +256,6 @@ Driver::Driver(struct sr_dev_driver *structure) :
|
||||||
|
|
||||||
Driver::~Driver()
|
Driver::~Driver()
|
||||||
{
|
{
|
||||||
for (auto device : _devices)
|
|
||||||
delete device;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
string Driver::name()
|
string Driver::name()
|
||||||
|
@ -280,11 +278,6 @@ vector<shared_ptr<HardwareDevice>> Driver::scan(
|
||||||
_initialized = true;
|
_initialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clear all existing instances. */
|
|
||||||
for (auto device : _devices)
|
|
||||||
delete device;
|
|
||||||
_devices.clear();
|
|
||||||
|
|
||||||
/* Translate scan options to GSList of struct sr_config pointers. */
|
/* Translate scan options to GSList of struct sr_config pointers. */
|
||||||
GSList *option_list = NULL;
|
GSList *option_list = NULL;
|
||||||
for (auto entry : options)
|
for (auto entry : options)
|
||||||
|
@ -303,20 +296,20 @@ vector<shared_ptr<HardwareDevice>> Driver::scan(
|
||||||
/* Free option list. */
|
/* Free option list. */
|
||||||
g_slist_free_full(option_list, g_free);
|
g_slist_free_full(option_list, g_free);
|
||||||
|
|
||||||
|
|
||||||
/* Create device objects. */
|
/* Create device objects. */
|
||||||
|
vector<shared_ptr<HardwareDevice>> result;
|
||||||
for (GSList *device = device_list; device; device = device->next)
|
for (GSList *device = device_list; device; device = device->next)
|
||||||
{
|
{
|
||||||
auto sdi = (struct sr_dev_inst *) device->data;
|
auto sdi = (struct sr_dev_inst *) device->data;
|
||||||
_devices.push_back(new HardwareDevice(this, sdi));
|
result.push_back(shared_ptr<HardwareDevice>(
|
||||||
|
new HardwareDevice(shared_from_this(), sdi),
|
||||||
|
HardwareDevice::Deleter()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Free GSList returned from scan. */
|
/* Free GSList returned from scan. */
|
||||||
g_slist_free(device_list);
|
g_slist_free(device_list);
|
||||||
|
|
||||||
/* Create list of shared pointers to device instances for return. */
|
|
||||||
vector<shared_ptr<HardwareDevice>> result;
|
|
||||||
for (auto device : _devices)
|
|
||||||
result.push_back(device->get_shared_pointer(_parent));
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -501,8 +494,9 @@ void Device::close()
|
||||||
check(sr_dev_close(_structure));
|
check(sr_dev_close(_structure));
|
||||||
}
|
}
|
||||||
|
|
||||||
HardwareDevice::HardwareDevice(Driver *driver, struct sr_dev_inst *structure) :
|
HardwareDevice::HardwareDevice(shared_ptr<Driver> driver,
|
||||||
ParentOwned(structure),
|
struct sr_dev_inst *structure) :
|
||||||
|
UserOwned(structure),
|
||||||
Device(structure),
|
Device(structure),
|
||||||
_driver(driver)
|
_driver(driver)
|
||||||
{
|
{
|
||||||
|
@ -519,7 +513,7 @@ shared_ptr<Device> HardwareDevice::get_shared_from_this()
|
||||||
|
|
||||||
shared_ptr<Driver> HardwareDevice::driver()
|
shared_ptr<Driver> HardwareDevice::driver()
|
||||||
{
|
{
|
||||||
return _driver->get_shared_pointer(_parent);
|
return _driver;
|
||||||
}
|
}
|
||||||
|
|
||||||
Channel::Channel(struct sr_channel *structure) :
|
Channel::Channel(struct sr_channel *structure) :
|
||||||
|
|
|
@ -379,17 +379,24 @@ protected:
|
||||||
|
|
||||||
/** A real hardware device, connected via a driver */
|
/** A real hardware device, connected via a driver */
|
||||||
class SR_API HardwareDevice :
|
class SR_API HardwareDevice :
|
||||||
public ParentOwned<HardwareDevice, Context, struct sr_dev_inst>,
|
public UserOwned<HardwareDevice, struct sr_dev_inst>,
|
||||||
public Device
|
public Device
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/** Driver providing this device. */
|
/** Driver providing this device. */
|
||||||
shared_ptr<Driver> driver();
|
shared_ptr<Driver> driver();
|
||||||
protected:
|
protected:
|
||||||
HardwareDevice(Driver *driver, struct sr_dev_inst *structure);
|
HardwareDevice(shared_ptr<Driver> driver, struct sr_dev_inst *structure);
|
||||||
~HardwareDevice();
|
~HardwareDevice();
|
||||||
shared_ptr<Device> get_shared_from_this();
|
shared_ptr<Device> get_shared_from_this();
|
||||||
Driver *_driver;
|
shared_ptr<Driver> _driver;
|
||||||
|
/** Deleter needed to allow shared_ptr use with protected destructor. */
|
||||||
|
class Deleter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void operator()(HardwareDevice *device) { delete device; }
|
||||||
|
};
|
||||||
|
friend class Deleter;
|
||||||
friend class Driver;
|
friend class Driver;
|
||||||
friend class ChannelGroup;
|
friend class ChannelGroup;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue