From f28abb28697c7b38859eb2f341f4153792ac2a75 Mon Sep 17 00:00:00 2001 From: rda-dev Date: Tue, 10 Nov 2020 18:53:52 +0300 Subject: [PATCH] Fix race in ThreadSafeSingleton --- 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):