usb1: Create USBDevice finalizer earlier in __init__.
So that device refcount gets properly decremented when __init__ raises.
diff --git a/usb1/__init__.py b/usb1/__init__.py
index 169d4dd..016e723 100644
--- a/usb1/__init__.py
+++ b/usb1/__init__.py
@@ -1955,8 +1955,22 @@
Call USBContext methods to receive instances of this class.
"""
self.__context = context
- self.__finalizer_dict = {}
+ self.__finalizer_dict = finalizer_dict = {}
+ self.__configuration_descriptor_list = descriptor_list = []
libusb1.libusb_ref_device(device_p)
+ finalizer_handle = id(self)
+ self.close = weakref_finalize(
+ self,
+ self.close, # Note: static method
+ device_p=device_p,
+ finalizer_dict=finalizer_dict,
+ unregisterFinalizer=functools.partial(
+ unregisterFinalizer,
+ handle=finalizer_handle,
+ ),
+ descriptor_list=descriptor_list,
+ )
+ registerFinalizer(finalizer_handle, self.close)
self.device_p = device_p
# Fetch device descriptor
# Note: if this is made lazy, access errors will happen later, breaking
@@ -1967,7 +1981,6 @@
mayRaiseUSBError(result)
self.device_descriptor = device_descriptor
if can_load_configuration:
- self.__configuration_descriptor_list = descriptor_list = []
append = descriptor_list.append
for configuration_id in xrange(
self.device_descriptor.bNumConfigurations):
@@ -1986,19 +1999,6 @@
self.__bus_number = libusb1.libusb_get_bus_number(device_p)
self.__port_number = libusb1.libusb_get_port_number(device_p)
self.__device_address = libusb1.libusb_get_device_address(device_p)
- finalizer_handle = id(self)
- self.close = weakref_finalize(
- self,
- self.close, # Note: static method
- device_p=device_p,
- finalizer_dict=self.__finalizer_dict,
- unregisterFinalizer=functools.partial(
- unregisterFinalizer,
- handle=finalizer_handle,
- ),
- descriptor_list=descriptor_list,
- )
- registerFinalizer(finalizer_handle, self.close)
def __registerFinalizer(self, handle, finalizer):
if handle in self.__finalizer_dict: