Re[6]: C/C++ file/process/thread api l/w framework
От: Andrew S Россия http://alchemy-lab.com
Дата: 20.03.08 08:33
Оценка: 1 (1)
AS>>Ага, не знают. например, ожидание сокетных событий при помощи WFMO.

E>Это где? В ACE_WFMO_Reactor? Так там не только такой реактор есть.


Я не про то. Событие, созданное при помощи WSACreateEvent, ждут при помощи WFMO. Надо ли объяснять, что при наличии LSP, который подменяет эти функции на свои (т.е. хендл события будет не обычным евентом) вся эта конструкция отправляется в dev\null. Ждать надо при помощи WSAWaitForMultipleEvents и точка — а это, очевидно, отправляет всю реализаци WFMO реактора в топку. Не работает ACE, еще раз, не работает. Ну и игры с FD_SETSIZE, после которых перестает работать код, завязанный на стандартный размер — тоже интересно. И так — на каждом шагу.

E>Хотите асинхронности -- есть ACE_Proactor.


AS>>Вообще то я знаю От ТАО мы отказались (омни орб куда как производительнее), выбрали ICE, но с ICE идет довольно бедный фреймворк, поэтому приходится искать что-то еще.


E>У меня есть впечатление, что в начале топика вы не очень точно озвучили требования к необходимому вам фреймворку.


Возможно Просто на мой взгляд, базовые примитивы синхронизации — вещи вполне очевидные, и то, что многие библиотеки их просто не имеют, либо имеют весьма странные наборы — для меня довольно необычно.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[7]: C/C++ file/process/thread api l/w framework
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 20.03.08 08:37
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>>>Ага, не знают. например, ожидание сокетных событий при помощи WFMO.


E>>Это где? В ACE_WFMO_Reactor? Так там не только такой реактор есть.


AS>Я не про то. Событие, созданное при помощи WSACreateEvent, ждут при помощи WFMO. Надо ли объяснять, что при наличии LSP, который подменяет эти функции на свои (т.е. хендл события будет не обычным евентом) вся эта конструкция отправляется в dev\null. Ждать надо при помощи WSAWaitForMultipleEvents и точка — а это, очевидно, отправляет всю реализаци WFMO реактора в топку. Не работает ACE, еще раз, не работает. Ну и игры с FD_SETSIZE, после которых перестает работать код, завязанный на стандартный размер — тоже интересно. И так — на каждом шагу.


Не понял, что такое LSP. Не понял, что такое "код, завязанный на стандартный размер".

По поводу WSAWaitForMultipleEvents... Ведь реактор должен обрабатывать еще и таймерные события, и различные внешние воздействия типа register_handler, deregister_handler. В ACE_WFMO_Reactor, насколько я понимаю, обеспечивают это с помощью дополнительного pipe, хендл которого слушается в WaitForMultipleObjects.

E>>У меня есть впечатление, что в начале топика вы не очень точно озвучили требования к необходимому вам фреймворку.


AS>Возможно Просто на мой взгляд, базовые примитивы синхронизации — вещи вполне очевидные, и то, что многие библиотеки их просто не имеют, либо имеют весьма странные наборы — для меня довольно необычно.


Насколько я знаю, Interlocked-операции -- это очень непортабельная штука.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[8]: C/C++ file/process/thread api l/w framework
От: Andrew S Россия http://alchemy-lab.com
Дата: 20.03.08 18:00
Оценка: :)
AS>>Я не про то. Событие, созданное при помощи WSACreateEvent, ждут при помощи WFMO. Надо ли объяснять, что при наличии LSP, который подменяет эти функции на свои (т.е. хендл события будет не обычным евентом) вся эта конструкция отправляется в dev\null. Ждать надо при помощи WSAWaitForMultipleEvents и точка — а это, очевидно, отправляет всю реализаци WFMO реактора в топку. Не работает ACE, еще раз, не работает. Ну и игры с FD_SETSIZE, после которых перестает работать код, завязанный на стандартный размер — тоже интересно. И так — на каждом шагу.

E>Не понял, что такое LSP. Не понял, что такое "код, завязанный на стандартный размер".


LSP — см. MSDN. По второму — на стандартный размер пула FD_SET. Поэтому, например, баг может выскочить в зависимости от того, какой из заголовков (winsock или ace) включить первым. Ведь господа из ACE в процесс включили HANDLE_SET, который в себе держит массив размером ACE_FD_SETSIZE. На что, собственно, мы и нарвались.

E>По поводу WSAWaitForMultipleEvents... Ведь реактор должен обрабатывать еще и таймерные события, и различные внешние воздействия типа register_handler, deregister_handler. В ACE_WFMO_Reactor, насколько я понимаю, обеспечивают это с помощью дополнительного pipe, хендл которого слушается в WaitForMultipleObjects.


Это проблемы реактора, а не системы (а слушается там, насколько я помню, не пайп, а эвент. Если таки пайп, то первое — это работает только для определения подключения на именованый пайп, а второе — является недокументированной особенностью реализации, которая, кстати, вполне может исчезнуть или изменить свое поведение. Сверьтесь с MSDN — там пайпов нет в списке объектов ожидания). Еще раз — реализация в ACE некорректна, и точка. Реализовывать функциональность надо корректными средствами, а не абы как .

Кстати, свежий пример — реализация ACE_Process::terminate. Очень показательно, степерь маразма просто наивысшая. Имея живой хендл, вызывать при этом ACE_OS::kill(pid).

E>Насколько я знаю, Interlocked-операции -- это очень непортабельная штука.


Ну, авторы нескольких других библиотек имеют на этот счет отдельное мнение
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[5]: C/C++ file/process/thread api l/w framework
От: Andrew S Россия http://alchemy-lab.com
Дата: 20.03.08 18:14
Оценка:
AS>>>Остальное посмотрел, совсем не впечатлило. Может, еще какие есть либы?

E>>Есть еще PTypes. Можно еще глянуть GUI библиотеки вроде FOX Toolkit и Fltk, какие-то средства для синхронизации и многопоточности там должны быть.


E>>Остальные претенденты из списка Google.Directory либо платные (вроде Source Pro C++ от Rogue Wave), либо уже прекратили свое развитие.


E>>Но, по моим впечатлениям, реально сейчас развиваются только ACE, Poco, Boost, wxWidgets, Qt, Apr (это это чистый C).


E>Забыл еще добавить одну библиотеку, которая продолжает развиваться: STLSoft. Только вот не знаю, насколько она функциональна в плане поддержки процессов и IPC.


В плане процессов и IPC не очень, но сама либа довольно интересная. Спасибо.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[9]: C/C++ file/process/thread api l/w framework
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 20.03.08 18:58
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>>>Я не про то. Событие, созданное при помощи WSACreateEvent, ждут при помощи WFMO. Надо ли объяснять, что при наличии LSP, который подменяет эти функции на свои (т.е. хендл события будет не обычным евентом) вся эта конструкция отправляется в dev\null. Ждать надо при помощи WSAWaitForMultipleEvents и точка — а это, очевидно, отправляет всю реализаци WFMO реактора в топку. Не работает ACE, еще раз, не работает. Ну и игры с FD_SETSIZE, после которых перестает работать код, завязанный на стандартный размер — тоже интересно. И так — на каждом шагу.


E>>Не понял, что такое LSP. Не понял, что такое "код, завязанный на стандартный размер".


AS>LSP — см. MSDN.


А расшифровка у LSP есть?

