[00:12:08] <cthulchu> ребят, никто не пишет софт под многопроцессорность
[00:12:10] <cthulchu> ?
[00:12:11] <тихий бот> тварь я дрожащая, или тот, кому надо?
[00:14:59] <cthulchu> и, сразу, еще один вопрос - вы GPS юзаете?
[00:23:49] <cthulchu> я подключил Ada.Synchronous_Task_Control и написал софтину, используя ее метод соблюдения атомарности при параллельном программировании. там, если помните, система заключается в том, что каждый поток имеет интерфейс ввода и вывода,
[00:23:51] <cthulchu> программируя которые можно оптимально распределить нагрузку на ядра
[00:23:56] <cthulchu> так вот... ексепшны...
[00:30:13] <cthulchu> ребят, нужна помощь, никого нету?
[00:59:16] <cthulchu> арррр...
[10:03:49] <landgraf> что-то тут совсем тихо без меня )
[10:06:18] <landgraf> http://fpaste.org/KJO7/ когда возникает эксепшен можно как-нибудь вернуться в задачу?
[10:06:40] <landgraf> или надо создавать задачу, которая будет в цикле запускать задачу? :)))
[10:07:58] <subj_rs> лучше внутри цикла сделать блок и в нем обрабатывать эксепшн
[10:08:29] <landgraf> кстати да...
[10:56:16] <StarGate> [notice] bridge "#ada@irc.tpu.ru <-> ada-ru@conference.jabber.ru" is running in limited mode
[10:57:06] <vgodunko> cthulchu: так что там с исключениями?
[12:14:17] <landgraf> помогите сделать thread pool executors :(
[12:15:04] <landgraf> пример из супер-книги мозг взрывает
[12:58:54] <vgodunko> :-)
[12:58:56] <тихий бот> vgodunko, ;-)
[13:09:35] <landgraf>    task body Worker is separate;
[13:09:42] <landgraf> это как? где его искать будет?
[13:22:53] <subj_rs> тело задачи нужно будет в отдельный файл вытащить
[13:23:04] <subj_rs> http://ada-ru.org/V-0.4w/part_1/ch_06.html#s6.1.5
[13:27:56] <landgraf> great
[14:35:44] <landgraf> на entry в задаче как баръер поставить?
[14:36:48] <subj_rs> а разве можно?
[14:38:03] <vgodunko> accept X when <expression>
[14:38:12] <landgraf> хм
[14:38:13] <Жаба> landgraf, и не говори
[14:39:42] <landgraf>                accept Put(T : Any_Avirtda_DD_Task) when Current_Task /= Null => do
                   put_Line("FUCK Worker!!" & T.Name);
                   Current_Task := T;
               end Put
[14:39:45] <landgraf> так не работает
[14:40:18] <subj_rs> просто do а не => do ?
[14:40:53] <landgraf> avirtda_dd_executors.adb:21:52: missing ";"
[14:41:44] <yeo> select when Current_Task /= Null => accept Put(T : Any_Avirtda_DD_Task)  do Kill_Them_All; end Put; end select
[14:42:09] <landgraf> select я знаю )
[14:42:30] <landgraf> с селектом работает
[14:43:21] <landgraf> yeo, если я сделаю select с одним вариантом - что будет делать задача в отсутствии вызова рандеву? спать?
[14:43:27] <landgraf> или процессор жрать?
[14:43:49] <vgodunko> Жрать два процессора.
[14:44:00] <vgodunko> Один жрать не будет
[14:44:03] <landgraf> O_O
[14:44:03] <Жаба> landgraf, не смотри на меня так!
[14:44:22] <landgraf> издеваетесь?
[14:44:47] <subj_rs>
select
   Server_Task.Service_1 [ параметры для Service_1 ] ;
or
   delay 5.0;
   Put_Line ("Server_Task has been busy for 5 seconds!");
