You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2023/12/15 04:50:52 UTC
(nuttx) 01/05: syslog/ramlog: Prepare to support the multiple reader
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit e920883458315154bf59362a9f24f8d15de3df10
Author: Xiang Xiao <xi...@xiaomi.com>
AuthorDate: Sat Nov 18 18:14:25 2023 +0800
syslog/ramlog: Prepare to support the multiple reader
1.Remove RAMLOG_OVERWRITE option and related code
2.Broadcast the readability to all reader and poller
Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
---
boards/arm/stm32/photon/configs/adb/defconfig | 1 -
drivers/syslog/Kconfig | 7 --
drivers/syslog/ramlog.c | 117 ++++----------------------
3 files changed, 16 insertions(+), 109 deletions(-)
diff --git a/boards/arm/stm32/photon/configs/adb/defconfig b/boards/arm/stm32/photon/configs/adb/defconfig
index b2d08164c7..3507e390ed 100644
--- a/boards/arm/stm32/photon/configs/adb/defconfig
+++ b/boards/arm/stm32/photon/configs/adb/defconfig
@@ -45,7 +45,6 @@ CONFIG_PHOTON_WDG_THREAD=y
CONFIG_PREALLOC_TIMERS=4
CONFIG_RAMLOG=y
CONFIG_RAMLOG_BUFSIZE=2048
-CONFIG_RAMLOG_OVERWRITE=y
CONFIG_RAMLOG_SYSLOG=y
CONFIG_RAM_SIZE=114688
CONFIG_RAM_START=0x20000000
diff --git a/drivers/syslog/Kconfig b/drivers/syslog/Kconfig
index 1addc71fa2..e592bbb75b 100644
--- a/drivers/syslog/Kconfig
+++ b/drivers/syslog/Kconfig
@@ -54,13 +54,6 @@ config RAMLOG_NPOLLWAITERS
---help---
The maximum number of threads that may be waiting on the poll method.
-config RAMLOG_OVERWRITE
- bool "RAMLOG overwrite circular buffer"
- default n
- ---help---
- Enable overwrite of circular buffer. If RAMLOG buffer overflows,
- overwrite it from the top of buffer and always keep the latest log.
-
config RAMLOG_POLLTHRESHOLD
int "The threshold value of circular buffer to notify poll waiters"
default 1
diff --git a/drivers/syslog/ramlog.c b/drivers/syslog/ramlog.c
index 772fc8e8fc..6496404d74 100644
--- a/drivers/syslog/ramlog.c
+++ b/drivers/syslog/ramlog.c
@@ -83,11 +83,11 @@ struct ramlog_dev_s
/* Helper functions */
#ifndef CONFIG_RAMLOG_NONBLOCKING
-static int ramlog_readnotify(FAR struct ramlog_dev_s *priv);
+static void ramlog_readnotify(FAR struct ramlog_dev_s *priv);
#endif
static void ramlog_pollnotify(FAR struct ramlog_dev_s *priv,
pollevent_t eventset);
-static int ramlog_addchar(FAR struct ramlog_dev_s *priv, char ch);
+static void ramlog_addchar(FAR struct ramlog_dev_s *priv, char ch);
/* Character driver methods */
@@ -166,16 +166,15 @@ static size_t ramlog_bufferused(FAR struct ramlog_dev_s *priv)
****************************************************************************/
#ifndef CONFIG_RAMLOG_NONBLOCKING
-static int ramlog_readnotify(FAR struct ramlog_dev_s *priv)
+static void ramlog_readnotify(FAR struct ramlog_dev_s *priv)
{
irqstate_t flags;
- int i;
/* Notify all waiting readers that they can read from the FIFO */
flags = enter_critical_section();
- for (i = 0; ; i++)
+ for (; ; )
{
int semcount = 0;
@@ -189,10 +188,6 @@ static int ramlog_readnotify(FAR struct ramlog_dev_s *priv)
}
leave_critical_section(flags);
-
- /* Return number of notified readers. */
-
- return i;
}
#endif
@@ -286,7 +281,7 @@ static void ramlog_initbuf(void)
* Name: ramlog_addchar
****************************************************************************/
-static int ramlog_addchar(FAR struct ramlog_dev_s *priv, char ch)
+static void ramlog_addchar(FAR struct ramlog_dev_s *priv, char ch)
{
irqstate_t flags;
size_t nexthead;
@@ -308,7 +303,7 @@ static int ramlog_addchar(FAR struct ramlog_dev_s *priv, char ch)
if (ch == '\r')
{
leave_critical_section(flags);
- return OK;
+ return;
}
/* Pre-pend a carriage before a linefeed */
@@ -333,7 +328,6 @@ again:
if (nexthead == priv->rl_tail)
{
-#ifdef CONFIG_RAMLOG_OVERWRITE
/* Yes... Overwrite with the latest log in the circular buffer */
priv->rl_buffer[priv->rl_tail] = '\0';
@@ -342,12 +336,6 @@ again:
{
priv->rl_tail = 0;
}
-#else
- /* Yes... Return an indication that nothing was saved in the buffer. */
-
- leave_critical_section(flags);
- return -EBUSY;
-#endif
}
/* No... copy the byte and re-enable interrupts */
@@ -364,7 +352,6 @@ again:
#endif
leave_critical_section(flags);
- return OK;
}
/****************************************************************************
@@ -374,8 +361,7 @@ again:
static ssize_t ramlog_addbuf(FAR struct ramlog_dev_s *priv,
FAR const char *buffer, size_t len)
{
- int readers_waken;
- ssize_t nwritten;
+ size_t nwritten;
char ch;
int ret;
@@ -385,7 +371,7 @@ static ssize_t ramlog_addbuf(FAR struct ramlog_dev_s *priv,
return ret;
}
- for (nwritten = 0; (size_t)nwritten < len; nwritten++)
+ for (nwritten = 0; nwritten < len; nwritten++)
{
/* Get the next character to output */
@@ -393,40 +379,20 @@ static ssize_t ramlog_addbuf(FAR struct ramlog_dev_s *priv,
/* Then output the character */
- ret = ramlog_addchar(priv, ch);
- if (ret < 0)
- {
- /* The buffer is full and nothing was saved. The remaining
- * data to be written is dropped on the floor.
- */
-
- break;
- }
+ ramlog_addchar(priv, ch);
}
/* Was anything written? */
if (nwritten > 0)
{
- readers_waken = 0;
-
#ifndef CONFIG_RAMLOG_NONBLOCKING
/* Are there threads waiting for read data? */
- readers_waken = ramlog_readnotify(priv);
+ ramlog_readnotify(priv);
#endif
- /* If there are multiple readers, some of them might block despite
- * POLLIN because first reader might read all data. Favor readers
- * and notify poll waiters only if no reader was awakened, even if
- * the latter may starve.
- *
- * This also implies we do not have to make these two notify
- * operations a critical section.
- */
-
- if (readers_waken == 0 &&
- ramlog_bufferused(priv) >= CONFIG_RAMLOG_POLLTHRESHOLD)
+ if (ramlog_bufferused(priv) >= CONFIG_RAMLOG_POLLTHRESHOLD)
{
/* Notify all poll/select waiters that they can read from the
* FIFO.
@@ -547,14 +513,7 @@ static ssize_t ramlog_file_read(FAR struct file *filep, FAR char *buffer,
* anything already before waiting.
*/
- nread = ret;
-
- /* Break out to return what we have. Note, we can't exactly
- * "break" out because whichever error occurred, we do not hold
- * the exclusion mutex.
- */
-
- goto errout_without_lock;
+ return ret;
}
#endif /* CONFIG_RAMLOG_NONBLOCKING */
}
@@ -585,17 +544,6 @@ static ssize_t ramlog_file_read(FAR struct file *filep, FAR char *buffer,
nxmutex_unlock(&priv->rl_lock);
- /* Notify all poll/select waiters that they can write to the FIFO */
-
-#ifndef CONFIG_RAMLOG_NONBLOCKING
-errout_without_lock:
-#endif
-
- if (nread > 0)
- {
- ramlog_pollnotify(priv, POLLOUT);
- }
-
/* Return the number of characters actually read */
return nread;
@@ -662,9 +610,8 @@ static int ramlog_file_poll(FAR struct file *filep, FAR struct pollfd *fds,
{
FAR struct inode *inode = filep->f_inode;
FAR struct ramlog_dev_s *priv;
- pollevent_t eventset;
+ pollevent_t eventset = POLLOUT;
irqstate_t flags;
- size_t next_head;
int ret;
int i;
@@ -712,21 +659,7 @@ static int ramlog_file_poll(FAR struct file *filep, FAR struct pollfd *fds,
/* Should immediately notify on any of the requested events? */
- eventset = 0;
-
flags = enter_critical_section();
- next_head = priv->rl_head + 1;
- if (next_head >= priv->rl_bufsize)
- {
- next_head = 0;
- }
-
- /* First, check if the receive buffer is not full. */
-
- if (next_head != priv->rl_tail)
- {
- eventset |= POLLOUT;
- }
/* Check if the receive buffer is not empty. */
@@ -846,38 +779,20 @@ void ramlog_syslog_register(void)
int ramlog_putc(FAR struct syslog_channel_s *channel, int ch)
{
FAR struct ramlog_dev_s *priv = &g_sysdev;
- int readers_waken = 0;
- int ret;
UNUSED(channel);
/* Add the character to the RAMLOG */
- ret = ramlog_addchar(priv, ch);
- if (ret < 0)
- {
- /* The buffer is full and 'ch' was not saved. */
-
- return ret;
- }
+ ramlog_addchar(priv, ch);
#ifndef CONFIG_RAMLOG_NONBLOCKING
/* Are there threads waiting for read data? */
- readers_waken = ramlog_readnotify(priv);
+ ramlog_readnotify(priv);
#endif
- /* If there are multiple readers, some of them might block despite
- * POLLIN because first reader might read all data. Favor readers
- * and notify poll waiters only if no reader was awakened, even if
- * the latter may starve.
- *
- * This also implies we do not have to make these two notify
- * operations a critical section.
- */
-
- if (readers_waken == 0 &&
- ramlog_bufferused(priv) >= CONFIG_RAMLOG_POLLTHRESHOLD)
+ if (ramlog_bufferused(priv) >= CONFIG_RAMLOG_POLLTHRESHOLD)
{
/* Notify all poll/select waiters that they can read from the FIFO */