AS>По второму — на стандартный размер пула FD_SET. Поэтому, например, баг может выскочить в зависимости от того, какой из заголовков (winsock или ace) включить первым. Ведь господа из ACE в процесс включили HANDLE_SET, который в себе держит массив размером ACE_FD_SETSIZE. На что, собственно, мы и нарвались.


Вы что, собираетесь писать переносимый код, который включает заголовочный файл winsock.h?

В первом томе "C++ Network Programming, Volume 1: Mastering Complexity with ACE and Patterns" есть глава "7.2 The ACE_Handle_Set Class", в которой описывается специальный класс ACE_Handle_Set, который разработчики ACE настоятельно рекомендуют использовать вместо fd_set. В частности:

To illustrate the latter point, let's revisit the function signature for the select() function:

int select (int width,               // Maximum handle plus 1
            fd_set *read_fds,        // Set of "read" handles
            fd_set *write_fds,       // Set of "write" handles
            fd_set *except_fds,      // Set of "exception" handles
            struct timeval *timeout);// Time to wait for events


The three fd_set arguments specify the handles to use when selecting for each event type. The timeout argument is used to specify a time limit to wait for events to occur. The particular details concerning these parameters vary in only minor ways across platforms. Due to the changing nature of I/O handles (and, thus, fd_set) across platforms, however, the meaning of the first argument (width) varies widely across operating systems:

* On UNIX, I/O handles start at the value 0 and increase to an OS-defined maximum limit. The meaning of the width parameter on UNIX is therefore "how far into the fd_set to scan for handles"; that is, it's defined as the highest numbered handle in any of the three fd_set parameters, plus 1.

* On Win32, socket handles are implemented as pointers rather than as low-numbered integers. The width argument to select() is therefore ignored completely. Instead, each fd_set contains its own handle count.

* On other platforms, where handles may be integers that don't start at 0, the definition may differ yet again.

The size-related values in an fd_set are also computed differently depending on the characteristics of the platform's representation and its select() semantics. Any applications written directly to native OS APIs must therefore adapt to all these subtle differences, and each project may end up redesigning and reimplementing code that manages the proper value to supply for width. Addressing these portability differences in each application is tedious and error prone, which is why ACE provides the ACE_Handle_Set class.


E>>По поводу WSAWaitForMultipleEvents... Ведь реактор должен обрабатывать еще и таймерные события, и различные внешние воздействия типа register_handler, deregister_handler. В ACE_WFMO_Reactor, насколько я понимаю, обеспечивают это с помощью дополнительного pipe, хендл которого слушается в WaitForMultipleObjects.


AS>Это проблемы реактора, а не системы (а слушается там, насколько я помню, не пайп, а эвент. Если таки пайп, то первое — это работает только для определения подключения на именованый пайп, а второе — является недокументированной особенностью реализации, которая, кстати, вполне может исчезнуть или изменить свое поведение. Сверьтесь с MSDN — там пайпов нет в списке объектов ожидания).


На счет pipe -- это я ошибся. Выдача нотификаций через специальный внутренний pipe -- это особенность реализации ACE_Select_Reactor. Она была описана во втором томе "C++ Network Programming, Volume 2: Systematic Reuse with ACE and Frameworks. Внутри ACE_WMFO_Reactor, судя по исходникам, используются event-ы.

AS> Еще раз — реализация в ACE некорректна, и точка. Реализовывать функциональность надо корректными средствами, а не абы как .


AS>Кстати, свежий пример — реализация ACE_Process::terminate. Очень показательно, степерь маразма просто наивысшая. Имея живой хендл, вызывать при этом ACE_OS::kill(pid).


А где вы это увидели? Я вот вижу в ACE 5.5.10 и ACE 5.6.3 вот такой код:
// Process.inl:
ACE_INLINE int
ACE_Process::terminate (void)
{
  if (this->getpid () != -1)
    return ACE::terminate_process (this->getpid ());
  else
    return -1;
}

где ACE::terminate_process реализуется как:
int
ACE::terminate_process (pid_t pid)
{
#if defined (ACE_HAS_PHARLAP)
  ACE_UNUSED_ARG (pid);
  ACE_NOTSUP_RETURN (-1);
#elif defined (ACE_WIN32)
  // Create a handle for the given process id.
  ACE_HANDLE process_handle =
    ::OpenProcess (PROCESS_TERMINATE,
                   FALSE, // New handle is not inheritable.
                   pid);

  if (process_handle == ACE_INVALID_HANDLE
      || process_handle == 0)
    return -1;
  else
    {
      // Kill the process associated with process_handle.
      BOOL terminate_result =
        ::TerminateProcess (process_handle, 0);
      // Free up the kernel resources.
      ACE_OS::close (process_handle);
      return terminate_result ? 0 : -1;
    }
#else
  return ACE_OS::kill (pid, 9);
#endif /* ACE_HAS_PHARLAP */
}

Жирным выделен фрагмент, работающий под Windows. На остальных системах процессы прибиваются при помощи kill.

E>>Насколько я знаю, Interlocked-операции -- это очень непортабельная штука.


AS>Ну, авторы нескольких других библиотек имеют на этот счет отдельное мнение


Каких, например?


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[10]: C/C++ file/process/thread api l/w framework
От: Andrew S Россия http://alchemy-lab.com
Дата: 20.03.08 19:33
Оценка:
E>>>Не понял, что такое LSP. Не понял, что такое "код, завязанный на стандартный размер".

AS>>LSP — см. MSDN.


E>А расшифровка у LSP есть?


AS>>По второму — на стандартный размер пула FD_SET. Поэтому, например, баг может выскочить в зависимости от того, какой из заголовков (winsock или ace) включить первым. Ведь господа из ACE в процесс включили HANDLE_SET, который в себе держит массив размером ACE_FD_SETSIZE. На что, собственно, мы и нарвались.


E>Вы что, собираетесь писать переносимый код, который включает заголовочный файл winsock.h?


Странно, что мне приходится это говорить именно вам, но эти файлы могут включаться неявно. Например, другим кроссплатформенным фреймворком. Хинт — попробуйте использовать ace и poco вместе

E>В первом томе "C++ Network Programming, Volume 1: Mastering Complexity with ACE and Patterns" есть глава "7.2 The ACE_Handle_Set Class", в которой описывается специальный класс ACE_Handle_Set, который разработчики ACE настоятельно рекомендуют использовать вместо fd_set. В частности:


<цитата скиппед> Это не в тему, правда. Просто подумайте, что FD_SETSIZE у вас может быть разный в зависимости от порядка включения заголовков, и что размер структур из-за этого может поехать (и в случае ACE_Handle_Set так оно и есть). Соответственно, конструкторы начинают делать фигню и т.п. — в общем, происходят ОЧЕНЬ_ПЛОХИЕ_ВЕЩИ.

E>На счет pipe -- это я ошибся. Выдача нотификаций через специальный внутренний pipe -- это особенность реализации ACE_Select_Reactor. Она была описана во втором томе "C++ Network Programming, Volume 2: Systematic Reuse with ACE and Frameworks. Внутри ACE_WMFO_Reactor, судя по исходникам, используются event-ы.


Ну то есть с некорректностью реализации реактора на WFMO вы согласны?

AS>> Еще раз — реализация в ACE некорректна, и точка. Реализовывать функциональность надо корректными средствами, а не абы как .


AS>>Кстати, свежий пример — реализация ACE_Process::terminate. Очень показательно, степерь маразма просто наивысшая. Имея живой хендл, вызывать при этом ACE_OS::kill(pid).


E>А где вы это увидели? Я вот вижу в ACE 5.5.10 и ACE 5.6.3 вот такой код:

E>
E>ACE::terminate_process (pid_t pid)
E>

E>Жирным выделен фрагмент, работающий под Windows. На остальных системах процессы прибиваются при помощи kill.

Ну, не так назвал функцию — без разницы. Нужное оставлено. У них есть хендл, убивают по pid, Разве это не идиотизм???

E>>>Насколько я знаю, Interlocked-операции -- это очень непортабельная штука.


AS>>Ну, авторы нескольких других библиотек имеют на этот счет отдельное мнение


E>Каких, например?


APR, STLSoft, qt... Этого хватит?
Вообщем, кроме poco, это есть почти во всех либах, что тут проскакивали. И если посмотреть исходники ace, сделать этот вариант было экстремально просто — добавить функцию exchange в их реализация атомарных переменных.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[11]: C/C++ file/process/thread api l/w framework
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 21.03.08 07:03
Оценка: :)
Здравствуйте, Andrew S, Вы писали:

E>>Вы что, собираетесь писать переносимый код, который включает заголовочный файл winsock.h?


AS>Странно, что мне приходится это говорить именно вам, но эти файлы могут включаться неявно. Например, другим кроссплатформенным фреймворком. Хинт — попробуйте использовать ace и poco вместе


ACE и Poco в одном исходнике? Ну еще тогда туда можно добавить собственное использование Windows-функций, а также смешать MFC и Qt.

E>>В первом томе "C++ Network Programming, Volume 1: Mastering Complexity with ACE and Patterns" есть глава "7.2 The ACE_Handle_Set Class", в которой описывается специальный класс ACE_Handle_Set, который разработчики ACE настоятельно рекомендуют использовать вместо fd_set. В частности:


AS><цитата скиппед> Это не в тему, правда.


В тему должно быть то, что если вы беретесь за кроссплатформенное программирование с использованием какого-то фреймворка, то нужно забыть про системно-зависимые низкоуровневые вещи. Используйте только ACE (Poco, Qt, APR) и у вас не будет проблем с FD_SETSIZE -- просто потому, что FD_SETSIZE вам уже не нужен.

AS>Просто подумайте, что FD_SETSIZE у вас может быть разный в зависимости от порядка включения заголовков, и что размер структур из-за этого может поехать (и в случае ACE_Handle_Set так оно и есть). Соответственно, конструкторы начинают делать фигню и т.п. — в общем, происходят ОЧЕНЬ_ПЛОХИЕ_ВЕЩИ.


Я вообще слабо представляю себе как такое может происходить. Разве что вы не подгружаете нужных заголовков в заголовочном файле со своими структурами, а делаете это только в своих cpp-файлах.

Кроме того, насколько я помню, ориентация на FD_SETSIZE -- вообще довольно опасная штука.

E>>На счет pipe -- это я ошибся. Выдача нотификаций через специальный внутренний pipe -- это особенность реализации ACE_Select_Reactor. Она была описана во втором томе "C++ Network Programming, Volume 2: Systematic Reuse with ACE and Frameworks. Внутри ACE_WMFO_Reactor, судя по исходникам, используются event-ы.


AS>Ну то есть с некорректностью реализации реактора на WFMO вы согласны?


Ну если бы вы подробно объяснили, в чем некорректность.
А то ведь ACE используется в сотнях проектов и жалоб на поведение WFMO я в списках багов ACE пока не видел.

AS>>>Кстати, свежий пример — реализация ACE_Process::terminate. Очень показательно, степерь маразма просто наивысшая. Имея живой хендл, вызывать при этом ACE_OS::kill(pid).


E>>А где вы это увидели? Я вот вижу в ACE 5.5.10 и ACE 5.6.3 вот такой код:

E>>
E>>ACE::terminate_process (pid_t pid)
E>>

E>>Жирным выделен фрагмент, работающий под Windows. На остальных системах процессы прибиваются при помощи kill.

AS>Ну, не так назвал функцию — без разницы. Нужное оставлено. У них есть хендл, убивают по pid, Разве это не идиотизм???


Это же переносимая библиотека. ACE_Process::terminate имеет один и тот же вид на любых платформах, в том числе и тех, на которых для процесса есть только PID.

E>>>>Насколько я знаю, Interlocked-операции -- это очень непортабельная штука.


AS>>>Ну, авторы нескольких других библиотек имеют на этот счет отдельное мнение


E>>Каких, например?


AS>APR, STLSoft, qt... Этого хватит?


Нет. С количеством платформ, на которых работает ACE, может сравниться разве что APR.

AS>Вообщем, кроме poco, это есть почти во всех либах, что тут проскакивали. И если посмотреть исходники ace, сделать этот вариант было экстремально просто — добавить функцию exchange в их реализация атомарных переменных.


Видимо, никому пока это не нужно было, вот и не сделали метода swap в ACE_Atomic_Op.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[12]: C/C++ file/process/thread api l/w framework
От: Andrew S Россия http://alchemy-lab.com
Дата: 21.03.08 14:09
Оценка:
AS>>Странно, что мне приходится это говорить именно вам, но эти файлы могут включаться неявно. Например, другим кроссплатформенным фреймворком. Хинт — попробуйте использовать ace и poco вместе

E>ACE и Poco в одном исходнике? Ну еще тогда туда можно добавить собственное использование Windows-функций, а также смешать MFC и Qt.


Собственно, а почему нет? Причем, кстати, лажает не поко, а именно ACE.

E>>>В первом томе "C++ Network Programming, Volume 1: Mastering Complexity with ACE and Patterns" есть глава "7.2 The ACE_Handle_Set Class", в которой описывается специальный класс ACE_Handle_Set, который разработчики ACE настоятельно рекомендуют использовать вместо fd_set. В частности:


AS>><цитата скиппед> Это не в тему, правда.


E>В тему должно быть то, что если вы беретесь за кроссплатформенное программирование с использованием какого-то фреймворка, то нужно забыть про системно-зависимые низкоуровневые вещи. Используйте только ACE (Poco, Qt, APR) и у вас не будет проблем с FD_SETSIZE -- просто потому, что FD_SETSIZE вам уже не нужен.


Вы так и не поняли, о чем я. Проблемы будут — поскольку на этом завязана ACE.

AS>>Просто подумайте, что FD_SETSIZE у вас может быть разный в зависимости от порядка включения заголовков, и что размер структур из-за этого может поехать (и в случае ACE_Handle_Set так оно и есть). Соответственно, конструкторы начинают делать фигню и т.п. — в общем, происходят ОЧЕНЬ_ПЛОХИЕ_ВЕЩИ.


E>Я вообще слабо представляю себе как такое может происходить. Разве что вы не подгружаете нужных заголовков в заголовочном файле со своими структурами, а делаете это только в своих cpp-файлах.


Не, правда, я удивляюсь, что это приходится объяснять. Вы билдите библиотеку — получается один размер (т.е. в lib). Затем пользуете в проекте — заголовки уже другие, а вот либа остается прежней.

AS>>Ну то есть с некорректностью реализации реактора на WFMO вы согласны?


E>Ну если бы вы подробно объяснили, в чем некорректность.


Я объяснил. Перечитайте.

E>А то ведь ACE используется в сотнях проектов и жалоб на поведение WFMO я в списках багов ACE пока не видел.


Да, сильный аргумент. Думаю, вопрос на этом можно закрыть.

E>>>
E>>>ACE::terminate_process (pid_t pid)
E>>>

E>>>Жирным выделен фрагмент, работающий под Windows. На остальных системах процессы прибиваются при помощи kill.