end select;
[14:44:49] <vgodunko> Ну естественно :-)
[14:45:32] <landgraf> subj_rs, я знаю про delay, если юзать delay вопрос из каких соображений выбирать этот самый delay
[14:45:49] <vgodunko> Из соображения его необходимости.
[14:46:05] <landgraf> а если он не нужен?
[14:46:08] <vgodunko> Если в select-е только один accept, то возможно два пути
[14:46:14] <landgraf> во
[14:46:18] <landgraf> давайте пути
[14:46:22] <vgodunko> (1) будет ждать рандеву на accept-е
[14:46:32] <landgraf> вот мне этот нужен )
[14:46:35] <landgraf> пусть ждет
[14:46:46] <landgraf> а второй?
[14:46:51] <vgodunko> (2) возбудит Program_Error если accept закрыт
[14:49:07] <landgraf> Exception name: PROGRAM_ERROR
Message: Entry call not a delay mode
[14:49:10] <landgraf> второй путь :(
[14:49:51] <vgodunko> Кстати, код выше это ATC
[14:50:01] <vgodunko> Asynchronous Transfer of Control
[14:50:07] <landgraf> угу
[14:52:43] <subj_rs> селект в цикл и гоняй с задержкой delay 0.0 . нагрузки на проц не будет
[14:58:33] <vgodunko> Это почему не будет?
[14:59:09] <subj_rs> проверенно )
[15:01:28] <subj_rs> ну ладно, 0.001 )
[15:04:59] <subj_rs> но лучше через таймаут, delay произвольный, хоть бесконечный
[15:05:17] <subj_rs> vgodunko: кстати как сделать бесконечный delay?
[15:06:36] <vgodunko> Никак, зачем такой нужен?
[15:07:07] <gour> чтобы он делал ничего до тех пор, пока его не прервут зачем-то
[15:07:07] <subj_rs> ну для конструкции select .. or delay
[15:07:34] <vgodunko> Не писать or delay
[15:20:37] <landgraf> тогда programm_error же
[15:21:00] <vgodunko> А реальный код можно?
[15:21:17] <StarGate> [notice] bridge "#ada@irc.tpu.ru <-> ada-ru@conference.jabber.ru" is running in limited mode
[15:46:24] <vgodunko> landgraf: даёшь код где Program_Error вылазит!!!
[15:48:10] <landgraf> теперь не хочет вылазить
[15:48:13] <landgraf> испугался наверное
[15:48:50] <vgodunko> :-) Думаю проще - теперь правильно написано.
[15:49:10] <landgraf> нет
[15:49:11] <Жаба> landgraf, нет да!
[15:49:16] <landgraf> Exception name: PROGRAM_ERROR
Message: Entry call not a delay mode
[15:49:31] <landgraf>                select
                   when Current_Task = Null =>
                   accept Put(T : Any_Avirtda_DD_Task) do
                       put_Line("FUCK Worker!!" & Workers_IDs.Value'Img);
                       Current_Task := T;
                   end Put;
                   -- or
                   --     delay 1.0;
               end select;
[15:50:10] <landgraf> за отладочные сообщения
[15:50:13] <landgraf> сорри )
[15:51:22] <vgodunko> Вот, отлично.
[15:51:35] <vgodunko> Это говорит о том, что код написан совершенно некорректно.
[15:51:55] <landgraf> ну так я и пытаюсь узнать как корректно :)
[15:51:57] <landgraf> уже часа два как
[15:52:18] <vgodunko> Получается, что Current_Task /= null и все входы закрыты, т.е. deadlock в чистом виде
[15:52:40] <vgodunko> (сообщение конечно прикольное, ничего не скажешь)
[15:53:09] <vgodunko> Скорее всего это некая ошибка проектирования общей архитектуры.
[15:53:40] <landgraf> да я все с пулом executor-ов борюсь
[15:53:45] <landgraf> с delay все работает как надо
[15:53:56] <landgraf> вопрос лишь в том, насколько это эффективно
[15:54:15] <landgraf> чтобы мои 10 тредов не жрали процессор на пустом месте
[15:54:47] <vgodunko> Если программа написана "правильно", таких delay-ев быть не должно.
[15:55:07] <landgraf> вот, и я о том же, а subj_rs говорит надо большии ставить ))
[15:55:54] <vgodunko> Если я понимаю правильно, то идея в том, что бы заставить задачу выполнить код Execute-а некоторой Current_Task?
[15:56:52] <vgodunko> Кто может поменять значение Current_Task? Один случай я вижу, когда пришёл внешний запрос.
[15:56:54] <landgraf> vgodunko, глобальная? сделать некий "черный ящик" в который можно закидывать Any_Avirtda_DD_Task на выполнение
[15:57:28] <vgodunko> Можно код целиком?
[15:57:31] <landgraf> vgodunko, может поменять вложенная задача, которая и выполняет
[15:57:36] <landgraf> vgodunko, стыдно ))
[15:57:50] <vgodunko> кому видно - тому стыдно
[15:58:57] <landgraf> vgodunko, https://github.com/landgraf/avirtda/blob/unstable/src/DD/avirtda_dd_executors.adb
[15:59:01] <vgodunko> Пойду пообедать и потом помогу
[15:59:45] <landgraf> приятного
[16:07:26] <genieprox> домой уже скоро пора идти, а не обедать ))
[16:07:43] <subj_rs> дада
[16:07:50] <subj_rs> еще часок
[16:08:16] <yeo> а кое-кто только на работу явился :(
[16:13:52] <landgraf> надо, наверное сделать 10 независимых тасков которые будут лазить в FIFO за задачей, и одну таску, которая будет как-то следить за остальными...
[16:20:12] <vgodunko> Можно сделать массив из задач, которые будут лазить в защищённый объект и извлекать из него очередное задание
[16:20:36] <landgraf> вот я так и сделал изначально!
[16:20:52] <landgraf> пришел наш местный Java-C++ кодер и обкакал идею
[16:20:57] <landgraf> сказал писать менеджера
[16:28:38] <subj_rs> если таски однотипны - однозначно массив
[16:29:09] <landgraf> так и сейчас массив
[16:29:16] <subj_rs> и защищенный объект как раз для этого. пошли этого кодера подальше
[16:29:33] <vgodunko> Менеджера чего?
[16:29:49] <vgodunko> Нет, манагера кого?
[16:30:44] <vgodunko> Я могу понять смысл дополнительных компонентов если нужно управлять количеством задач в пуле с использованием некоторых эвристик.
[16:31:03] <vgodunko> Но эти компоненты никогда задачамы не делаются, это просто не требуется.
[16:32:24] <vgodunko> На эту тему есть замечательная книга. http://bookinist.net/books/bookid-36798.html
[16:32:48] <vgodunko> Скачиваем, печатаем и даёт Java/C++ кодерам просвящаться.
[16:33:24] <vgodunko> На Java/C/C++ не встроенной абстракции задачи, поэтому им необходимо изгаляться не по детски.
[16:33:25] <landgraf> сначала надо самим просвятиться
[16:33:51] <vgodunko> Это не требуется, Java/C++ кодеры генетически не совместимы с подобной литературой.
[16:38:48] <landgraf> vgodunko, https://github.com/landgraf/avirtda/blob/executor/src/DD/avirtda_dd_executors.adb прост как сибирский валенок? :)
[16:39:26] <landgraf> ща еще веником пройдусь
[16:39:38] <vgodunko> Worker не должен содержать delay
[16:39:42] <vgodunko> Это ему не требуется
[16:40:19] <landgraf> он будет постоянно "дергать" Map?
[16:40:26] <landgraf> это не "дорогО"?
[16:40:32] <vgodunko> Если Task_Queue.Get_Task превратить во вход и поставить надлежащее условие.
[16:40:40] <landgraf> ааа
[16:40:43] <landgraf> точно!
[16:40:47] <landgraf> ада божественна!
[16:40:51] <landgraf> vgodunko, спасибо
[16:41:17] <vgodunko> entry Get_Task when not Map.Is_Empty is ...
[16:41:50] <vgodunko> Книгу всё же настоятельно рекомендую проглядеть, а лучше - понять.
[16:42:18] <gour> /me скачал.
[16:42:28] <vgodunko> Не скажу, что полностью разделяю идею такого подхода к проектированию, но она качественно "вставляет" мозг на сторону света.
[16:43:04] <vgodunko> А свет в нашем адском царстве - вещь очень редкая.
[16:46:11] <landgraf> куда-то первая задача стала теряться :)
[16:47:09] <vgodunko> Первая это которая?
[16:47:31] <landgraf> которая первая кладется в Map
[16:47:36] <landgraf> она не выполняется...
[16:47:40] <landgraf> или...
[16:47:46] <landgraf> или одна там остается
[16:47:48] <landgraf> ща проверю
[16:48:50] <vgodunko> Да, ещё имеет смысл писать:
Task_Queue.Get_Task (T);
begin
  T.Execute;
