--- netmd/usb1.py | 14 +++++++++----- 1 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/netmd/usb1.py b/netmd/usb1.py index c5d9f77..925adfc 100644 --- a/netmd/usb1.py +++ b/netmd/usb1.py @@ -11,7 +11,10 @@ STRING_LENGTH = 256 class USBDeviceHandle(object): handle = None - def __init__(self, handle): + def __init__(self, context, handle): + # XXX Context parameter is just here as a hint for garbage collector: + # It must collect USBDeviceHandle instance before their LibUSBContext. + self.context = context self.handle = handle def __del__(self): @@ -232,7 +235,8 @@ class USBDevice(object): configuration_descriptor_list = None - def __init__(self, device_p): + def __init__(self, context, device_p): + self.context = context libusb1.libusb_ref_device(device_p) self.device_p = device_p # Fetch device descriptor @@ -373,7 +377,7 @@ class USBDevice(object): result = libusb1.libusb_open(self.device_p, byref(handle)) if result: raise libusb1.USBError, result - return USBDeviceHandle(handle) + return USBDeviceHandle(self.context, handle) class LibUSBContext(object): @@ -399,7 +403,7 @@ class LibUSBContext(object): device_p_p = libusb1.libusb_device_p_p() device_list_len = libusb1.libusb_get_device_list(self.context_p, byref(device_p_p)) - result = [USBDevice(x) for x in device_p_p[:device_list_len]] + result = [USBDevice(self, x) for x in device_p_p[:device_list_len]] # XXX: causes problems, why ? #libusb1.libusb_free_device_list(device_p_p, 1) return result @@ -408,7 +412,7 @@ class LibUSBContext(object): handle_p = libusb1.libusb_open_device_with_vid_pid(self.context_p, vendor_id, product_id) if handle_p: - result = USBDeviceHandle(handle_p) + result = USBDeviceHandle(self, handle_p) else: result = None return result