E>Это же переносимая библиотека. ACE_Process::terminate имеет один и тот же вид на любых платформах, в том числе и тех, на которых для процесса есть только PID.


Офигеть, дайте 2. Есть как минимум 2 функции с именем terminate. Это ACE_OS::terminate(pid) и ACE_Process::terminate(). Та, что метод — вообще без параметров, и имеет по идее в наличии хендл процесса, по-крайней мере, для вин32. В общем, я устал одно и то же говорить, право. Просто посмотрите исходники

AS>>APR, STLSoft, qt... Этого хватит?


E>Нет. С количеством платформ, на которых работает ACE, может сравниться разве что APR.


Не работает, а делает вид, что работает.

AS>>Вообщем, кроме poco, это есть почти во всех либах, что тут проскакивали. И если посмотреть исходники ace, сделать этот вариант было экстремально просто — добавить функцию exchange в их реализация атомарных переменных.


E>Видимо, никому пока это не нужно было, вот и не сделали метода swap в ACE_Atomic_Op.


Никому не нужно? Мда... Тогда, очевидно, и саму библиотеку действительно серьезно (т.е. для высокопроизводительных приложений) просто никто не пользует, потому как, повторюсь, это базовая операция. И анализ производительности ACE+TAO подтверждает плачевное состояние дел в этой части.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[13]: C/C++ file/process/thread api l/w framework
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 21.03.08 15:59
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>>>Странно, что мне приходится это говорить именно вам, но эти файлы могут включаться неявно. Например, другим кроссплатформенным фреймворком. Хинт — попробуйте использовать ace и poco вместе


E>>ACE и Poco в одном исходнике? Ну еще тогда туда можно добавить собственное использование Windows-функций, а также смешать MFC и Qt.


AS>Собственно, а почему нет? Причем, кстати, лажает не поко, а именно ACE.


Потому, что ACE берет на себя функции системно-зависимого слоя, на котором должно быть написано приложение. Только в этом случае ACE обеспечивает вам нормальную работу. Но когда вы это условие сами не выполняете, пытаясь использовать еще какой-то системно зависимый слой, то как здесь ACE что-то может гарантировать?

Вы вот можете написать GUI приложение одновременно на MFC и на Qt?

E>>>>В первом томе "C++ Network Programming, Volume 1: Mastering Complexity with ACE and Patterns" есть глава "7.2 The ACE_Handle_Set Class", в которой описывается специальный класс ACE_Handle_Set, который разработчики ACE настоятельно рекомендуют использовать вместо fd_set. В частности:


AS>>><цитата скиппед> Это не в тему, правда.


E>>В тему должно быть то, что если вы беретесь за кроссплатформенное программирование с использованием какого-то фреймворка, то нужно забыть про системно-зависимые низкоуровневые вещи. Используйте только ACE (Poco, Qt, APR) и у вас не будет проблем с FD_SETSIZE -- просто потому, что FD_SETSIZE вам уже не нужен.


AS> Вы так и не поняли, о чем я. Проблемы будут — поскольку на этом завязана ACE.


Вы говорите очень мало конкретики. Какие проблемы?

AS>>>Просто подумайте, что FD_SETSIZE у вас может быть разный в зависимости от порядка включения заголовков, и что размер структур из-за этого может поехать (и в случае ACE_Handle_Set так оно и есть). Соответственно, конструкторы начинают делать фигню и т.п. — в общем, происходят ОЧЕНЬ_ПЛОХИЕ_ВЕЩИ.


E>>Я вообще слабо представляю себе как такое может происходить. Разве что вы не подгружаете нужных заголовков в заголовочном файле со своими структурами, а делаете это только в своих cpp-файлах.


AS>Не, правда, я удивляюсь, что это приходится объяснять. Вы билдите библиотеку — получается один размер (т.е. в lib). Затем пользуете в проекте — заголовки уже другие, а вот либа остается прежней.


Что значить заголовки другие? Вы, наверное, lib и приложение разными версиями компиляторов строите. И при этом еще и режимы компиляции (Debug/Release) и размеры выравнивания, и даже версии ACE разные используете?

AS>>>Ну то есть с некорректностью реализации реактора на WFMO вы согласны?


E>>Ну если бы вы подробно объяснили, в чем некорректность.


AS>Я объяснил. Перечитайте.


Вы написали:

Я не про то. Событие, созданное при помощи WSACreateEvent, ждут при помощи WFMO. Надо ли объяснять, что при наличии LSP, который подменяет эти функции на свои (т.е. хендл события будет не обычным евентом) вся эта конструкция отправляется в dev\null. Ждать надо при помощи WSAWaitForMultipleEvents и точка — а это, очевидно, отправляет всю реализаци WFMO реактора в топку.


Я сделал контекстный поиск по исходникам ACE 5.5.10 и ACE 5.6.3 и не нашел ни одного вызова WSACreateEvent. Так о чем вы говорите тогда?

Кстати, вы так и не расшифровали LSP.

E>>>>
E>>>>ACE::terminate_process (pid_t pid)
E>>>>

E>>>>Жирным выделен фрагмент, работающий под Windows. На остальных системах процессы прибиваются при помощи kill.

E>>Это же переносимая библиотека. ACE_Process::terminate имеет один и тот же вид на любых платформах, в том числе и тех, на которых для процесса есть только PID.


AS>Офигеть, дайте 2. Есть как минимум 2 функции с именем terminate. Это ACE_OS::terminate(pid) и ACE_Process::terminate(). Та, что метод — вообще без параметров, и имеет по идее в наличии хендл процесса, по-крайней мере, для вин32. В общем, я устал одно и то же говорить, право. Просто посмотрите исходники


Еще раз ACE_Process::terminate() имеет одну и ту же реализацию на всех платформах -- вызов ACE_OS::terminate(pid). Для разработчиков ACE это важно и это легко понять. А вы почему беспокоитесь об этом? По вашему ACE_Process::terminate не работает?

AS>>>APR, STLSoft, qt... Этого хватит?


E>>Нет. С количеством платформ, на которых работает ACE, может сравниться разве что APR.


AS>Не работает, а делает вид, что работает.


У меня работает и под Windows, и под Linux-ами.

AS>>>Вообщем, кроме poco, это есть почти во всех либах, что тут проскакивали. И если посмотреть исходники ace, сделать этот вариант было экстремально просто — добавить функцию exchange в их реализация атомарных переменных.


E>>Видимо, никому пока это не нужно было, вот и не сделали метода swap в ACE_Atomic_Op.


AS>Никому не нужно? Мда... Тогда, очевидно, и саму библиотеку действительно серьезно (т.е. для высокопроизводительных приложений) просто никто не пользует, потому как, повторюсь, это базовая операция.


Базовая для чего? Мне вот, например, InterlockedExchange до сих пор никогда не понадобился.
И еще раз повторю, не везде есть такие операции. Во что превратиться алгоритм с использованием InterlockedExchange на архитектуре, где процессор не предоставляет подобных операций?

Что до использования ACE, то только в официальном списке созданных на ACE проектов наверняка есть те, производительность которых у вас не вызвала бы нареканий. А ведь там перечислено далеко не все.

AS>И анализ производительности ACE+TAO подтверждает плачевное состояние дел в этой части.


Не знаю, TAO не использовал. Однако TAO позиционируется как real-time ORB, а real-time -- это вовсе не скорость. По крайней мере, в авиации ACE+TAO успешно применен, что вряд ли было бы возможно при плачевном состоянии дел.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[14]: C/C++ file/process/thread api l/w framework
От: Andrew S Россия http://alchemy-lab.com
Дата: 21.03.08 19:14
Оценка:
AS>>>>Странно, что мне приходится это говорить именно вам, но эти файлы могут включаться неявно. Например, другим кроссплатформенным фреймворком. Хинт — попробуйте использовать ace и poco вместе

