Skip to content

Commit

Permalink
sched/pthread/barrierwait: replace syscall(2) to kernel api
Browse files Browse the repository at this point in the history
syscall(2) cannot be called from kernel space

Signed-off-by: chao an <[email protected]>
  • Loading branch information
anchao committed Oct 24, 2023
1 parent 24bc270 commit bb8ca29
Showing 1 changed file with 29 additions and 33 deletions.
62 changes: 29 additions & 33 deletions sched/pthread/pthread_barrierwait.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>

Expand Down Expand Up @@ -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;
}
Expand All @@ -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 */
Expand All @@ -110,41 +110,37 @@ 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 */

leave_critical_section(flags);
return PTHREAD_BARRIER_SERIAL_THREAD;
}
else
{
/* Otherwise, this thread must wait as well */

while (sem_wait(&barrier->sem) != OK)
{
/* 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;
}
}
/* Otherwise, this thread must wait as well */

/* 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.
*/
while ((ret = nxsem_wait(&barrier->sem)) != OK)
{
/* If the thread is awakened by a signal, just continue to wait */

leave_critical_section(flags);
return 0;
}
if (ret != -EINTR)
{
/* 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.
*/

leave_critical_section(flags);
return -ret;
}

0 comments on commit bb8ca29

Please sign in to comment.