xiaoxiang781216 commented on a change in pull request #3050:
URL: https://github.com/apache/incubator-nuttx/pull/3050#discussion_r599773118



##########
File path: drivers/syslog/syslog_channel.c
##########
@@ -135,14 +139,82 @@ static int syslog_default_putc(int ch)
 
 int syslog_channel(FAR const struct syslog_channel_s *channel)
 {
+#if (CONFIG_SYSLOG_MAX_CHANNELS != 1)
+  int i;
+#endif
+
   DEBUGASSERT(channel != NULL);
 
   if (channel != NULL)
     {
       DEBUGASSERT(channel->sc_putc != NULL && channel->sc_force != NULL);
 
-      g_syslog_channel = channel;
+#if (CONFIG_SYSLOG_MAX_CHANNELS == 1)
+      g_syslog_channel[0] = channel;
       return OK;
+#else
+      for (i = 0; i < CONFIG_SYSLOG_MAX_CHANNELS; i++)
+        {
+          if (g_syslog_channel[i] == NULL)
+            {
+              g_syslog_channel[i] = channel;
+              return OK;
+            }
+          else if (g_syslog_channel[i] == channel)
+            {
+              return OK;
+            }
+        }
+#endif
+    }
+
+  return -EINVAL;
+}
+
+/****************************************************************************
+ * Name: syslog_channel_remove
+ *
+ * Description:
+ *   Removes an already configured SYSLOG channel from the list of used
+ *   channels.
+ *
+ * Input Parameters:
+ *   channel - Provides the interface to the channel to be removed.
+ *
+ * Returned Value:
+ *   Zero (OK) is returned on success.  A negated errno value is returned
+ *   on any failure.
+ *
+ ****************************************************************************/
+
+int syslog_channel_remove(FAR const struct syslog_channel_s *channel)

Review comment:
       
   > Interestingly enough, the issue persists (I would expect the output to be 
OK now, too).
   > I haven't managed to follow the code, and how this is caused.
   > 
   > In any case though, I would expect the system logger to be thread-safe 
under all circumstances...
   
   it depends on how you define thread-safe. The default behaviour doesn't 
cause the hang or lose the data.
   
   > I would insist that a semaphore has to be added to all the public 
functions of the syslog.
   
   No, you can't use semaphore here, syslog can be called from interrupt 
context.
   
   > I am not sure if this is now the issue, but the buffered syslog output is 
surely to have problem too.
   > 
   > If the output string is longer than `CONFIG_IOB_BUFSIZE`, then the buffer 
will be outputed prematurely, causing the exact same race condition as without 
buffer.
   > 
   > The fact that the buffer may be flushed before the whole syslog message 
has been written to it, defeats completely its puprose...
   
   Yes, if your output is longer than CONFIG_IOB_BUFSIZE, the buffer has to be 
flushed in the middle.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


Reply via email to