Ada_Ru форум

Обсуждение языка Ада

проблема с Distributed Annex

Оставить новое сообщение

Сообщения

Yury Korolyov
проблема с Distributed Annex
2003-02-20 06:51:59

Здравствуйте,

Столкнулся с проблемой

1. В спецификации пакета с pragma Remote_Types, хочется описать тип с родительским типом Limited_Controlled,

но т.к. Ada.Finalization это не Pure и не Remote_Types - компилятор такую спецификацию кушать отказывается

2. В спецификации другого пакета с pragma Remote_Types есть необходимость использовать несколько типов из GNAT.Sockets, но, опять же, GNAT.Sockets не категоризирован и я получаю такую же ошибку.

Если кто-то сталкивался с такой проблемой, подскажите пожалуйста как с этим бороться... Я использую GNAT 3.14p под Debian GNU/Linux

 

Заранее благодарен.

--

С уважением,

Юрий Королев

 

P.S. Рекомендации, где почитать про Distributed Annex кроме документации к GLADE, Ada Rationale и RM тоже очень помогут.

Yury Korolyov wrote:

Здравствуйте,

Столкнулся с проблемой

1. В спецификации пакета с pragma Remote_Types, хочется описать тип с

родительским типом Limited_Controlled,

но т.к. Ada.Finalization это не Pure и не Remote_Types - компилятор такую

спецификацию кушать отказывается

2. В спецификации другого пакета с pragma Remote_Types есть необходимость

использовать несколько типов из GNAT.Sockets, но, опять же, GNAT.Sockets не

категоризирован и я получаю такую же ошибку.

Если кто-то сталкивался с такой проблемой, подскажите пожалуйста как с этим

бороться... Я использую GNAT 3.14p под Debian GNU/Linux

 

Ага! У меня нашлись братья по разуму! Это радует!

 

По первому вопросу есть три доклада. Один хороший - один плохой - один совсем плохой.

 

Хороший. Отсутствие катерогии Remote_Types у Ada.Finalization было замечено и в RM95/TC1 указанный пакет категоризировали нужным образом.

 

Плохой. Пока нет реализаций Ada, поддерживающих данную рацуху.

 

Совсем плохой. Из вышесказанного следует, что придется обходить сложность. На самом деле изобретение обходного пути дело сложное. Лично у меня ничего разумного не получилось и я решил указанную проблему с помощью ..... хитрой программы на ASIS. Будет интересно - расскажу.

 

По поводу GNAT.Sockets рекомендую ещё раз просмотреть спецификации пакетов. Сокет по своей природе дело более чем локальное (в Linux например по сей день существуют проблемы использования одного и того же сокета разными нитями одного процесса) и любое его использование внутри спецификаций модулей категории Remote_Types может сбить с толку.

 

Сразу замечу, что модули Remote_Types не накладывают ограничений на используемые реализацией (телом) модули.

 

 

P.S. Рекомендации, где почитать про Distributed Annex кроме документации к

GLADE, Ada Rationale и RM тоже очень помогут.

 

Самому было-бы интересно. Могу разве-что предложить обсудить возникшие у Вас проблемы.

 

-- Vadim Godunko

Project Manager

Automated Control Systems Department

North-Caucasian Area Air Traffic Control Center

Спасибо за Ваш ответ.

 

 

Совсем плохой. Из вышесказанного следует, что придется обходить

сложность. На самом деле изобретение обходного пути дело сложное. Лично у меня ничего разумного не получилось и я решил указанную проблему с помощью ..... хитрой программы на ASIS. Будет интересно - расскажу.

 

Расскажите, конечно, очень интересно.

 

 

По поводу GNAT.Sockets рекомендую ещё раз просмотреть спецификации пакетов. Сокет по своей природе дело более чем локальное (в Linux например по сей день существуют проблемы использования одного и того же сокета разными нитями одного процесса) и любое его использование внутри спецификаций модулей категории Remote_Types может сбить с толку.

Согласен, наверное стоит пересмотреть спецификацию.

 

--

С уважением,

Юрий Королев

Yury Korolyov wrote:

 

Совсем плохой. Из вышесказанного следует, что придется обходить

сложность. На самом деле изобретение обходного пути дело сложное. Лично

у меня ничего разумного не получилось и я решил указанную проблему с

помощью ..... хитрой программы на ASIS. Будет интересно - расскажу.

 

