summaryrefslogtreecommitdiff
path: root/django/apps/registry.py
diff options
context:
space:
mode:
authorAymeric Augustin <aymeric.augustin@m4x.org>2014-01-12 22:04:22 +0100
committerAymeric Augustin <aymeric.augustin@m4x.org>2014-01-12 22:08:46 +0100
commitd674fe6dee16735dd2670243153326806b7e6cb0 (patch)
tree4fe400c9bade0675f91c451e8ee8f17845d150cc /django/apps/registry.py
parent225a6ed2cfecc609760a36c3b20369daeec52e07 (diff)
Used a regular lock for app registry population.
Since the app registry is always populated before the first request is processed, the situation described in #18251 for the old app cache cannot happen any more. Refs #18251, #21628.
Diffstat (limited to 'django/apps/registry.py')
-rw-r--r--django/apps/registry.py13
1 files changed, 8 insertions, 5 deletions
diff --git a/django/apps/registry.py b/django/apps/registry.py
index a0cd5e0abf..fcd5f576e6 100644
--- a/django/apps/registry.py
+++ b/django/apps/registry.py
@@ -1,11 +1,11 @@
from collections import Counter, defaultdict, OrderedDict
import os
import sys
+import threading
import warnings
from django.core.exceptions import ImproperlyConfigured
from django.utils import lru_cache
-from django.utils.module_loading import import_lock
from django.utils._os import upath
from .base import AppConfig
@@ -44,6 +44,9 @@ class Apps(object):
# Whether the registry is populated.
self.ready = False
+ # Lock for thread-safe population.
+ self._lock = threading.Lock()
+
# Pending lookups for lazy relations.
self._pending_lookups = {}
@@ -61,10 +64,10 @@ class Apps(object):
"""
if self.ready:
return
- # Since populate() may be a side effect of imports, and since it will
- # itself import modules, an ABBA deadlock between threads would be
- # possible if we didn't take the import lock. See #18251.
- with import_lock():
+
+ # populate() might be called by two threads in parallel on servers
+ # that create threads before initializing the WSGI callable.
+ with self._lock:
if self.ready:
return