5
5
6
6
from abc import ABC , abstractmethod
7
7
from pathlib import Path
8
- from threading import Lock
9
- from typing import TYPE_CHECKING , Generator , Iterator , cast
8
+ from threading import RLock
9
+ from types import MethodType
10
+ from typing import TYPE_CHECKING , Any , Callable , Generator , Iterator , cast
10
11
11
12
from tox .config .main import Config
12
13
from tox .config .sets import EnvConfigSet
@@ -30,11 +31,26 @@ def __str__(self) -> str:
30
31
return str (self .path )
31
32
32
33
34
+ def _lock_method (lock : RLock , meth : Callable [..., Any ]) -> Callable [..., Any ]:
35
+ def _func (* args : Any , ** kwargs : Any ) -> Any :
36
+ with lock :
37
+ return meth (* args , ** kwargs )
38
+
39
+ return _func
40
+
41
+
33
42
class PackageToxEnv (ToxEnv , ABC ):
34
43
def __init__ (self , create_args : ToxEnvCreateArgs ) -> None :
44
+ self ._lock = RLock ()
35
45
super ().__init__ (create_args )
36
46
self ._envs : set [str ] = set ()
37
- self ._lock = Lock ()
47
+
48
+ def __getattribute__ (self , name : str ) -> Any :
49
+ # the packaging class might be used by multiple environments in parallel, hold a lock for operations on it
50
+ obj = object .__getattribute__ (self , name )
51
+ if isinstance (obj , MethodType ):
52
+ obj = _lock_method (self ._lock , obj )
53
+ return obj
38
54
39
55
def register_config (self ) -> None :
40
56
super ().register_config ()
@@ -62,13 +78,11 @@ def register_run_env(self, run_env: RunToxEnv) -> Generator[tuple[str, str], Pac
62
78
yield from () # empty generator by default
63
79
64
80
def mark_active_run_env (self , run_env : RunToxEnv ) -> None :
65
- with self ._lock :
66
- self ._envs .add (run_env .conf .name )
81
+ self ._envs .add (run_env .conf .name )
67
82
68
83
def teardown_env (self , conf : EnvConfigSet ) -> None :
69
- with self ._lock :
70
- self ._envs .remove (conf .name )
71
- has_envs = bool (self ._envs )
84
+ self ._envs .remove (conf .name )
85
+ has_envs = bool (self ._envs )
72
86
if not has_envs :
73
87
self ._teardown ()
74
88
0 commit comments