Расскажите, конечно, очень интересно.

 

Идея достаточно проста: "Если гора не идет к Магомету, значит Магомет идет к горе."

 

Для начала желательно разделить описания типов данных и процедур, их использующих. Это не сложно сделать, поскольку обычно одни попадают под Remote_Types, а другие под Remote_Call_Interface.

 

Конечно, использовать Remote_Types не удается. Поэтому придется самостоятельно следить (или писать соответствующую ASIS программу) за тем, чтобы каждый тип у "будущего" Remote_Types модуля имел атрибуты Write и Read, а при необходимости и Input, Output.

 

Будущие модули Remote_Call_Interface не нуждаются в какой-либо особой доработке.

 

После подобной подготовки программным способом создаются необходимые для DSA пакеты. Их оказывается четыре:

 

1. Пакет категории Remote_Types. В них каждый тип из исходного пакета заменяется на подтип от Stream_Element_Array.

 

2. Пакет "маршаллинга/демаршаллинга". Здесь на каждый тип заводится две подпрограммы. Одна преобразует исходный объект в его "потоковое" представление, а другая производит обратное преобразование. Этот пакет имеет общую категорию.

 

3. Пакет "серверного" интерфейса. Это пакет категории Remote_Call_Interface. Он содержит все подпрограммы исходного модуля, в профайлах и возвращаемых значениях которых исходные типы заменены на эквивалентные "потоковые" представления. Его реализация разворачивает потоковое представление в исходные типы и вызывает необходимые подпрограммы исходного пакета.

 

4. И, наконец, пакет "клиентского" интерфейса. Это точная копия исходного пакета, но реализация заворачивает каждый параметр в потоковое представление и вызывает подпрограммы "серверного" интерфейса. Этот пакет имеет общую категорию.

 

Не могу сказать, что это хорошее решение и оно лишено недостатков, но по крайней мере проверенно и работает.

 

Могу поделиться и программой преобразования.

 

На мой взгляд, идея очень интересная. Я еще не до конца прикинул как это будет смотреться на моей задаче, было бы интересно взглянуть на программу преобразования и, если можно, какой-нибудь минимальный примерчик. Еще раз thanks a lot, думаю мне это очень пригодится.

 

--

С уважением,

Юрий Королев

Yury Korolyov wrote:

На мой взгляд, идея очень интересная. Я еще не до конца прикинул как это

будет смотреться на моей задаче, было бы интересно взглянуть на программу

преобразования и, если можно, какой-нибудь минимальный примерчик.

Еще раз thanks a lot, думаю мне это очень пригодится.

 

Не более, чем заплатка размером в слона на дырку размером в муху.

 

Программку и примерчики уже вечером - пора убегать на занятия. Уж извините.

Vadim Godunko wrote:

Yury Korolyov wrote:

 

На мой взгляд, идея очень интересная. Я еще не до конца прикинул как это

будет смотреться на моей задаче, было бы интересно взглянуть на программу

преобразования и, если можно, какой-нибудь минимальный примерчик.

Еще раз thanks a lot, думаю мне это очень пригодится.

 

 

Прицепил.

 

Файл gen_si_ci_i_t.adb - программа генерации заплатки.

types.ads, calls.ad[sb] - определяется производный от Finalization.Controlled тип и подпрограмму, использующую этот тип для аргумента.

calls.def - маленькая "хитрость". Дабы не генерировать ненужные подпрограммы, все необходимые для "экспорта" подпрограммы перечисляются здесь.

memory_streams.ad[sb] - файл поддержки. Нужен для сборки конечной программы.

 

При вызове программы указывается имя модуля, по которому генерируется Remote_Call_Interface. Кроме этого, распознаются ключи -I<путь> - где искать исходники, -O<путь> - куда записывать сгенерированные файлы, -D<имя файла> - файл с перечислением подлежащих генерации подпрограмм. В общем виде где-то так:

 

gen_si_ci_i_t [-I<путь> ...] [-O<путь>] [-D<имя файла>] <имя модуля>

 

В результате применения к примеру (gen_si_ci_i_t Сalls) получатся модули:

 

types_i.ad[sb] - маршаллинг

types_t.ads - представление в виде массива элементов потока

calls_si.ad[sb] - серверная часть

calls_ci.ad[sb] - клиентская часть

 

Вот вкратце и всё. Будут вопросы - пишите.

Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти