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


The following commit(s) were added to refs/heads/master by this push:
     new cdec5c80c2 sched/pthread/barrierwait: replace syscall(2) to kernel api
cdec5c80c2 is described below

commit cdec5c80c20042040fc90170f625be2177dfa276
Author: chao an <anc...@xiaomi.com>
AuthorDate: Tue Oct 24 22:16:00 2023 +0800

    sched/pthread/barrierwait: replace syscall(2) to kernel api
    
    syscall(2) cannot be called from kernel space
    
    Signed-off-by: chao an <anc...@xiaomi.com>
---
 sched/pthread/pthread_barrierwait.c | 56 +++++++++++++++++--------------------
 1 file changed, 26 insertions(+), 30 deletions(-)

diff --git a/sched/pthread/pthread_barrierwait.c 
b/sched/pthread/pthread_barrierwait.c
index add1748b56..169e247da1 100644
--- a/sched/pthread/pthread_barrierwait.c
+++ b/sched/pthread/pthread_barrierwait.c
@@ -25,8 +25,8 @@
 #include <nuttx/config.h>
 
 #include <nuttx/irq.h>
+#include <nuttx/semaphore.h>
 #include <pthread.h>
-#include <semaphore.h>
 #include <errno.h>
 #include <debug.h>
 
@@ -80,11 +80,11 @@
 
 int pthread_barrier_wait(FAR pthread_barrier_t *barrier)
 {
-  int semcount;
-  int ret = OK;
   irqstate_t flags;
+  int semcount;
+  int ret;
 
-  if (!barrier)
+  if (barrier == NULL)
     {
       return EINVAL;
     }
@@ -95,11 +95,11 @@ int pthread_barrier_wait(FAR pthread_barrier_t *barrier)
 
   /* Find out how many threads are already waiting at the barrier */
 
-  ret = sem_getvalue(&barrier->sem, &semcount);
+  ret = nxsem_get_value(&barrier->sem, &semcount);
   if (ret != OK)
     {
       leave_critical_section(flags);
-      return get_errno();
+      return -ret;
     }
 
   /* If the number of waiters would be equal to the count, then we are done */
@@ -110,8 +110,8 @@ int pthread_barrier_wait(FAR pthread_barrier_t *barrier)
 
       while (semcount < 0)
         {
-          sem_post(&barrier->sem);
-          sem_getvalue(&barrier->sem, &semcount);
+          nxsem_post(&barrier->sem);
+          nxsem_get_value(&barrier->sem, &semcount);
         }
 
       /* Then return PTHREAD_BARRIER_SERIAL_THREAD to the final thread */
@@ -119,32 +119,28 @@ int pthread_barrier_wait(FAR pthread_barrier_t *barrier)
       leave_critical_section(flags);
       return PTHREAD_BARRIER_SERIAL_THREAD;
     }
-  else
+
+  /* Otherwise, this thread must wait as well */
+
+  while ((ret = nxsem_wait(&barrier->sem)) != OK)
     {
-      /* Otherwise, this thread must wait as well */
+      /* If the thread is awakened by a signal, just continue to wait */
 
-      while (sem_wait(&barrier->sem) != OK)
+      if (ret != -EINTR)
         {
-          /* If the thread is awakened by a signal, just continue to wait */
-
-          int errornumber = get_errno();
-          if (errornumber != EINTR)
-            {
-              /* If it is awakened by some other error, then there is a
-               * problem
-               */
-
-              leave_critical_section(flags);
-              return errornumber;
-            }
+          /* If it is awakened by some other error, then there is a
+           * problem
+           */
+
+          break;
         }
+    }
 
-      /* We will only get here when we are one of the N-1 threads that were
-       * waiting for the final thread at the barrier.  We just need to return
-       * zero.
-       */
+  /* We will only get here when we are one of the N-1 threads that were
+   * waiting for the final thread at the barrier.  We just need to return
+   * zero.
+   */
 
-      leave_critical_section(flags);
-      return 0;
-    }
+  leave_critical_section(flags);
+  return -ret;
 }

Reply via email to