E>>>ACE и Poco в одном исходнике? Ну еще тогда туда можно добавить собственное использование Windows-функций, а также смешать MFC и Qt.


AS>>Собственно, а почему нет? Причем, кстати, лажает не поко, а именно ACE.


E>Потому, что ACE берет на себя функции системно-зависимого слоя, на котором должно быть написано приложение. Только в этом случае ACE обеспечивает вам нормальную работу. Но когда вы это условие сами не выполняете, пытаясь использовать еще какой-то системно зависимый слой, то как здесь ACE что-то может гарантировать?


Отличный аргумент. Наша либа сама стреляет себе в голову, но это нормально В общем, право, не вижу смысла продолжать дискуссию. Это уже какие-то прямо религиозные аргументы с вашей стороны пошли Я конечно, понимаю, что вы пользуете эту библиотеку, но вот это совсем не аргумент того, что она является действительно качественным продуктом, а не поделкой группы студентов.

E>Вы вот можете написать GUI приложение одновременно на MFC и на Qt?


Да (и подобных проблем при этом не поимею).

AS>>>>Просто подумайте, что FD_SETSIZE у вас может быть разный в зависимости от порядка включения заголовков, и что размер структур из-за этого может поехать (и в случае ACE_Handle_Set так оно и есть). Соответственно, конструкторы начинают делать фигню и т.п. — в общем, происходят ОЧЕНЬ_ПЛОХИЕ_ВЕЩИ.


E>>>Я вообще слабо представляю себе как такое может происходить. Разве что вы не подгружаете нужных заголовков в заголовочном файле со своими структурами, а делаете это только в своих cpp-файлах.


AS>>Не, правда, я удивляюсь, что это приходится объяснять. Вы билдите библиотеку — получается один размер (т.е. в lib). Затем пользуете в проекте — заголовки уже другие, а вот либа остается прежней.


E>Что значить заголовки другие? Вы, наверное, lib и приложение разными версиями компиляторов строите. И при этом еще и режимы компиляции (Debug/Release) и размеры выравнивания, и даже версии ACE разные используете?


Перечитайте то, что я писал. Всего лишь перед заголовком ace включается что-то, что устанавливает FD_SETSIZE. Явно или неявно. И все, после этого ACE улетает в dev\null. Право, ну сколько можно это говорить .

AS>>>>Ну то есть с некорректностью реализации реактора на WFMO вы согласны?


E>>>Ну если бы вы подробно объяснили, в чем некорректность.


AS>>Я объяснил. Перечитайте.


E>Вы написали:

E>

E>Я не про то. Событие, созданное при помощи WSACreateEvent, ждут при помощи WFMO. Надо ли объяснять, что при наличии LSP, который подменяет эти функции на свои (т.е. хендл события будет не обычным евентом) вся эта конструкция отправляется в dev\null. Ждать надо при помощи WSAWaitForMultipleEvents и точка — а это, очевидно, отправляет всю реализаци WFMO реактора в топку.


E>Я сделал контекстный поиск по исходникам ACE 5.5.10 и ACE 5.6.3 и не нашел ни одного вызова WSACreateEvent. Так о чем вы говорите тогда?


О том, что все очень печально. С сокетом можно ассоциировать событие, созданное только этой функцией. Теперь поищите по WSAEventSelect, и сделайте соотв. выводы.

E>Кстати, вы так и не расшифровали LSP.


И не буду, специально — я ведь сказал, где это есть. Заходите в MSDN, набираете искомую аббревиатуру и ва-ля. Если вам было бы действительно интересно понять проблему, а не отмахиваться от нее...

E>>>>>
E>>>>>ACE::terminate_process (pid_t pid)
E>>>>>

E>>>>>Жирным выделен фрагмент, работающий под Windows. На остальных системах процессы прибиваются при помощи kill.

E>>>Это же переносимая библиотека. ACE_Process::terminate имеет один и тот же вид на любых платформах, в том числе и тех, на которых для процесса есть только PID.


AS>>Офигеть, дайте 2. Есть как минимум 2 функции с именем terminate. Это ACE_OS::terminate(pid) и ACE_Process::terminate(). Та, что метод — вообще без параметров, и имеет по идее в наличии хендл процесса, по-крайней мере, для вин32. В общем, я устал одно и то же говорить, право. Просто посмотрите исходники


E>Еще раз ACE_Process::terminate() имеет одну и ту же реализацию на всех платформах -- вызов ACE_OS::terminate(pid). Для разработчиков ACE это важно и это легко понять. А вы почему беспокоитесь об этом? По вашему ACE_Process::terminate не работает?


Да мне пофиг, что он имеет одну реализацию и ребятам было просто лениво добавить пару строк кода специально для ACE_Process. ACE_Process и так вся в ifdef'ах. Есть хендл процесса — пользуйте его. А открыть процесс по id, кстати, может в каких экзотических случаях и прав не хватит. В общем, зачем забивать гвозди топором, имея молоток — я не знаю. Только от лени, просто им ВЛОМ.

AS>>>>APR, STLSoft, qt... Этого хватит?


E>>>Нет. С количеством платформ, на которых работает ACE, может сравниться разве что APR.


AS>>Не работает, а делает вид, что работает.


E>У меня работает и под Windows, и под Linux-ами.


AS>>Никому не нужно? Мда... Тогда, очевидно, и саму библиотеку действительно серьезно (т.е. для высокопроизводительных приложений) просто никто не пользует, потому как, повторюсь, это базовая операция.


E>Базовая для чего? Мне вот, например, InterlockedExchange до сих пор никогда не понадобился.


Ну тогда да, мне сложно вам будет объяснить. Но вообще то, этот примитив является обязательным
Например, без него не реализовать более сложные примитивы синхронизации более-менее оптимально.

E>И еще раз повторю, не везде есть такие операции. Во что превратиться алгоритм с использованием InterlockedExchange на архитектуре, где процессор не предоставляет подобных операций?


E>Что до использования ACE, то только в официальном списке созданных на ACE проектов наверняка есть те, производительность которых у вас не вызвала бы нареканий. А ведь там перечислено далеко не все.




AS>>И анализ производительности ACE+TAO подтверждает плачевное состояние дел в этой части.


E>Не знаю, TAO не использовал. Однако TAO позиционируется как real-time ORB, а real-time -- это вовсе не скорость. По крайней мере, в авиации ACE+TAO успешно применен, что вряд ли было бы возможно при плачевном состоянии дел.


Ну так попользуйте. Берем банальный перфоманс тест латентности, компилим (потратив ~день на сборку TAO+ACE), запускаем — работает. Выбираем в конфиге реактор на WFMO — и XP просто зависает (!!!!). Вот вам и ACE_FD_SETSIZE, равный 1024 по умолчанию. С WFMO такой фокус у них не прокатил. Так что там про баги то, где хотя бы одно упоминание об этом? Есть мысль, что они вообще не тестируют то, что пишут Во всяком случае, если случайно задать неправильный путь к ior файлу для теста, то он ... крешится, где-то глубоко в функциях чтения конфига. Причем конфиг, кстати, они пробуют открыть не только на чтение, но и на запись. В функции его чтения. Ай молодца, просто отлично .

Безусловно, ACE содержит в себе и очень много полезного кода, особенно для unix-like систем (например, только здесь я нашел ожидание посикс процесса с таймаутом, конечно, реализация спорная, но она есть), но вот win32 часть писали, к сожалению, далеко не профи. И это вылезает практически в любой строчке кода.

В общем, подводя итоги. Я не вижу смысла продолжать обсуждение — свои претензии к ACE я уже высказал, в рамках этой ветки меня интересуют другие возможные либы, но никак не ACE или Poco Это мы уже пользовали, расхлебываем до сих пор. Нафиг-нафиг.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[15]: C/C++ file/process/thread api l/w framework
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 21.03.08 19:45
Оценка:
Здравствуйте, Andrew S, Вы писали:

E>>Вы вот можете написать GUI приложение одновременно на MFC и на Qt?


AS>Да (и подобных проблем при этом не поимею).


Интересно было бы на это взглянуть. В частности на то, как вы собираетесь цикл обработки сообщений между MFC и Qt делить.

E>>Базовая для чего? Мне вот, например, InterlockedExchange до сих пор никогда не понадобился.


AS>Ну тогда да, мне сложно вам будет объяснить. Но вообще то, этот примитив является обязательным

AS>Например, без него не реализовать более сложные примитивы синхронизации более-менее оптимально.

Сложные примитивы -- это какие?


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[16]: C/C++ file/process/thread api l/w framework
От: Andrew S Россия http://alchemy-lab.com
Дата: 21.03.08 19:56
Оценка:
E>>>Вы вот можете написать GUI приложение одновременно на MFC и на Qt?

AS>>Да (и подобных проблем при этом не поимею).


E>Интересно было бы на это взглянуть. В частности на то, как вы собираетесь цикл обработки сообщений между MFC и Qt делить.


Ну, не боги горшки обжигают. Зачем делить, когда можно разнести? Основа на mfc, модельные диалоги на qt. Или наоборот. И никаких проблем с хидерами

E>>>Базовая для чего? Мне вот, например, InterlockedExchange до сих пор никогда не понадобился.


AS>>Ну тогда да, мне сложно вам будет объяснить. Но вообще то, этот примитив является обязательным

AS>>Например, без него не реализовать более сложные примитивы синхронизации более-менее оптимально.

E>Сложные примитивы -- это какие?


вариации rwlock, например. Да можно просто посмотреть Рихтера, там много примеров
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[15]: C/C++ file/process/thread api l/w framework
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 21.03.08 20:55
Оценка:
Здравствуйте, Andrew S, Вы писали:

E>>Что значить заголовки другие? Вы, наверное, lib и приложение разными версиями компиляторов строите. И при этом еще и режимы компиляции (Debug/Release) и размеры выравнивания, и даже версии ACE разные используете?


AS>Перечитайте то, что я писал. Всего лишь перед заголовком ace включается что-то, что устанавливает FD_SETSIZE. Явно или неявно. И все, после этого ACE улетает в dev\null. Право, ну сколько можно это говорить .


Но ведь FD_SETSIZE настраивается в config-win32-common.h в ACE.
Если ACE используется совместно с какой-то другой библиотекой, устанавливающей свое значение FD_SETSIZE, то нет ничего сложного в том, чтобы определить в ace/config.h значение FD_SETSIZE перед включением config-win32.h.

E>>Вы написали:

E>>

E>>Я не про то. Событие, созданное при помощи WSACreateEvent, ждут при помощи WFMO. Надо ли объяснять, что при наличии LSP, который подменяет эти функции на свои (т.е. хендл события будет не обычным евентом) вся эта конструкция отправляется в dev\null. Ждать надо при помощи WSAWaitForMultipleEvents и точка — а это, очевидно, отправляет всю реализаци WFMO реактора в топку.


E>>Я сделал контекстный поиск по исходникам ACE 5.5.10 и ACE 5.6.3 и не нашел ни одного вызова WSACreateEvent. Так о чем вы говорите тогда?


AS>О том, что все очень печально. С сокетом можно ассоциировать событие, созданное только этой функцией. Теперь поищите по WSAEventSelect, и сделайте соотв. выводы.


А где говорится о том, что WFMO нельзя использовать вместо WSAWaitForMultipleEvents?
Нет, серьезно. WSAWaitForMultipleEvents выглядит как тонкая обертка над WFMO, может таковой она и является? MSDN не всегда достоверный источник информации, тем более, что если бы в WFMO нельзя было передавать дескрипторы сокетов, то WFMO_Reactor вообще бы не работал.

AS>Ну так попользуйте. Берем банальный перфоманс тест латентности, компилим (потратив ~день на сборку TAO+ACE), запускаем — работает. Выбираем в конфиге реактор на WFMO — и XP просто зависает (!!!!).


Ага, зависает XP (вау, что за чудная система, виснет из-за user-space приложения), а виноват ACE?

Собственно, зависание теста -- это еще не показалесь. Тесты зачастую пишут так, что далеко не все ошибки обрабатываются. WFMO_Reactor мог вернуть код ошибки, на которую не среагировал тест -- тест вполне мог зависнуть.

AS>Безусловно, ACE содержит в себе и очень много полезного кода, особенно для unix-like систем (например, только здесь я нашел ожидание посикс процесса с таймаутом, конечно, реализация спорная, но она есть), но вот win32 часть писали, к сожалению, далеко не профи. И это вылезает практически в любой строчке кода.


AS>В общем, подводя итоги. Я не вижу смысла продолжать обсуждение — свои претензии к ACE я уже высказал, в рамках этой ветки меня интересуют другие возможные либы, но никак не ACE или Poco Это мы уже пользовали, расхлебываем до сих пор. Нафиг-нафиг.


Если вы сможете указать явные просчеты win32 части ACE, то другие пользователи могут взять на себя труд их исправить.

На отсутствие у ACE_Atomic_Op операции swap вы уже указали.
Еще одна претензия -- функция WMFO вместо WSAWFME.
На этом список не заканчивается, как я полагаю?


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[17]: C/C++ file/process/thread api l/w framework
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 21.03.08 20:58
Оценка:
Здравствуйте, Andrew S, Вы писали:

E>>>>Вы вот можете написать GUI приложение одновременно на MFC и на Qt?


AS>>>Да (и подобных проблем при этом не поимею).


E>>Интересно было бы на это взглянуть. В частности на то, как вы собираетесь цикл обработки сообщений между MFC и Qt делить.


AS>Ну, не боги горшки обжигают. Зачем делить, когда можно разнести? Основа на mfc, модельные диалоги на qt. Или наоборот.


Боюсь, что это только на словах так. Поскольку тот же Qt через циклы обработки сообщений пропускает обработку своих событий.

E>>>>Базовая для чего? Мне вот, например, InterlockedExchange до сих пор никогда не понадобился.


AS>>>Ну тогда да, мне сложно вам будет объяснить. Но вообще то, этот примитив является обязательным

AS>>>Например, без него не реализовать более сложные примитивы синхронизации более-менее оптимально.

E>>Сложные примитивы -- это какие?


AS>вариации rwlock, например.


На системах, где есть готовые rwlock-и вы так же будете их сами реализовывать через InterlockedExchange?


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[16]: C/C++ file/process/thread api l/w framework
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 21.03.08 21:10
Оценка:
Здравствуйте, eao197, Вы писали:

AS>>О том, что все очень печально. С сокетом можно ассоциировать событие, созданное только этой функцией. Теперь поищите по WSAEventSelect, и сделайте соотв. выводы.


E>А где говорится о том, что WFMO нельзя использовать вместо WSAWaitForMultipleEvents?

