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 <[email protected]>
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 <[email protected]>
---
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;
}