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-apps.git


The following commit(s) were added to refs/heads/master by this push:
     new 648e25bac examples/pipe: Enhance test by different r/w thread priority
648e25bac is described below

commit 648e25bac137accc683f4b82c300070565ba6cb9
Author: Huang Qi <[email protected]>
AuthorDate: Tue May 14 18:03:36 2024 +0800

    examples/pipe: Enhance test by different r/w thread priority
    
    By arranging and combining the priorities of read and write
    threads to cover more usage scenarios.
    
    Signed-off-by: Huang Qi <[email protected]>
---
 examples/pipe/pipe.h          |  3 +-
 examples/pipe/pipe_main.c     | 68 ++++++++++++++++++++++++++++++++++++++-----
 examples/pipe/transfer_test.c | 32 +++++++++++++++++---
 3 files changed, 91 insertions(+), 12 deletions(-)

diff --git a/examples/pipe/pipe.h b/examples/pipe/pipe.h
index 304fb8e16..14931607a 100644
--- a/examples/pipe/pipe.h
+++ b/examples/pipe/pipe.h
@@ -48,7 +48,8 @@
  * Public Function Prototypes
  ****************************************************************************/
 
-extern int transfer_test(int fdin, int fdout);
+extern int transfer_test(int fdin, int fdout,
+                         int boost_reader, int boost_writer);
 extern int interlock_test(void);
 extern int redirection_test(void);
 
diff --git a/examples/pipe/pipe_main.c b/examples/pipe/pipe_main.c
index 697afe5f9..a8e85c696 100644
--- a/examples/pipe/pipe_main.c
+++ b/examples/pipe/pipe_main.c
@@ -137,7 +137,37 @@ int main(int argc, FAR char *argv[])
 
   /* Then perform the test using those file descriptors */
 
-  ret = transfer_test(fd[0], fd[1]);
+  ret = transfer_test(fd[0], fd[1], 0, 0);
+
+  if (ret != 0)
+    {
+      fprintf(stderr, "pipe_main: FIFO test FAILED (00) (%d)\n", ret);
+      return 6;
+    }
+
+  ret = transfer_test(fd[0], fd[1], 1, 0);
+
+  if (ret != 0)
+    {
+      fprintf(stderr, "pipe_main: FIFO test FAILED (10) (%d)\n", ret);
+      return 6;
+    }
+
+  ret = transfer_test(fd[0], fd[1], 0, 1);
+
+  if (ret != 0)
+    {
+      fprintf(stderr, "pipe_main: FIFO test FAILED (01)(%d)\n", ret);
+      return 6;
+    }
+
+  ret = transfer_test(fd[0], fd[1], 1, 1);
+
+  if (ret != 0)
+    {
+      fprintf(stderr, "pipe_main: FIFO test FAILED (11) (%d)\n", ret);
+      return 6;
+    }
 
   if (close(fd[0]) != 0)
     {
@@ -196,24 +226,48 @@ int main(int argc, FAR char *argv[])
 
   /* Then perform the test using those file descriptors */
 
-  ret = transfer_test(fd[0], fd[1]);
+  ret = transfer_test(fd[0], fd[1], 0, 0);
 
-  if (close(fd[0]) != 0)
+  if (ret != 0)
     {
-      fprintf(stderr, "pipe_main: close failed: %d\n", errno);
+      fprintf(stderr, "pipe_main: PIPE test FAILED (00) (%d)\n", ret);
+      return 9;
     }
 
-  if (close(fd[1]) != 0)
+  ret = transfer_test(fd[0], fd[1], 1, 0);
+
+  if (ret != 0)
     {
-      fprintf(stderr, "pipe_main: close failed: %d\n", errno);
+      fprintf(stderr, "pipe_main: PIPE test FAILED (10) (%d)\n", ret);
+      return 9;
+    }
+
+  ret = transfer_test(fd[0], fd[1], 0, 1);
+
+  if (ret != 0)
+    {
+      fprintf(stderr, "pipe_main: PIPE test FAILED (01) (%d)\n", ret);
+      return 9;
     }
 
+  ret = transfer_test(fd[0], fd[1], 1, 1);
+
   if (ret != 0)
     {
-      fprintf(stderr, "pipe_main: PIPE test FAILED (%d)\n", ret);
+      fprintf(stderr, "pipe_main: PIPE test FAILED (11) (%d)\n", ret);
       return 9;
     }
 
+  if (close(fd[0]) != 0)
+    {
+      fprintf(stderr, "pipe_main: close failed: %d\n", errno);
+    }
+
+  if (close(fd[1]) != 0)
+    {
+      fprintf(stderr, "pipe_main: close failed: %d\n", errno);
+    }
+
   /* Perform the pipe redirection test */
 
   fprintf(stderr, "\npipe_main: Performing redirection test\n");
diff --git a/examples/pipe/transfer_test.c b/examples/pipe/transfer_test.c
index fcba4413b..a7ae26d11 100644
--- a/examples/pipe/transfer_test.c
+++ b/examples/pipe/transfer_test.c
@@ -176,21 +176,34 @@ static void *transfer_writer(pthread_addr_t pvarg)
  * Name: transfer_test
  ****************************************************************************/
 
-int transfer_test(int fdin, int fdout)
+int transfer_test(int fdin, int fdout, int boost_reader, int boost_writer)
 {
   pthread_t readerid;
   pthread_t writerid;
+  pthread_attr_t rattr;
+  pthread_attr_t wattr;
   void *value;
   int tmp;
   int ret;
 
   printf("transfer_test: fdin=%d fdout=%d\n", fdin, fdout);
 
+  /* Boost the priority of reader or writer on need */
+
+  pthread_attr_init(&rattr);
+  if (boost_reader)
+    {
+      rattr.priority += 1;
+      printf("transfer_test: Boost priority of transfer_reader"
+             "thread to %d\n", rattr.priority);
+    }
+
   /* Start transfer_reader thread */
 
   printf("transfer_test: Starting transfer_reader thread\n");
-  ret = pthread_create(&readerid, NULL, \
+  ret = pthread_create(&readerid, &rattr,
         transfer_reader, (void *)(intptr_t)fdin);
+  pthread_attr_destroy(&rattr);
   if (ret != 0)
     {
         fprintf(stderr, \
@@ -199,11 +212,22 @@ int transfer_test(int fdin, int fdout)
       return 1;
     }
 
+  /* Boost the priority of reader or writer on need */
+
+  pthread_attr_init(&wattr);
+  if (boost_writer)
+    {
+      wattr.priority += 1;
+      printf("transfer_test: Boost priority of transfer_writer"
+             "thread to %d\n", wattr.priority);
+    }
+
   /* Start transfer_writer thread */
 
   printf("transfer_test: Starting transfer_writer thread\n");
-  ret = pthread_create(&writerid, \
-        NULL, transfer_writer, (void *)(intptr_t)fdout);
+  ret = pthread_create(&writerid, &wattr,
+        transfer_writer, (void *)(intptr_t)fdout);
+  pthread_attr_destroy(&wattr);
   if (ret != 0)
     {
       fprintf(stderr, \

Reply via email to