E>Нет, серьезно. WSAWaitForMultipleEvents выглядит как тонкая обертка над WFMO, может таковой она и является? MSDN не всегда достоверный источник информации, тем более, что если бы в WFMO нельзя было передавать дескрипторы сокетов, то WFMO_Reactor вообще бы не работал.

К слову, вот что удалось найти через Google:

Blocking and waiting for Completion Indication —
Applications may also choose to block while waiting for one
or more event objects to become set using
WSAWaitForMultipleEvents(). In Win16 implementations, this
will utilize a blocking hook as is currently provided for
standard blocking socket operations. In Win32
implementations, the process or thread will be truly
blocked. Since Winsock 2 event objects are implemented as
Win32 events, the native Win32 function
WaitForMultipleObjects() may also be used for this purpose.
This is especially useful if the thread needs to wait on
both socket and non-socket events
.

http://ftp.undernet.org/clients/windows/winsock/ftp/wsapi206.txt
(выделенное курсивом как раз актуально для WMFO_Reactor с его дополнительными событиями).

В других местах так же пишут о том, что WSAWFME всего лишь обертка над WMFO. И что это просто историческое стечение обстоятельств.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[18]: C/C++ file/process/thread api l/w framework
От: Andrew S Россия http://alchemy-lab.com
Дата: 21.03.08 21:17
Оценка:
AS>>Ну, не боги горшки обжигают. Зачем делить, когда можно разнести? Основа на mfc, модельные диалоги на qt. Или наоборот.

E>Боюсь, что это только на словах так. Поскольку тот же Qt через циклы обработки сообщений пропускает обработку своих событий.


Так пусть. Отделите мух от котлет. Ведь никто ж не требует ждать треды, созданные в ace посредством функций поко? Вот и тут — модальный диалог крутит свой цикл, фреймворк — свой. Или вы думаете, что и системный мессадж бокс тоже не будет работать?

E>>>>>Базовая для чего? Мне вот, например, InterlockedExchange до сих пор никогда не понадобился.


AS>>>>Ну тогда да, мне сложно вам будет объяснить. Но вообще то, этот примитив является обязательным

AS>>>>Например, без него не реализовать более сложные примитивы синхронизации более-менее оптимально.

E>>>Сложные примитивы -- это какие?


AS>>вариации rwlock, например.


E>На системах, где есть готовые rwlock-и вы так же будете их сами реализовывать через InterlockedExchange?


rw локи — это в качестве примера сложного примитива, где для быстрой реализации необходима подобная функциональность. И не только там — например, критическая секция с таймаутом (привет рихтеру), лок фри контейнеры и т.п. Еще это очень удобно использовать для исключающего выполнения участков кода в разных потоках, а-ля мини лок фри, без всяких лишних примитивов синхронизации. В общем, нужно это, нужно А в ace просто слажали, неужели так сложно это признать?
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[16]: C/C++ file/process/thread api l/w framework
От: Andrew S Россия http://alchemy-lab.com
Дата: 21.03.08 21:50
Оценка: 57 (1)
E>Но ведь FD_SETSIZE настраивается в config-win32-common.h в ACE.
E>Если ACE используется совместно с какой-то другой библиотекой, устанавливающей свое значение FD_SETSIZE, то нет ничего сложного в том, чтобы определить в ace/config.h значение FD_SETSIZE перед включением config-win32.h.

Угу, и если таких библиотек несколько ,получаем веселый зоопарк "кто вперед". На самом деле, все просто. Не использовать это в ACE_Handle_Set, а тому, кто написал это чудо — просто руки вырвать. С корнем

E>>>Вы написали:

E>>>

E>>>Я не про то. Событие, созданное при помощи WSACreateEvent, ждут при помощи WFMO. Надо ли объяснять, что при наличии LSP, который подменяет эти функции на свои (т.е. хендл события будет не обычным евентом) вся эта конструкция отправляется в dev\null. Ждать надо при помощи WSAWaitForMultipleEvents и точка — а это, очевидно, отправляет всю реализаци WFMO реактора в топку.


E>>>Я сделал контекстный поиск по исходникам ACE 5.5.10 и ACE 5.6.3 и не нашел ни одного вызова WSACreateEvent. Так о чем вы говорите тогда?


AS>>О том, что все очень печально. С сокетом можно ассоциировать событие, созданное только этой функцией. Теперь поищите по WSAEventSelect, и сделайте соотв. выводы.


E>А где говорится о том, что WFMO нельзя использовать вместо WSAWaitForMultipleEvents?

E>Нет, серьезно. WSAWaitForMultipleEvents выглядит как тонкая обертка над WFMO, может таковой она и является? MSDN не всегда достоверный источник информации, тем более, что если бы в WFMO нельзя было передавать дескрипторы сокетов, то WFMO_Reactor вообще бы не работал.

Дескрипторы сокетов туда никто не передает. Туда события передают
А вообще, у них даже тип разный WSAEVENT и HANDLE. Да, на самом деле это тонкая обертка (сейчас), но кто гарантирует, что так будет и дальше? Ответ — никто.

AS>>Ну так попользуйте. Берем банальный перфоманс тест латентности, компилим (потратив ~день на сборку TAO+ACE), запускаем — работает. Выбираем в конфиге реактор на WFMO — и XP просто зависает (!!!!).


E>Ага, зависает XP (вау, что за чудная система, виснет из-за user-space приложения), а виноват ACE?


И он тоже. В MSDN ясно написано — 64 хендла. ACE пробует больше.

E>Собственно, зависание теста -- это еще не показалесь. Тесты зачастую пишут так, что далеко не все ошибки обрабатываются. WFMO_Reactor мог вернуть код ошибки, на которую не среагировал тест -- тест вполне мог зависнуть.


Зависла система, а не тест Из-за кривого реактора.

AS>>Безусловно, ACE содержит в себе и очень много полезного кода, особенно для unix-like систем (например, только здесь я нашел ожидание посикс процесса с таймаутом, конечно, реализация спорная, но она есть), но вот win32 часть писали, к сожалению, далеко не профи. И это вылезает практически в любой строчке кода.


AS>>В общем, подводя итоги. Я не вижу смысла продолжать обсуждение — свои претензии к ACE я уже высказал, в рамках этой ветки меня интересуют другие возможные либы, но никак не ACE или Poco Это мы уже пользовали, расхлебываем до сих пор. Нафиг-нафиг.


E>Если вы сможете указать явные просчеты win32 части ACE, то другие пользователи могут взять на себя труд их исправить.


Могу, но не вижу смысла, поскольку есть библиотеки, где нет явных ляпов .

E>На отсутствие у ACE_Atomic_Op операции swap вы уже указали.

E>Еще одна претензия -- функция WMFO вместо WSAWFME.
E>На этом список не заканчивается, как я полагаю?

