вторник, 22 ноября 2011 г.

C++ библиотека-плагин для Unix. Часть 2-я. OpenVMS.

Openvms назвать unix-ом скорее всего нельзя. Ну хотя, там за последние 20 лет появились какие то зачатки posix-образности, даже есть GNV (эта так у них GNU называется). Командный процессор (DCL) там тоже не подарок. Хотя, дело привычки.
Итак, о чем это я?!
Как то раз, подкинули мне задачку портировать одну замечательную библиотечку с unix на openvms. Библиотечка c++-ная, многопоточная, внешняя библиотека oracle, да еще к тому же сама
по OCI с соседним oracle работает. Про назначение ее  распространяться не буду.
Один разработчик эту библиотеку месяца три потихоньку на этот предмет до меня ковырял, и сказал мне, что жутко все там тормозит, почему-то. Хоть у нас и не ахти какая быстрая openvms машинка была (alfa какая то, уже не помню), но наши приложения с oracle там довольно таки шустро работали. К нам, в гости, даже по этому поводу приезжал из представительства HP сотрудник отдела openvms. Настроил нам как следует машинку. Библиотечка чуть по шустрее стала работать, но все равно как то не на много.
Как оказалось, все довольно просто. Раньше, в бытность VAX в VMS не слыхивали о нитях (появились только в последних релизах). По этой причине, видимо для совместимости, по умолчанию никаких нитей нет. Чтобы были нити - нужно при линковке указать линкеру специальный квалификатор /THREADS_ENABLE.
Все опции и квалификаторы - смотрим здесь.
Как уточнил @RRL, и я сам тоже начал вспоминать,

для компилера:

/reentrancy=multithread

для линкера:
/threads=(multiple_kernel_threads,upcalls)
И сразу же этой библиотеке полегчало. Правда об еще одном камне на дороге стоит упомянуть:
В openvms размер стека у нити не вмещает OCI-ную нить (которая там штатно, средствами OCI создается), так что пришлось реализовывать вручную для OCI мультинитевость на posix threads.



3 комментария:

  1. "представительства HP сотрудник отдела openvms" - нету такого.

    ОтветитьУдалить
  2. для компилера:

    /reentrancy=multithread

    для линкера:
    /threads=(multiple_kernel_threads,upcalls)

    ОтветитьУдалить
  3. Спасибо за уточнение, внес в статью

    ОтветитьУдалить