лаг при закрытии Far, когда включено журналирование и открыта сессия
Как оказалось, проблема с потерей отладочных сообщений существует даже на относительно старых версиях плагина, которые я проверял. С первого раза сообщения могут не теряться, но по мере работы с сессиями, подключениями, переподключениями, скачиванием файлов и т.д. начинаются потери.
Почему так? Одной из причин является то, что pthreads_cond_timedwait не работает. В этом можно быстро убедиться, поставив туда вместо timeout_millisecs значение INFINITE. Теперь таймаутов не будет, но из-за проблем с реализацией выполнение pthread_cond_signal не приведёт к возврату из pthreads_cond_timedwait, поэтому в файле лога сообщения будут отсутствовать. А если выйти из Far, то получим зависание. То есть фактически pthreads_cond_timedwait работает просто как таймер.
Помимо некорректной реализации базовых функций pthread, также есть недостатки у LogStream::InternalWrite и TinyLogImpl::MainLoop.
Основные правки:
сделал минимальную работоспособную версию функций pthread_xxx, пригодных для использования в ситуации multiple producers / single consumer (как раз случай tinylog)
в файле platform_win32.h подчистил всё неиспользуемое
поправил код функций LogStream::InternalWrite и TinyLogImpl::MainLoop
В пулл реквесте исправляются проблемы:
Far
, когда включено журналирование и открыта сессияКак оказалось, проблема с потерей отладочных сообщений существует даже на относительно старых версиях плагина, которые я проверял. С первого раза сообщения могут не теряться, но по мере работы с сессиями, подключениями, переподключениями, скачиванием файлов и т.д. начинаются потери.
Почему так? Одной из причин является то, что
pthreads_cond_timedwait
не работает. В этом можно быстро убедиться, поставив туда вместоtimeout_millisecs
значениеINFINITE
. Теперь таймаутов не будет, но из-за проблем с реализацией выполнениеpthread_cond_signal
не приведёт к возврату изpthreads_cond_timedwait
, поэтому в файле лога сообщения будут отсутствовать. А если выйти изFar
, то получим зависание. То есть фактическиpthreads_cond_timedwait
работает просто как таймер.Помимо некорректной реализации базовых функций
pthread
, также есть недостатки уLogStream::InternalWrite
иTinyLogImpl::MainLoop
.Основные правки:
pthread_xxx
, пригодных для использования в ситуации multiple producers / single consumer (как раз случайtinylog
)platform_win32.h
подчистил всё неиспользуемоеLogStream::InternalWrite
иTinyLogImpl::MainLoop