summaryrefslogtreecommitdiffstats
path: root/pym
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2009-03-11 06:11:21 +0000
committerZac Medico <zmedico@gentoo.org>2009-03-11 06:11:21 +0000
commita4219b47157101bd7ae0165d4fd86c307ffb2c6f (patch)
tree47b0b1023996968935ba0c3bd564f13b4b49b180 /pym
parentf74f7597a36799a040f64300ea6d9d3363137700 (diff)
downloadportage-a4219b47157101bd7ae0165d4fd86c307ffb2c6f.tar.gz
portage-a4219b47157101bd7ae0165d4fd86c307ffb2c6f.tar.bz2
portage-a4219b47157101bd7ae0165d4fd86c307ffb2c6f.zip
Use a lock to ensure that threaded code doesn't cause problems with proxy
registration and unregistration. (trunk r12683) svn path=/main/branches/2.1.6/; revision=12943
Diffstat (limited to 'pym')
-rw-r--r--pym/portage/proxy/lazyimport.py51
1 files changed, 36 insertions, 15 deletions
diff --git a/pym/portage/proxy/lazyimport.py b/pym/portage/proxy/lazyimport.py
index 954b29d74..1a4a246ef 100644
--- a/pym/portage/proxy/lazyimport.py
+++ b/pym/portage/proxy/lazyimport.py
@@ -6,16 +6,27 @@ __all__ = ['lazyimport']
import sys
import types
+
+try:
+ import threading
+except ImportError:
+ import dummy_threading as threading
+
from portage.proxy.objectproxy import ObjectProxy
_module_proxies = {}
+_module_proxies_lock = threading.RLock()
def _register_module_proxy(name, proxy):
- proxy_list = _module_proxies.get(name)
- if proxy_list is None:
- proxy_list = []
- _module_proxies[name] = proxy_list
- proxy_list.append(proxy)
+ _module_proxies_lock.acquire()
+ try:
+ proxy_list = _module_proxies.get(name)
+ if proxy_list is None:
+ proxy_list = []
+ _module_proxies[name] = proxy_list
+ proxy_list.append(proxy)
+ finally:
+ _module_proxies_lock.release()
def _unregister_module_proxy(name):
"""
@@ -24,20 +35,30 @@ def _unregister_module_proxy(name):
destroy those proxies too. This way, destruction of a single proxy
can trigger destruction of all the rest.
"""
- proxy_list = _module_proxies.get(name)
- if proxy_list is not None:
- del _module_proxies[name]
- for proxy in proxy_list:
- object.__getattribute__(proxy, '_get_target')()
-
- modules = sys.modules
- for name, proxy_list in list(_module_proxies.iteritems()):
- if name not in modules:
- continue
+ _module_proxies_lock.acquire()
+ try:
+ proxy_list = _module_proxies.get(name)
+ if proxy_list is not None:
+ # First delete this name from the dict so that
+ # if this same thread reenters below, it won't
+ # enter this path again.
del _module_proxies[name]
for proxy in proxy_list:
object.__getattribute__(proxy, '_get_target')()
+ modules = sys.modules
+ for name, proxy_list in list(_module_proxies.iteritems()):
+ if name not in modules:
+ continue
+ # First delete this name from the dict so that
+ # if this same thread reenters below, it won't
+ # enter this path again.
+ del _module_proxies[name]
+ for proxy in proxy_list:
+ object.__getattribute__(proxy, '_get_target')()
+ finally:
+ _module_proxies_lock.release()
+
class _LazyImport(ObjectProxy):
__slots__ = ('_scope', '_alias', '_name', '_target')