Skip to content

Commit 11e700b

Browse files
committed
usb1: Make finalizer registration thread-safe
itertools.count.__next__ is not thread-safe. Wrapping it in a lock call seems the simplest approach. Make counter an instance attribute rather than a class attribute, to reduce the risk of lock contention at the expense of a slight increase in memory use.
1 parent bc572fe commit 11e700b

1 file changed

Lines changed: 4 additions & 3 deletions

File tree

usb1/__init__.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -174,10 +174,10 @@ def create_binary_buffer(init_or_size):
174174
return create_initialised_buffer(init_or_size)
175175

176176
class _LibUSB1Finalizer: # pylint: disable=too-few-public-methods
177-
__finalizer_id_generator = itertools.count()
178-
179177
def __init__(self):
180178
self._finalizer_dict = {}
179+
self.__finalizer_id_generator = itertools.count()
180+
self.__finalizer_id_generator_lock = threading.Lock()
181181

182182
@staticmethod
183183
def __finalize(handle, pop, func, kw):
@@ -187,7 +187,8 @@ def __finalize(handle, pop, func, kw):
187187
pop(handle)
188188

189189
def _getFinalizer(self, obj, func, **kw):
190-
handle = next(self.__finalizer_id_generator)
190+
with self.__finalizer_id_generator_lock:
191+
handle = next(self.__finalizer_id_generator)
191192
finalizer_dict = self._finalizer_dict
192193
finalizer_dict[handle] = finalizer = weakref.finalize(
193194
obj,

0 commit comments

Comments
 (0)