exception
  when others =>
     Report_Exception;
end;
[16:49:03] <landgraf> vgodunko, да, первая задача "теряется"
[16:49:14] <landgraf> которая первая ложится в Map
[16:49:24] <vgodunko> Значит где-то ошибка зарыта.
[16:49:34] <vgodunko> Может теряется 1,3,5,...?
[16:51:25] <landgraf> нет, нашел ошибку
[16:51:30] <landgraf> status остался
[16:51:54] <vgodunko> protected должен содержать private часть и там должен быть объявлен Queue.
[16:52:16] <landgraf> да, уже делаю )
[16:52:35] <landgraf> (сам додумался) :)
[16:52:52] <vgodunko> Вот и всё, теперь должно работать как часы.
[16:54:56] <landgraf> ну и Put_Task переписать для protected  с учетом приватности queue
[16:56:22] <vgodunko> Это естественно так
[16:56:42] <landgraf> работает
[16:56:47] <landgraf> отлично работает
[16:56:49] <vgodunko> Ещё мне не понятно зачем нужно использовать Ada.Task_Attributes
[16:56:53] <landgraf> vgodunko, спасибо
[16:57:06] <landgraf> vgodunko, это я хотел прикрутить к "менеджеру"
[16:57:20] <landgraf> чтобы убивать таски в аварийных ситуациях
[16:57:40] <landgraf> каждой таске из пула назначать Id = Id задачи
[16:57:43] <vgodunko> Мониторинг и убивание это отдельная песня.
[16:58:04] <vgodunko> Сначала нужно понять что мониторить и зачто убивать.
[16:58:22] <landgraf> vgodunko, убивать исключительно по команде "извне"
[16:58:40] <landgraf> то есть по приходу специальной убивающей команды ))
[17:25:18] <StarGate> [notice] bridge "#ada@irc.tpu.ru <-> ada-ru@conference.jabber.ru" is running in limited mode
[18:06:56] <landgraf> actual for "X" must be a variable
[18:06:58] <landgraf> :(
[18:07:28] <nordwind> вечер
[18:07:42] <yeo> угу
[18:11:43] <landgraf> как сделать Ada.Unchecked_Deallocation для 'Class? или надо для каждого подкласса переопределять?
[18:16:39] <yeo> procedure Free is new Ada.Unchecked_Deallocation (X'Class, X_Class_Access);
[18:20:17] <landgraf> actual for "X" must be a variable  
[18:20:47] <landgraf> это вот из той оперы
[18:24:39] <vgodunko> Это плата за безопасность. X : X_Class_Access должна быть переменной, поскольку для безопасности ей будет присвоено значение null
[18:25:47] <landgraf> что значит должна быть переменной? (не записью или как
[18:25:51] <landgraf> ?
[18:25:52] <тихий бот> тварь я дрожащая, или тот, кому надо?
[18:27:58] <landgraf> или не абстрактным (как у меня)
[18:29:35] <landgraf> а Controlled мне поможет тут?
[18:35:03] <vgodunko> Ничто не поможет, объект должен быть переменной, а не константой как в коде у Вас.
[18:35:10] <yeo> переменной = lval если говорть ня языке С-шников
[18:35:42] <vgodunko> yeo: не матерись
[18:36:04] <yeo> :(
[18:36:23] <landgraf> константой? О_О
[18:36:58] <yeo> тем, у чего можно поменять значение
[18:37:34] <yeo> нельзя сделать Free (1)
[18:37:56] <landgraf> ну это понятно, а почему Avirtda_DD_Task константа?
[18:38:11] <landgraf> аа кажется понимаю...
[18:38:17] <yeo> я как оно объявлено?
[18:41:08] <landgraf> This : __IN__ Access
[18:41:12] <landgraf> вот так у меня было )
[18:54:18] <landgraf> aunit привинтить чтоли к avirtd-е
[22:08:08] <vgodunko> landgraf: я могу делать анонс Матрёшки в мировых кругах?
[22:08:36] <StarGate> [notice] bridge "#ada@irc.tpu.ru <-> ada-ru@conference.jabber.ru" is running in limited mode
[23:01:44] <landgraf> vgodunko, да, естественно. сейчас займусь патчингом