История изменений
Исправление asaw, (текущая версия) :
Это devel- ветка, то есть, вроде как, нестабильная, а я смотрю в master. Там, вроде как, sessman у них тоже однопоточный, но есть там такой вот чудесный кусок в main():
/* initializing locks */
lock_init();
/* signal handling */
g_pid = g_getpid();
/* old style signal handling is now managed synchronously by a
* separate thread. uncomment this block if you need old style
* signal handling and comment out thread_sighandler_start()
* going back to old style for the time being
* problem with the sigaddset functions in sig.c - jts */
#if 1
g_signal_hang_up(sig_sesman_reload_cfg); /* SIGHUP */
g_signal_user_interrupt(sig_sesman_shutdown); /* SIGINT */
g_signal_kill(sig_sesman_shutdown); /* SIGKILL */
g_signal_terminate(sig_sesman_shutdown); /* SIGTERM */
g_signal_child_stop(sig_sesman_session_end); /* SIGCHLD */
#endif
#if 0
thread_sighandler_start();
#endif
https://github.com/neutrinolabs/xrdp/blob/master/sesman/sesman.c
То есть thread_sighandler_start(); они, всё же, решили не использовать, потому что наступили на какие-то грабли, зато вовсю используют свой log_message из обработчиков сигналов, того же sig_sesman_session_end() например. И в итоге хоть код и не многопоточный, эффекты с примитивами синхронизации могут быть теми же. Удивительно как из самих сигналов всё не лочится.
Интересно, можно ли что-нибудь сделать с log_message(), чтобы оно стало безопасно?
Исходная версия asaw, :
Это devel- ветка, то есть, вроде как, нестабильная, а я смотрю в master. Там, вроде как, sessman у них тоже однопоточный, но есть там такой вот чудесный кусок в main():
/* initializing locks */
lock_init();
/* signal handling */
g_pid = g_getpid();
/* old style signal handling is now managed synchronously by a
* separate thread. uncomment this block if you need old style
* signal handling and comment out thread_sighandler_start()
* going back to old style for the time being
* problem with the sigaddset functions in sig.c - jts */
#if 1
g_signal_hang_up(sig_sesman_reload_cfg); /* SIGHUP */
g_signal_user_interrupt(sig_sesman_shutdown); /* SIGINT */
g_signal_kill(sig_sesman_shutdown); /* SIGKILL */
g_signal_terminate(sig_sesman_shutdown); /* SIGTERM */
g_signal_child_stop(sig_sesman_session_end); /* SIGCHLD */
#endif
#if 0
thread_sighandler_start();
#endif
То есть thread_sighandler_start(); они, всё же, решили не использовать, потому что наступили на какие-то грабли, зато вовсю используют свой log_message из обработчиков сигналов, того же sig_sesman_session_end() например. И в итоге хоть код и не многопоточный, эффекты с примитивами синхронизации могут быть теми же. Удивительно как из самих сигналов всё не лочится.
Интересно, можно ли что-нибудь сделать с log_message(), чтобы оно стало безопасно?