Repository navigation
Потокобезопасная загрузка библиотек #1768
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -42,8 +42,11 @@ private void CreateGlobalScopeIfNeeded() | |
|
|
||
| lock (_injectedProperties) | ||
| { | ||
| _scopeOfGlobalProperties ??= _symbols.PushContext(_injectedProperties); | ||
| _contexts.Add(_injectedProperties); | ||
| if (_scopeOfGlobalProperties == null) | ||
| { | ||
| _scopeOfGlobalProperties = _symbols.PushContext(_injectedProperties); | ||
| _contexts.Add(_injectedProperties); | ||
| } | ||
| } | ||
| } | ||
|
|
||
|
|
@@ -85,48 +88,62 @@ private void InjectPropertyInternal( | |
| throw new ArgumentException("Invalid identifier", nameof(alias)); | ||
| } | ||
| CreateGlobalScopeIfNeeded(); | ||
| var num = _injectedProperties.Insert(value, identifier, true, !readOnly); | ||
|
|
||
| var bslPropertyInfo = _injectedProperties.GetPropertyInfo(num); | ||
| IVariableSymbol registeredSymbol; | ||
| if (ownerPackage == null) | ||
| // Номер свойства в значениях и номер символа в области видимости должны совпасть: | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Мне непонятен этот комментарий. "Должны совпасть" - это что значит? мы их проверяем на совпадение, или мы тут сообщаем, что это некий assertion который негласно должен соблюдаться? Какой вывод должен сделать тот, кто будет читать комментарий? |
||
| // вставки из разных потоков (библиотека, внешняя компонента) идут по одной | ||
| lock (_injectedProperties) | ||
| { | ||
| registeredSymbol = new WrappedPropertySymbol(bslPropertyInfo) | ||
| var num = _injectedProperties.Insert(value, identifier, true, !readOnly); | ||
|
|
||
| var bslPropertyInfo = _injectedProperties.GetPropertyInfo(num); | ||
| IVariableSymbol registeredSymbol; | ||
| if (ownerPackage == null) | ||
| { | ||
| Name = identifier, | ||
| Alias = alias | ||
| }; | ||
| } | ||
| else | ||
| { | ||
| registeredSymbol = new WrappedLibraryPropertySymbol(bslPropertyInfo, ownerPackage) | ||
| registeredSymbol = new WrappedPropertySymbol(bslPropertyInfo) | ||
| { | ||
| Name = identifier, | ||
| Alias = alias | ||
| }; | ||
| } | ||
| else | ||
| { | ||
| Name = identifier, | ||
| Alias = alias | ||
| }; | ||
| registeredSymbol = new WrappedLibraryPropertySymbol(bslPropertyInfo, ownerPackage) | ||
| { | ||
| Name = identifier, | ||
| Alias = alias | ||
| }; | ||
| } | ||
|
|
||
| _scopeOfGlobalProperties.DefineVariable(registeredSymbol); | ||
| } | ||
|
|
||
| _scopeOfGlobalProperties.DefineVariable(registeredSymbol); | ||
| } | ||
|
|
||
| public void InjectGlobalProperty(IValue value, BslPropertyInfo definition) | ||
| { | ||
| CreateGlobalScopeIfNeeded(); | ||
| _injectedProperties.Insert(value, definition); | ||
|
|
||
| var symbol = new WrappedPropertySymbol(definition) | ||
| lock (_injectedProperties) | ||
| { | ||
| Name = definition.Name, | ||
| Alias = definition.Alias | ||
| }; | ||
| _injectedProperties.Insert(value, definition); | ||
|
|
||
| var symbol = new WrappedPropertySymbol(definition) | ||
| { | ||
| Name = definition.Name, | ||
| Alias = definition.Alias | ||
| }; | ||
|
|
||
| _scopeOfGlobalProperties.DefineVariable(symbol); | ||
| _scopeOfGlobalProperties.DefineVariable(symbol); | ||
| } | ||
| } | ||
|
|
||
| private void RegisterObject(IAttachableContext context) | ||
| { | ||
| _symbols.PushContext(context); | ||
| _contexts.Add(context); | ||
| // Номер области видимости и номер контекста должны совпасть | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. То же самое. "Должны совпасть" это после чего совпасть? Может это неверный перевод и имеется в виду "должны совпаДАТЬ"? |
||
| lock (_injectedProperties) | ||
| { | ||
| _symbols.PushContext(context); | ||
| _contexts.Add(context); | ||
| } | ||
| } | ||
|
|
||
| public void SetGlobalProperty(string propertyName, IValue value) | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| Функция Привет() Экспорт | ||
| Возврат "Привет"; | ||
| КонецФункции |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| Процедура ПриЗагрузкеБиблиотеки(Знач Путь, СтандартнаяОбработка, Отказ) | ||
|
|
||
| // Загрузка долгая: пока она идет, библиотеку запрашивают из других потоков | ||
| Приостановить(300); | ||
| СтандартнаяОбработка = Ложь; | ||
| ДобавитьМодуль(ОбъединитьПути(Путь, "module.os"), "МедленныйМодуль"); | ||
|
|
||
| КонецПроцедуры |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Непонятно, в чем разница между было и стало?