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 {
|
||||
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)
|
||||
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
|
||||
for _, dev := range list {
|
||||
desc, err := c.libusb.getDeviceDesc(dev)
|
||||
defer c.libusb.dereference(dev)
|
||||
if err != nil {
|
||||
c.libusb.dereference(dev)
|
||||
reterr = err
|
||||
continue
|
||||
}
|
||||
|
||||
if opener(desc) {
|
||||
handle, err := c.libusb.open(dev)
|
||||
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)
|
||||
if !opener(desc) {
|
||||
continue
|
||||
}
|
||||
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
|
||||
}
|
||||
|
Reference in New Issue
Block a user