diff --git a/src/ebusd/main.cpp b/src/ebusd/main.cpp index 54803402..a1924f35 100644 --- a/src/ebusd/main.cpp +++ b/src/ebusd/main.cpp @@ -123,6 +123,7 @@ static struct options opt = { false, // dump "/tmp/" PACKAGE "_dump.bin", // dumpFile 100, // dumpSize + false, // dumpFlush }; /** the @a MessageMap instance, or nullptr. */ @@ -174,6 +175,7 @@ static const char argpdoc[] = #define O_RAWSIZ (O_RAWFIL+1) #define O_DMPFIL (O_RAWSIZ+1) #define O_DMPSIZ (O_DMPFIL+1) +#define O_DMPFLU (O_DMPSIZ+1) /** the definition of the known program arguments. */ static const struct argp_option argpoptions[] = { @@ -242,6 +244,7 @@ static const struct argp_option argpoptions[] = { {"dump", 'D', nullptr, 0, "Enable binary dump of received bytes", 0 }, {"dumpfile", O_DMPFIL, "FILE", 0, "Dump received bytes to FILE [/tmp/" PACKAGE "_dump.bin]", 0 }, {"dumpsize", O_DMPSIZ, "SIZE", 0, "Make dump file no larger than SIZE kB [100]", 0 }, + {"dumpflush", O_DMPFLU, nullptr, 0, "Flush each byte", 0 }, {nullptr, 0, nullptr, 0, nullptr, 0 }, }; @@ -581,6 +584,9 @@ error_t parse_opt(int key, char *arg, struct argp_state *state) { return EINVAL; } break; + case O_DMPFLU: // --dumpflush + opt->dumpFlush = true; + break; case ARGP_KEY_ARG: if (opt->injectMessages || (opt->checkConfig && opt->scanConfig)) { diff --git a/src/ebusd/main.h b/src/ebusd/main.h index 97717af0..e2721365 100644 --- a/src/ebusd/main.h +++ b/src/ebusd/main.h @@ -85,6 +85,7 @@ struct options { bool dump; //!< binary dump received bytes const char* dumpFile; //!< name of dump file [/tmp/ebusd_dump.bin] unsigned int dumpSize; //!< maximum size of dump file in kB [100] + bool dumpFlush; //!< flush each byte }; /** diff --git a/src/ebusd/mainloop.cpp b/src/ebusd/mainloop.cpp index a63edff8..a295e41f 100644 --- a/src/ebusd/mainloop.cpp +++ b/src/ebusd/mainloop.cpp @@ -111,7 +111,7 @@ MainLoop::MainLoop(const struct options& opt, Device *device, MessageMap* messag } m_device->setListener(this); if (opt.dumpFile[0]) { - m_dumpFile = new RotateFile(opt.dumpFile, opt.dumpSize); + m_dumpFile = new RotateFile(opt.dumpFile, opt.dumpSize, false, opt.dumpFlush ? 1 : 16); m_dumpFile->setEnabled(opt.dump); } else { m_dumpFile = nullptr; diff --git a/src/lib/utils/rotatefile.cpp b/src/lib/utils/rotatefile.cpp index 062c9953..8cf4cc68 100755 --- a/src/lib/utils/rotatefile.cpp +++ b/src/lib/utils/rotatefile.cpp @@ -82,7 +82,7 @@ void RotateFile::write(const unsigned char* value, const size_t size, const bool fwrite(value, (streamsize)size, 1, m_stream); m_fileSize += size; m_flushSize += size; - if (m_flushSize > 16) { + if (m_flushSize >= m_flushBuffer) { fflush(m_stream); m_flushSize = 0; } diff --git a/src/lib/utils/rotatefile.h b/src/lib/utils/rotatefile.h index e184d574..5e75aef2 100755 --- a/src/lib/utils/rotatefile.h +++ b/src/lib/utils/rotatefile.h @@ -43,10 +43,11 @@ class RotateFile { * @param fileName the name of the file write to. * @param maxSize the maximum size of the file to write to. * @param textMode whether to write each byte with prefixed timestamp and direction as text. + * @param flushBuffer the size of the flush buffer. */ - RotateFile(const string fileName, const unsigned int maxSize, const bool textMode = false) + RotateFile(const string fileName, const unsigned int maxSize, const bool textMode = false, const unsigned int flushBuffer = 16) : m_enabled(false), m_fileName(fileName), m_maxSize(maxSize), m_textMode(textMode), m_stream(), m_fileSize(0), - m_flushSize(0) {} + m_flushSize(0), m_flushBuffer(flushBuffer) {} /** * Destructor. @@ -98,6 +99,9 @@ class RotateFile { /** the number of bytes written to @a m_file since the last flush. */ uint64_t m_flushSize; + + /** the size of the flush buffer. */ + const unsigned int m_flushBuffer; }; } // namespace ebusd