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;