mirror of
https://github.com/apache/nuttx.git
synced 2026-05-30 21:36:28 +08:00
libc/syslograwstream: Use memrchr to locate the newline character
for output to avoid log disorder. If no newline character is found, and the buffer is full, forced output is required; if the buffer is not full, output is performed according to the newline character to prevent log disorder. Signed-off-by: dongjiuzhu1 <dongjiuzhu1@xiaomi.com>
This commit is contained in:
@@ -27,6 +27,7 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include <nuttx/streams.h>
|
#include <nuttx/streams.h>
|
||||||
#include <nuttx/syslog/syslog.h>
|
#include <nuttx/syslog/syslog.h>
|
||||||
@@ -43,7 +44,7 @@
|
|||||||
static int syslograwstream_flush(FAR struct lib_outstream_s *self)
|
static int syslograwstream_flush(FAR struct lib_outstream_s *self)
|
||||||
{
|
{
|
||||||
FAR struct lib_syslograwstream_s *stream = (FAR void *)self;
|
FAR struct lib_syslograwstream_s *stream = (FAR void *)self;
|
||||||
int ret = OK;
|
ssize_t ret = OK;
|
||||||
|
|
||||||
DEBUGASSERT(stream != NULL);
|
DEBUGASSERT(stream != NULL);
|
||||||
|
|
||||||
@@ -51,24 +52,48 @@ static int syslograwstream_flush(FAR struct lib_outstream_s *self)
|
|||||||
|
|
||||||
if (stream->offset > 0)
|
if (stream->offset > 0)
|
||||||
{
|
{
|
||||||
|
ssize_t nbytes = stream->offset;
|
||||||
|
ssize_t written = 0;
|
||||||
|
|
||||||
/* Yes write the buffered data */
|
/* Yes write the buffered data */
|
||||||
|
|
||||||
|
if (stream->offset == CONFIG_SYSLOG_BUFSIZE + 1)
|
||||||
|
{
|
||||||
|
FAR char *newline;
|
||||||
|
|
||||||
|
nbytes = --stream->offset;
|
||||||
|
newline = memrchr(stream->buffer, '\n', nbytes);
|
||||||
|
if (newline != NULL)
|
||||||
|
{
|
||||||
|
nbytes = newline - stream->buffer + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
ssize_t nbytes = syslog_write(stream->buffer, stream->offset);
|
ret = syslog_write(stream->buffer + written, nbytes - written);
|
||||||
if (nbytes < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
ret = nbytes;
|
if (ret != -EINTR)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ret = OK;
|
written += ret;
|
||||||
|
stream->offset -= ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while (ret == -EINTR);
|
while (nbytes != written);
|
||||||
|
|
||||||
|
if (ret >= 0 && stream->offset > 0)
|
||||||
|
{
|
||||||
|
memmove(stream->buffer, stream->buffer + nbytes,
|
||||||
|
stream->offset);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stream->offset = 0;
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,6 +117,10 @@ static void syslograwstream_addchar(FAR struct lib_syslograwstream_s *stream,
|
|||||||
|
|
||||||
if (stream->offset >= CONFIG_SYSLOG_BUFSIZE)
|
if (stream->offset >= CONFIG_SYSLOG_BUFSIZE)
|
||||||
{
|
{
|
||||||
|
/* Mark the buffer to be flushed when ending with \n */
|
||||||
|
|
||||||
|
stream->offset = CONFIG_SYSLOG_BUFSIZE + 1;
|
||||||
|
|
||||||
/* Yes.. then flush the buffer */
|
/* Yes.. then flush the buffer */
|
||||||
|
|
||||||
syslograwstream_flush(&stream->common);
|
syslograwstream_flush(&stream->common);
|
||||||
@@ -120,6 +149,10 @@ syslograwstream_addstring(FAR struct lib_syslograwstream_s *stream,
|
|||||||
|
|
||||||
if (stream->offset >= CONFIG_SYSLOG_BUFSIZE)
|
if (stream->offset >= CONFIG_SYSLOG_BUFSIZE)
|
||||||
{
|
{
|
||||||
|
/* Mark the buffer to be flushed when ending with \n */
|
||||||
|
|
||||||
|
stream->offset = CONFIG_SYSLOG_BUFSIZE + 1;
|
||||||
|
|
||||||
/* Yes.. then flush the buffer */
|
/* Yes.. then flush the buffer */
|
||||||
|
|
||||||
syslograwstream_flush(&stream->common);
|
syslograwstream_flush(&stream->common);
|
||||||
|
|||||||
Reference in New Issue
Block a user