Например:
ACE_Process/Options
1. Terminate на хендл.
2. kill не работает.
3. Process_name, сомманд лайн и многое другое хранится в фиксированном буфере. Доколе, блин!
4. Содержит обекты ACE_Handle_Set (FD_SETSIZE).
5. При редиректе хендлов некорректно отслеживается ошибки дупликации (не удаляются ранее сдуплицированные хендлы). При этом при освобождении хендлов (в деструкторе или явным вызовом соотв. функции) в CloseHandle передаются INVALID_HANDLE_VALUE. В дебажной версии получаем int3 из ntdll.
6. Вдогонку к 5 — почему то при редиректе если я не указал один из потоков, пытаются использовать соотв. стандартный. А если его нет (приложение-сервис), или я просто НЕ ХОЧУ, чтобы мне гадили в stdout? Дефект дизайна.
7. Сюда же (потамучта редирект). ACE_Pipe реализована .. на сокетах. Аргументация — "дык иначе селект не работает". В топку.
8. В CreateProcess для win32 не используется process name. В результате, невозможно написать одинаковый код для CE и win32. Ау, так что там с портабельностью?
9. Где установка афинити процесса?
10. Нафига хринить PROCESS_INFO, когда можно только хендл процесса. Воообще, такие вещи надо реализовывать стратегиями, определяющими что меня интересует — id процесса, его стартовый поток и т.п. В общем, дефект дизайна.
11. Сколько надо сделать действий, чтобы средиректить вывод процесса? Правильно, ровно столько же, сколько на обычно вин32. А нафига тогда все это? В общем, нужные нормальные инкапсуляции всего этого счастья. Стратегиями редиректа.
12. Корявая реализация — правильно определив функцию запуска процесса, функции дуплицирования хендлов можно получить одинаковую реализацию запуска для posix и win32. Ну или почти одинаковую — сейчас там вообще все раздельно.
13. геттеры и сеттеры называются одинаково, отличаются только количеством параметров и возвращаемым значением. Автору читать stl.
14. Без комментариев:
MAX_COMMAND_LINE_OPTIONS = 128,
ENVIRONMENT_BUFFER = 16 * 1024, // 16K
MAX_ENVIRONMENT_ARGS = 512 //
ACE_Process_Options (int inherit_environment = 1,
int command_line_buf_len = DEFAULT_COMMAND_LINE_BUF_LEN,
int env_buf_len = ENVIRONMENT_BUFFER,
int max_env_args = MAX_ENVIRONMENT_ARGS);

15. И нафига оно в коде вин32?
/// Process-group on Unix; unused on Win32.
pid_t process_group_;
16. Нафига хранить в ACE_Process
/// Set of handles that were passed to the child process.
ACE_Handle_Set handles_passed_;
/// Handle duplicates made for the child process.
ACE_Handle_Set dup_handles_;
Вообще с ними непонятно — нужны ли они на win32, а, скорее всего, это надо определять стратегиями. Я не должен платить за то что не использую.

17. Сейчас ACE_Process_options занимает 8кб, ACE_Process — 2 кб. Я не хочу платить за ненужные мне элементы, это должно настраиваться стратегиями. Либо жить вовне.


Итого:
1. вин32, на мой взгляд писали ламеры.
2. Архитектура -1000.
3. Багов — выше крыши.

И это в паре классов, беглый просмотр. Прикольно, не находите?
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[17]: C/C++ file/process/thread api l/w framework
От: Andrew S Россия http://alchemy-lab.com
Дата: 21.03.08 21:58
Оценка:
AS>>>О том, что все очень печально. С сокетом можно ассоциировать событие, созданное только этой функцией. Теперь поищите по WSAEventSelect, и сделайте соотв. выводы.

E>>А где говорится о том, что WFMO нельзя использовать вместо WSAWaitForMultipleEvents?

E>>Нет, серьезно. WSAWaitForMultipleEvents выглядит как тонкая обертка над WFMO, может таковой она и является? MSDN не всегда достоверный источник информации, тем более, что если бы в WFMO нельзя было передавать дескрипторы сокетов, то WFMO_Reactor вообще бы не работал.

E>К слову, вот что удалось найти через Google:

E>

E>Blocking and waiting for Completion Indication —
E>Applications may also choose to block while waiting for one
E>or more event objects to become set using
E>WSAWaitForMultipleEvents(). In Win16 implementations, this
E>will utilize a blocking hook as is currently provided for
E>standard blocking socket operations. In Win32
E>implementations, the process or thread will be truly
E>blocked. Since Winsock 2 event objects are implemented as
E>Win32 events, the native Win32 function
E>WaitForMultipleObjects() may also be used for this purpose.
E>This is especially useful if the thread needs to wait on
E>both socket and non-socket events
.

E>http://ftp.undernet.org/clients/windows/winsock/ftp/wsapi206.txt
E>(выделенное курсивом как раз актуально для WMFO_Reactor с его дополнительными событиями).
E>В других местах так же пишут о том, что WSAWFME всего лишь обертка над WMFO. И что это просто историческое стечение обстоятельств.

Да, сейчас это так. Но не отменяет того, что в один прекрасный момент m$ может решить отправить такие реализации в dev\null, как это уже было с интерактивными сервисами Тем более, что все основания для этого есть — никаких явных гарантий по этому поводу нет, в общем, для того, чтобы осуществить такой шаг, будут все возможности (отдельные функции создания/удаления/ожиданния, и даже типы различаются). Ровно также вы можете ожидать соединения именованого пайпа в WFSO, но никто не гарантирует, что это будет работать и далее.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[19]: C/C++ file/process/thread api l/w framework
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 22.03.08 07:54
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>>>Ну, не боги горшки обжигают. Зачем делить, когда можно разнести? Основа на mfc, модельные диалоги на qt. Или наоборот.


E>>Боюсь, что это только на словах так. Поскольку тот же Qt через циклы обработки сообщений пропускает обработку своих событий.


AS>Так пусть. Отделите мух от котлет. Ведь никто ж не требует ждать треды, созданные в ace посредством функций поко? Вот и тут — модальный диалог крутит свой цикл, фреймворк — свой. Или вы думаете, что и системный мессадж бокс тоже не будет работать?


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

E>>>>>>Базовая для чего? Мне вот, например, InterlockedExchange до сих пор никогда не понадобился.


AS>>>>>Ну тогда да, мне сложно вам будет объяснить. Но вообще то, этот примитив является обязательным

AS>>>>>Например, без него не реализовать более сложные примитивы синхронизации более-менее оптимально.

E>>>>Сложные примитивы -- это какие?


AS>>>вариации rwlock, например.


E>>На системах, где есть готовые rwlock-и вы так же будете их сами реализовывать через InterlockedExchange?


AS>rw локи — это в качестве примера сложного примитива, где для быстрой реализации необходима подобная функциональность.


Т.е. в топку, поскольку есть готовые реализации rwlock-ов.

AS>И не только там — например, критическая секция с таймаутом (привет рихтеру),


Т.е. в топку, поскольку критическая секция -- это очень OS-specific. Для портабельности нужно пользоваться mutex-ами для которых есть примитивы ожидания с тайм-аутом.

AS>лок фри контейнеры и т.п.


Вот для этого нужно. Только вот что делать, если не все платформы эту инструкцию поддерживают?

AS>А в ace просто слажали, неужели так сложно это признать?


В ACE, как и в любой другой OpenSource библиотеке, сделали то, что нужно было авторам. Добавить туда swap для ACE_Atomic_Op -- как два байта... Благодоря тому же OpenSource. Просто пока это не нужно было никому. Но раз проблема обозначена, ее явно кто-нибудь решит.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[18]: C/C++ file/process/thread api l/w framework
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 22.03.08 07:56
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>Да, сейчас это так. Но не отменяет того, что в один прекрасный момент m$ может решить отправить такие реализации в dev\null, как это уже было с интерактивными сервисами Тем более, что все основания для этого есть — никаких явных гарантий по этому поводу нет, в общем, для того, чтобы осуществить такой шаг, будут все возможности (отдельные функции создания/удаления/ожиданния, и даже типы различаются). Ровно также вы можете ожидать соединения именованого пайпа в WFSO, но никто не гарантирует, что это будет работать и далее.


Совместимость. Уж если даже в Vista это все работает, то MS нужны будут очень и очень веские причины для того, чтобы поломать огромное количество написанного для Windows кода.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.