michaellukashov / Far-NetBox

SFTP/SCP/FTP/FTPS/WebDAV/S3 client for Far Manager 3 (http://farmanager.com/)
https://forum.farmanager.com/viewtopic.php?t=6317
GNU General Public License v2.0
155 stars 52 forks source link

Правка tinylog #416

Closed ssvine closed 4 months ago

ssvine commented 4 months ago

Попытка №2.

Просматривал лог и обнаружил битые данные, вроде такого Enumerating network events f\xD3\xAE\x09.

Это произошло из-за того, что под временный буфер выделяется исключительно need_capacity байтов, без заверщающего нулевого символа, а в TryAppend при форматировании строки шаблон %s требует данные с нулём в конце. Можно исправить, выделяя под буфер на один байт больше, либо указав шаблон %.*s с размером.

Как я понял, Вы сделали ограничение на вставку в буфер, чтобы данные точно смогли вместиться в него, т.к. в предыдущей версии оставалась возможность, что если количество данных для записи превышает размер буфера, то всё встанет.

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

В пулл реквесте:

По поводу Buffer::Flush - было 3 проблемы:

Ситуацию спасает то, что используется проверка n_write == size_ и то, что если нет никаких проблем при записи, fwrite записывает весь буфер за один раз.

Протестировал работу при разных размерах буферов, в том числе крошечных вроде 128 байт, а также при указании INFINITE в pthread_cond_timedwait.