C++: Make hardware device instances user owned.

This commit is contained in:
Martin Ling 2014-09-14 05:33:24 +01:00
parent 8fa3fc7c60
commit a4e4745458
2 changed files with 19 additions and 18 deletions

View File

@ -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) :

View File

@ -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;
}; };