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 2021/12/13 17:08:35 UTC
[incubator-nuttx] 02/03: syslog_rpmsg: update syslog_rpmsg to support non-overwrite
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/incubator-nuttx.git
commit 93426ca7cc6ea5111bcf591189352d144ab5ade1
Author: ligd <li...@xiaomi.com>
AuthorDate: Tue Dec 7 22:40:00 2021 +0800
syslog_rpmsg: update syslog_rpmsg to support non-overwrite
Signed-off-by: ligd <li...@xiaomi.com>
---
drivers/syslog/Kconfig | 8 ++++++
drivers/syslog/syslog_rpmsg.c | 65 ++++++++++++++++++++++++++++++++-----------
2 files changed, 57 insertions(+), 16 deletions(-)
diff --git a/drivers/syslog/Kconfig b/drivers/syslog/Kconfig
index e8f68e8..e004c14 100644
--- a/drivers/syslog/Kconfig
+++ b/drivers/syslog/Kconfig
@@ -250,6 +250,14 @@ config SYSLOG_RPMSG_WORK_DELAY
default 100
depends on SYSLOG_RPMSG
+config SYSLOG_RPMSG_OVERWRITE
+ bool "SYSLOG RPMSG overwrite"
+ default n
+ depends on SYSLOG_RPMSG
+ ---help---
+ Allow syslog rpmsg overwrite, maybe caused syslog lost.
+ Set 'n' if you don't want lost logs, but may harmful to preformance.
+
config SYSLOG_RPMSG_SERVER
bool "Enable RPMSG server for SYSLOG"
default n
diff --git a/drivers/syslog/syslog_rpmsg.c b/drivers/syslog/syslog_rpmsg.c
index 54ce570..d339729 100644
--- a/drivers/syslog/syslog_rpmsg.c
+++ b/drivers/syslog/syslog_rpmsg.c
@@ -63,6 +63,8 @@ struct syslog_rpmsg_s
bool suspend;
bool transfer; /* The transfer flag */
ssize_t trans_len; /* The data length when transfer */
+
+ sem_t sem;
};
/****************************************************************************
@@ -147,32 +149,53 @@ static void syslog_rpmsg_work(FAR void *priv_)
static void syslog_rpmsg_putchar(FAR struct syslog_rpmsg_s *priv, int ch,
bool last)
{
- priv->buffer[priv->head] = ch & 0xff;
+ size_t next;
- priv->head += 1;
- if (priv->head >= (priv->size))
+ while (1)
{
- priv->head = 0;
- }
+ next = priv->head + 1;
+ if (next >= priv->size)
+ {
+ next = 0;
+ }
- /* Allow overwrite */
+ if (next == priv->tail)
+ {
+#ifndef SYSLOG_RPMSG_OVERWRITE
+ if (!up_interrupt_context() && !sched_idletask())
+ {
+ nxsem_wait(&priv->sem);
+ }
+ else
+#endif
+ {
+ /* Overwrite */
- if (priv->head == (priv->tail))
- {
- priv->buffer[priv->tail] = 0;
+ priv->buffer[priv->tail] = 0;
+ priv->tail += 1;
- priv->tail += 1;
- if (priv->tail >= priv->size)
- {
- priv->tail = 0;
- }
+ if (priv->tail >= priv->size)
+ {
+ priv->tail = 0;
+ }
+
+ if (priv->transfer)
+ {
+ priv->trans_len--;
+ }
- if (priv->transfer)
+ break;
+ }
+ }
+ else
{
- priv->trans_len--;
+ break;
}
}
+ priv->buffer[priv->head] = ch & 0xff;
+ priv->head = next;
+
if (last && !priv->suspend && !priv->transfer &&
is_rpmsg_ept_ready(&priv->ept))
{
@@ -246,6 +269,7 @@ static int syslog_rpmsg_ept_cb(FAR struct rpmsg_endpoint *ept,
{
irqstate_t flags;
ssize_t len_end;
+ int sval;
flags = enter_critical_section();
@@ -268,6 +292,12 @@ static int syslog_rpmsg_ept_cb(FAR struct rpmsg_endpoint *ept,
{
priv->tail -= priv->size;
}
+
+ nxsem_get_value(&priv->sem, &sval);
+ while (sval++ < 0)
+ {
+ nxsem_post(&priv->sem);
+ }
}
priv->transfer = false;
@@ -338,6 +368,9 @@ void syslog_rpmsg_init_early(FAR void *buffer, size_t size)
char cur;
size_t i;
+ nxsem_init(&priv->sem, 0, 0);
+ nxsem_set_protocol(&priv->sem, SEM_PRIO_NONE);
+
priv->buffer = buffer;
priv->size = size;