Dereference device with a defer call to prevent memory leaks (#98)
We should always dereference devices. c.libusb.open is keeping its own internal reference so there is no risk of breaking anything.
This commit is contained in:
@@ -209,7 +209,7 @@ func (libusbImpl) getDevices(ctx *libusbContext) ([]*libusbDevice, error) {
|
|||||||
for _, d := range devs {
|
for _, d := range devs {
|
||||||
ret = append(ret, (*libusbDevice)(d))
|
ret = append(ret, (*libusbDevice)(d))
|
||||||
}
|
}
|
||||||
// devices will be dereferenced later, during close.
|
// devices must be dereferenced by the caller to prevent memoryleaks
|
||||||
C.libusb_free_device_list(list, 0)
|
C.libusb_free_device_list(list, 0)
|
||||||
return ret, nil
|
return ret, nil
|
||||||
}
|
}
|
||||||
|
29
usb.go
29
usb.go
@@ -187,27 +187,26 @@ func (c *Context) OpenDevices(opener func(desc *DeviceDesc) bool) ([]*Device, er
|
|||||||
var ret []*Device
|
var ret []*Device
|
||||||
for _, dev := range list {
|
for _, dev := range list {
|
||||||
desc, err := c.libusb.getDeviceDesc(dev)
|
desc, err := c.libusb.getDeviceDesc(dev)
|
||||||
|
defer c.libusb.dereference(dev)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.libusb.dereference(dev)
|
|
||||||
reterr = err
|
reterr = err
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if opener(desc) {
|
if !opener(desc) {
|
||||||
handle, err := c.libusb.open(dev)
|
continue
|
||||||
if err != nil {
|
|
||||||
c.libusb.dereference(dev)
|
|
||||||
reterr = err
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
o := &Device{handle: handle, ctx: c, Desc: desc}
|
|
||||||
ret = append(ret, o)
|
|
||||||
c.mu.Lock()
|
|
||||||
c.devices[o] = true
|
|
||||||
c.mu.Unlock()
|
|
||||||
} else {
|
|
||||||
c.libusb.dereference(dev)
|
|
||||||
}
|
}
|
||||||
|
handle, err := c.libusb.open(dev)
|
||||||
|
if err != nil {
|
||||||
|
reterr = err
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
o := &Device{handle: handle, ctx: c, Desc: desc}
|
||||||
|
ret = append(ret, o)
|
||||||
|
c.mu.Lock()
|
||||||
|
c.devices[o] = true
|
||||||
|
c.mu.Unlock()
|
||||||
|
|
||||||
}
|
}
|
||||||
return ret, reterr
|
return ret, reterr
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user