]> sigrok.org Git - libsigrok.git/commitdiff
C++: Correct ownership of InputDevice objects.
authorMartin Ling <redacted>
Sun, 24 Aug 2014 01:00:14 +0000 (02:00 +0100)
committerBert Vermeulen <redacted>
Mon, 25 Aug 2014 23:55:41 +0000 (01:55 +0200)
bindings/cxx/classes.cpp
bindings/cxx/include/libsigrok/libsigrok.hpp

index 986b2c1e1da3fe60daa96ffbb0b15f9d71434f6d..edd68bd451e7e0074c0fed47c043d9901ed0e89b 100644 (file)
@@ -361,7 +361,7 @@ Glib::VariantContainerBase Configurable::config_list(const ConfigKey *key)
 
 Device::Device(struct sr_dev_inst *structure) :
        Configurable(structure->driver, structure, NULL),
-       StructureWrapper<Context, struct sr_dev_inst>(structure)
+       structure(structure)
 {
        for (GSList *entry = structure->channels; entry; entry = entry->next)
        {
@@ -453,6 +453,7 @@ void Device::close()
 }
 
 HardwareDevice::HardwareDevice(Driver *driver, struct sr_dev_inst *structure) :
+       StructureWrapper(structure),
        Device(structure),
        driver(driver)
 {
@@ -1155,7 +1156,7 @@ shared_ptr<InputDevice> Input::get_device()
        }
 
        return static_pointer_cast<InputDevice>(
-               device->get_shared_pointer(context->shared_from_this()));
+               device->get_shared_pointer(shared_from_this()));
 }
 
 void Input::send(string data)
@@ -1173,8 +1174,10 @@ Input::~Input()
        check(sr_input_free(structure));
 }
 
-InputDevice::InputDevice(shared_ptr<Input> input, struct sr_dev_inst *sdi) :
-       Device(sdi),
+InputDevice::InputDevice(shared_ptr<Input> input,
+               struct sr_dev_inst *structure) :
+       StructureWrapper(structure),
+       Device(structure),
        input(input)
 {
 }
index 546a4502e7fb6fe945c5c2070e01bbe24c13c94a..cc57d1a026cd3e470789873fc60a233188b6a578 100644 (file)
@@ -290,8 +290,8 @@ protected:
 
 /** A generic device, either hardware or virtual */
 class SR_API Device :
-       public Configurable,
-       public StructureWrapper<Context, struct sr_dev_inst>
+       public enable_shared_from_this<Device>,
+       public Configurable
 {
 public:
        /** Description identifying this device. */
@@ -314,6 +314,7 @@ protected:
        Device(struct sr_dev_inst *structure);
        ~Device();
        shared_ptr<Channel> get_channel(struct sr_channel *ptr);
+       struct sr_dev_inst *structure;
        map<struct sr_channel *, Channel *> channels;
        map<string, ChannelGroup *> channel_groups;
        /** Deleter needed to allow shared_ptr use with protected destructor. */
@@ -331,7 +332,9 @@ protected:
 };
 
 /** A real hardware device, connected via a driver */
-class SR_API HardwareDevice : public Device
+class SR_API HardwareDevice :
+       public StructureWrapper<Context, struct sr_dev_inst>,
+       public Device
 {
 public:
        /** Driver providing this device. */
@@ -777,7 +780,9 @@ protected:
 };
 
 /** A virtual device associated with an input */
-class SR_API InputDevice : public Device
+class SR_API InputDevice :
+       public StructureWrapper<Input, struct sr_dev_inst>,
+       public Device
 {
 protected:
        InputDevice(shared_ptr<Input> input, struct sr_dev_inst *sdi);