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 <[email protected]> AuthorDate: Tue Dec 7 22:40:00 2021 +0800 syslog_rpmsg: update syslog_rpmsg to support non-overwrite Signed-off-by: ligd <[email protected]> --- 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;
