From fb0d99c1c9231173b20fc300987a9b6f2991e677 Mon Sep 17 00:00:00 2001 From: Dmitry Rassoshenko <1040910+rda-dev@users.noreply.github.com> Date: Tue, 10 Nov 2020 22:57:10 +0300 Subject: [PATCH] Fix race in ThreadSafeSingleton (#322) --- src/dependency_injector/providers.pyx | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/dependency_injector/providers.pyx b/src/dependency_injector/providers.pyx index 2ef6a590..4bd2ee04 100644 --- a/src/dependency_injector/providers.pyx +++ b/src/dependency_injector/providers.pyx @@ -2178,15 +2178,19 @@ cdef class ThreadSafeSingleton(BaseSingleton): :rtype: None """ - self.__storage = None + with self.__storage_lock: + self.__storage = None cpdef object _provide(self, tuple args, dict kwargs): """Return single instance.""" - with self.__storage_lock: - if self.__storage is None: - self.__storage = __factory_call(self.__instantiator, - args, kwargs) - return self.__storage + storage = self.__storage + if storage is None: + with self.__storage_lock: + if self.__storage is None: + self.__storage = __factory_call(self.__instantiator, + args, kwargs) + storage = self.__storage + return storage cdef class DelegatedThreadSafeSingleton(ThreadSafeSingleton):