Skip to content

Commit 5cf8044

Browse files
authored
Prevent occasional deadlock (#1597)
1 parent 894242f commit 5cf8044

1 file changed

Lines changed: 7 additions & 4 deletions

File tree

Src/IronPython/Runtime/PythonContext.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,13 @@ public sealed partial class PythonContext : LanguageContext {
146146
private int _tracebackListenersCount;
147147

148148
internal FunctionCode.CodeList _allCodes;
149-
internal readonly object _codeCleanupLock = new object(), _codeUpdateLock = new object();
149+
internal readonly object _codeCleanupLock = new object();
150+
internal readonly object _codeUpdateLock = new object();
150151
internal int _codeCount, _nextCodeCleanup = 200;
151152
private int _recursionLimit;
152153

154+
private readonly object _indexBindersLock = new object(); // https://github.com/IronLanguages/ironpython3/issues/1596
155+
153156
internal readonly List<FunctionStack> _mainThreadFunctionStack;
154157
private CallSite<Func<CallSite, CodeContext, object, object>> _callSite0LightEh;
155158
private List<WeakReference> _weakExtensionMethodSets;
@@ -3579,7 +3582,7 @@ ref _binaryBinders[(int)operation],
35793582
Interlocked.CompareExchange(ref _getIndexBinders, new PythonGetIndexBinder[argCount + 1], null);
35803583
}
35813584

3582-
lock (this) {
3585+
lock (_indexBindersLock) {
35833586
if (_getIndexBinders.Length <= argCount) {
35843587
Array.Resize(ref _getIndexBinders, argCount + 1);
35853588
}
@@ -3597,7 +3600,7 @@ ref _binaryBinders[(int)operation],
35973600
Interlocked.CompareExchange(ref _setIndexBinders, new PythonSetIndexBinder[argCount + 1], null);
35983601
}
35993602

3600-
lock (this) {
3603+
lock (_indexBindersLock) {
36013604
if (_setIndexBinders.Length <= argCount) {
36023605
Array.Resize(ref _setIndexBinders, argCount + 1);
36033606
}
@@ -3615,7 +3618,7 @@ ref _binaryBinders[(int)operation],
36153618
Interlocked.CompareExchange(ref _deleteIndexBinders, new PythonDeleteIndexBinder[argCount + 1], null);
36163619
}
36173620

3618-
lock (this) {
3621+
lock (_indexBindersLock) {
36193622
if (_deleteIndexBinders.Length <= argCount) {
36203623
Array.Resize(ref _deleteIndexBinders, argCount + 1);
36213624
}

0 commit comments

Comments
 (0)