Skip to content

Commit eaed0a4

Browse files
committed
Инициализация функциональных интерфейсов сделана потокобезопасной
1 parent a745eeb commit eaed0a4

File tree

3 files changed

+107
-55
lines changed

3 files changed

+107
-55
lines changed

packagedef

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
Описание.Имя("lambdas")
2-
.Версия("0.3.2")
2+
.Версия("0.3.3")
33
.Автор("Кирилл Черненко")
44
.АдресАвтора("https://github.com/sfaqer")
55
.Описание("API для реализации функциональных интерфейсов для OneScript")

src/Модули/ФункциональныеИнтерфейсы.os

Lines changed: 25 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,18 @@
88
Перем Запускаемый; // Кеш интерфейса Запускаемый
99
Перем УниПроцедура; // Кеш интерфейса УниПроцедура
1010
Перем БиПроцедура; // Кеш интерфейса БиПроцедура
11-
Перем ТриПроцедура; // Кеш интерфейса ТриПроцедура
11+
Перем ТриПроцедура; // Кеш интерфейса ТриПроцедура
12+
13+
Перем БлокировкаРесурса; // Мьютекс для синхронизации
1214

1315
// Возвращает интерфейс объекта содержащий функцию без параметров
1416
//
1517
// Возвращаемое значение:
1618
// ИнтерфейсОбъекта - Искомый интерфейс
1719
//
1820
Функция Вызываемый() Экспорт
19-
20-
Если Не ЗначениеЗаполнено(Вызываемый) Тогда
21-
Вызываемый = Новый ИнтерфейсОбъекта();
22-
Вызываемый.ИзОбъекта(Тип("Вызываемый"));
23-
КонецЕсли;
24-
21+
Вызываемый = ИнициализироватьИнтерфейс(Вызываемый, Тип("Вызываемый"));
2522
Возврат Вызываемый;
26-
2723
КонецФункции
2824

2925
// Возвращает интерфейс объекта содержащий функцию с одним параметром
@@ -32,14 +28,8 @@
3228
// ИнтерфейсОбъекта - Искомый интерфейс
3329
//
3430
Функция УниФункция() Экспорт
35-
36-
Если Не ЗначениеЗаполнено(УниФункция) Тогда
37-
УниФункция = Новый ИнтерфейсОбъекта();
38-
УниФункция.ИзОбъекта(Тип("УниФункция"));
39-
КонецЕсли;
40-
31+
УниФункция = ИнициализироватьИнтерфейс(УниФункция, Тип("УниФункция"));
4132
Возврат УниФункция;
42-
4333
КонецФункции
4434

4535
// Возвращает интерфейс объекта содержащий функцию с двумя параметрами
@@ -48,14 +38,8 @@
4838
// ИнтерфейсОбъекта - Искомый интерфейс
4939
//
5040
Функция БиФункция() Экспорт
51-
52-
Если Не ЗначениеЗаполнено(БиФункция) Тогда
53-
БиФункция = Новый ИнтерфейсОбъекта();
54-
БиФункция.ИзОбъекта(Тип("БиФункция"));
55-
КонецЕсли;
56-
41+
БиФункция = ИнициализироватьИнтерфейс(БиФункция, Тип("БиФункция"));
5742
Возврат БиФункция;
58-
5943
КонецФункции
6044

6145
// Возвращает интерфейс объекта содержащий функцию с тремя параметрами
@@ -64,14 +48,8 @@
6448
// ИнтерфейсОбъекта - Искомый интерфейс
6549
//
6650
Функция ТриФункция() Экспорт
67-
68-
Если Не ЗначениеЗаполнено(ТриФункция) Тогда
69-
ТриФункция = Новый ИнтерфейсОбъекта();
70-
ТриФункция.ИзОбъекта(Тип("ТриФункция"));
71-
КонецЕсли;
72-
51+
ТриФункция = ИнициализироватьИнтерфейс(ТриФункция, Тип("ТриФункция"));
7352
Возврат ТриФункция;
74-
7553
КонецФункции
7654

7755
// Возвращает интерфейс объекта содержащий процедуру без параметров
@@ -80,14 +58,8 @@
8058
// ИнтерфейсОбъекта - Искомый интерфейс
8159
//
8260
Функция Запускаемый() Экспорт
83-
84-
Если Не ЗначениеЗаполнено(Запускаемый) Тогда
85-
Запускаемый = Новый ИнтерфейсОбъекта();
86-
Запускаемый.ИзОбъекта(Тип("Запускаемый"));
87-
КонецЕсли;
88-
61+
Запускаемый = ИнициализироватьИнтерфейс(Запускаемый, Тип("Запускаемый"));
8962
Возврат Запускаемый;
90-
9163
КонецФункции
9264

9365
// Возвращает интерфейс объекта содержащий процедуру с одним параметром
@@ -96,14 +68,8 @@
9668
// ИнтерфейсОбъекта - Искомый интерфейс
9769
//
9870
Функция УниПроцедура() Экспорт
99-
100-
Если Не ЗначениеЗаполнено(УниПроцедура) Тогда
101-
УниПроцедура = Новый ИнтерфейсОбъекта();
102-
УниПроцедура.ИзОбъекта(Тип("УниПроцедура"));
103-
КонецЕсли;
104-
71+
УниПроцедура = ИнициализироватьИнтерфейс(УниПроцедура, Тип("УниПроцедура"));
10572
Возврат УниПроцедура;
106-
10773
КонецФункции
10874

