diff --git a/drivers/serial/serial.c b/drivers/serial/serial.c index d475f44d12075..6915e8d1f3516 100644 --- a/drivers/serial/serial.c +++ b/drivers/serial/serial.c @@ -268,10 +268,6 @@ static int uart_putxmitchar(FAR uart_dev_t *dev, int ch, bool oktoblock) { /* The following steps must be atomic with respect to serial * interrupt handling. - * - * This critical section is also used for the serialization - * with the up_putc-based syslog channels. - * See https://github.com/apache/nuttx/issues/14662 */ flags = enter_critical_section(); diff --git a/drivers/syslog/syslog_channel.c b/drivers/syslog/syslog_channel.c index 8038271d5944d..a7893359d7732 100644 --- a/drivers/syslog/syslog_channel.c +++ b/drivers/syslog/syslog_channel.c @@ -33,6 +33,7 @@ #include #include +#include #ifdef CONFIG_RAMLOG_SYSLOG # include @@ -71,6 +72,10 @@ static ssize_t syslog_default_write(FAR syslog_channel_t *channel, * Private Data ****************************************************************************/ +#if defined(CONFIG_SYSLOG_DEFAULT) && defined(CONFIG_ARCH_LOWPUTC) +static mutex_t g_lowputs_lock = NXMUTEX_INITIALIZER; +#endif + #ifdef CONFIG_RAMLOG_SYSLOG static const struct syslog_channel_ops_s g_ramlog_channel_ops = { @@ -229,17 +234,11 @@ g_syslog_channel[CONFIG_SYSLOG_MAX_CHANNELS] = #ifdef CONFIG_SYSLOG_DEFAULT static int syslog_default_putc(FAR syslog_channel_t *channel, int ch) { -# ifdef CONFIG_ARCH_LOWPUTC - /* See https://github.com/apache/nuttx/issues/14662 - * about what this critical section is for. - */ + UNUSED(channel); - irqstate_t flags = enter_critical_section(); +# ifdef CONFIG_ARCH_LOWPUTC up_putc(ch); - leave_critical_section(flags); # endif - - UNUSED(channel); return ch; } @@ -247,13 +246,11 @@ static ssize_t syslog_default_write(FAR syslog_channel_t *channel, FAR const char *buffer, size_t buflen) { # ifdef CONFIG_ARCH_LOWPUTC - /* See https://github.com/apache/nuttx/issues/14662 - * about what this critical section is for. - */ + nxmutex_lock(&g_lowputs_lock); - irqstate_t flags = enter_critical_section(); up_nputs(buffer, buflen); - leave_critical_section(flags); + + nxmutex_unlock(&g_lowputs_lock); # endif UNUSED(channel);