10975
// Возвращает интерфейс объекта содержащий процедуру с двумя параметрами
@@ -112,14 +78,8 @@
11278
// ИнтерфейсОбъекта - Искомый интерфейс
11379
//
11480
Функция БиПроцедура() Экспорт
115-
116-
Если Не ЗначениеЗаполнено(БиПроцедура) Тогда
117-
БиПроцедура = Новый ИнтерфейсОбъекта();
118-
БиПроцедура.ИзОбъекта(Тип("БиПроцедура"));
119-
КонецЕсли;
120-
81+
БиПроцедура = ИнициализироватьИнтерфейс(БиПроцедура, Тип("БиПроцедура"));
12182
Возврат БиПроцедура;
122-
12383
КонецФункции
12484

12585
// Возвращает интерфейс объекта содержащий процедуру с тремя параметрами
@@ -128,12 +88,23 @@
12888
// ИнтерфейсОбъекта - Искомый интерфейс
12989
//
13090
Функция ТриПроцедура() Экспорт
91+
ТриПроцедура = ИнициализироватьИнтерфейс(ТриПроцедура, Тип("ТриПроцедура"));
92+
Возврат ТриПроцедура;
93+
КонецФункции
13194

132-
Если Не ЗначениеЗаполнено(ТриПроцедура) Тогда
133-
ТриПроцедура = Новый ИнтерфейсОбъекта();
134-
ТриПроцедура.ИзОбъекта(Тип("ТриПроцедура"));
95+
Функция ИнициализироватьИнтерфейс(Знач Интерфейс, Тип)
96+
97+
Если Не ЗначениеЗаполнено(Интерфейс) Тогда
98+
БлокировкаРесурса.Заблокировать();
99+
Если Не ЗначениеЗаполнено(Интерфейс) Тогда
100+
Интерфейс = Новый ИнтерфейсОбъекта();
101+
Интерфейс.ИзОбъекта(Тип);
102+
КонецЕсли;
103+
БлокировкаРесурса.Разблокировать();
135104
КонецЕсли;
136105

137-
Возврат ТриПроцедура;
106+
Возврат Интерфейс;
138107

139108
КонецФункции
109+
110+
БлокировкаРесурса = Новый БлокировкаРесурса();

tests/ФункциональныеИнтерфейсы.os

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,84 @@
7171
.Равно(ФункциональныеИнтерфейсы.ТриПроцедура());
7272

7373
КонецПроцедуры
74+
75+
&Тест
76+
Процедура ФункциональныеИнтерфейсыПотокобезопасны() Экспорт
77+
78+
// Дано
79+
Рефлектор = Новый Рефлектор();
80+
Рефлектор.УстановитьСвойство(ФункциональныеИнтерфейсы, "Вызываемый", Неопределено);
81+
82+
// Когда
83+
84+
Результаты = ВыполнитьВПятьсотПотоков(ЭтотОбъект, "ПроверитьИнтерфейс");
85+
86+
// Тогда
87+
88+
Для каждого Результат Из Результаты Цикл
89+
Ожидаем.Что(Результат)
90+
.ИмеетТип("Строка")
91+
.Равно("Вызвать");
92+
КонецЦикла;
93+
94+
КонецПроцедуры
95+
96+
Функция ПроверитьИнтерфейс() Экспорт
97+
98+
Возврат ФункциональныеИнтерфейсы.Вызываемый()
99+
.ПолучитьКартуИнтерфейса()
100+
[0]
101+
.Имя;
102+
103+
КонецФункции
104+
105+
Функция ВыполнитьВПятьсотПотоков(
106+
Сценарий,
107+
ИмяМетода,
108+
Параметр = Неопределено,
109+
ВторойПараметр = Неопределено,
110+
ТретийПараметр = Неопределено)
111+
112+
Параметры = Новый Массив;
113+
114+
Если Не Параметр = Неопределено Тогда
115+
Параметры.Добавить(Параметр);
116+
КонецЕсли;
117+
118+
Если Не ВторойПараметр = Неопределено Тогда
119+
Параметры.Добавить(ВторойПараметр);
120+
КонецЕсли;
121+
122+
Если Не ТретийПараметр = Неопределено Тогда
123+
Параметры.Добавить(ТретийПараметр);
124+
КонецЕсли;
125+
126+
Задания = Новый Массив();
127+
128+
Для Счетчик = 1 По 500 Цикл // BSLLS:UnusedLocalVariable-off
129+
130+
Задания.Добавить(
131+
ФоновыеЗадания.Выполнить(Сценарий, ИмяМетода, Параметры)
132+
);
133+
134+
КонецЦикла;
135+
136+
ФоновыеЗадания.ОжидатьВсе(Задания);
137+
138+
Для каждого ФоновоеЗадание Из Задания Цикл
139+
140+
Если ФоновоеЗадание.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда
141+
ВызватьИсключение ФоновоеЗадание.ИнформацияОбОшибке;
142+
КонецЕсли;
143+
144+
КонецЦикла;
145+
146+
Результаты = Новый Массив;
147+
148+
Для каждого ФоновоеЗадание Из Задания Цикл
149+
Результаты.Добавить(ФоновоеЗадание.Результат);
150+
КонецЦикла;
151+
152+
Возврат Результаты;
153+
154+
КонецФункции

0 commit comments

Comments
 (0)