[PATCH 1/2] posix: Move clock_nanosleep()
Joel Sherrill
joel at rtems.org
Mon May 17 15:05:18 UTC 2021
You are free to relicense to BSD-2 if it looks clean.
Why doesn't per item compilation and linking avoid this dependency?
It looks OK otherwise.
On Mon, May 17, 2021 at 10:01 AM Sebastian Huber <
sebastian.huber at embedded-brains.de> wrote:
> Move clock_nanosleep() to a separate file to avoid a dependency on errno
> which pulls in the Newlib reentrancy support.
> ---
> cpukit/Makefile.am | 1 +
> cpukit/posix/src/clocknanosleep.c | 116 ++++++++++++++++++++++++++++++
> cpukit/posix/src/nanosleep.c | 91 -----------------------
> spec/build/cpukit/librtemscpu.yml | 1 +
> 4 files changed, 118 insertions(+), 91 deletions(-)
> create mode 100644 cpukit/posix/src/clocknanosleep.c
>
> diff --git a/cpukit/Makefile.am b/cpukit/Makefile.am
> index 0178d5d82a..a5f3a9665f 100644
> --- a/cpukit/Makefile.am
> +++ b/cpukit/Makefile.am
> @@ -490,6 +490,7 @@ librtemscpu_a_SOURCES += posix/src/cleanuppush.c
> librtemscpu_a_SOURCES += posix/src/clockgetcpuclockid.c
> librtemscpu_a_SOURCES += posix/src/clockgetres.c
> librtemscpu_a_SOURCES += posix/src/clockgettime.c
> +librtemscpu_a_SOURCES += posix/src/clocknanosleep.c
> librtemscpu_a_SOURCES += posix/src/clocksettime.c
> librtemscpu_a_SOURCES += posix/src/condattrdestroy.c
> librtemscpu_a_SOURCES += posix/src/condattrgetclock.c
> diff --git a/cpukit/posix/src/clocknanosleep.c
> b/cpukit/posix/src/clocknanosleep.c
> new file mode 100644
> index 0000000000..73b7d9c6a1
> --- /dev/null
> +++ b/cpukit/posix/src/clocknanosleep.c
> @@ -0,0 +1,116 @@
> +/**
> + * @file
> + *
> + * @ingroup POSIXAPI
> + *
> + * @brief Suspends Execution of calling thread until Time elapses
> + */
> +
> +/*
> + * COPYRIGHT (c) 1989-2015.
> + * On-Line Applications Research Corporation (OAR).
> + *
> + * Copyright (c) 2016. Gedare Bloom.
> + *
> + * The license and distribution terms for this file may be
> + * found in the file LICENSE in this distribution or at
> + * http://www.rtems.org/license/LICENSE.
> + */
> +
> +#ifdef HAVE_CONFIG_H
> +#include "config.h"
> +#endif
> +
> +#include <time.h>
> +
> +#include <rtems/score/threadimpl.h>
> +#include <rtems/score/threadqimpl.h>
> +#include <rtems/score/timespec.h>
> +#include <rtems/score/timecounter.h>
> +#include <rtems/score/watchdogimpl.h>
> +#include <rtems/posix/posixapi.h>
> +
> +static Thread_queue_Control _Nanosleep_Pseudo_queue =
> + THREAD_QUEUE_INITIALIZER( "Nanosleep" );
> +
> +/*
> + * High Resolution Sleep with Specifiable Clock, IEEE Std 1003.1, 2001
> + */
> +int clock_nanosleep(
> + clockid_t clock_id,
> + int flags,
> + const struct timespec *rqtp,
> + struct timespec *rmtp
> +)
> +{
> + Thread_queue_Context queue_context;
> + struct timespec uptime;
> + const struct timespec *end;
> + Thread_Control *executing;
> + int eno;
> +
> + if ( clock_id != CLOCK_REALTIME && clock_id != CLOCK_MONOTONIC ) {
> + return ENOTSUP;
> + }
> +
> + _Thread_queue_Context_initialize( &queue_context );
> + _Thread_queue_Context_set_thread_state(
> + &queue_context,
> + STATES_WAITING_FOR_TIME | STATES_INTERRUPTIBLE_BY_SIGNAL
> + );
> +
> + if ( ( flags & TIMER_ABSTIME ) != 0 ) {
> + end = rqtp;
> +
> + if ( clock_id == CLOCK_REALTIME ) {
> + _Thread_queue_Context_set_enqueue_timeout_realtime_timespec(
> + &queue_context,
> + end
> + );
> + } else {
> + _Thread_queue_Context_set_enqueue_timeout_monotonic_timespec(
> + &queue_context,
> + end
> + );
> + }
> + } else {
> + _Timecounter_Nanouptime( &uptime );
> + end = _Watchdog_Future_timespec( &uptime, rqtp );
> + _Thread_queue_Context_set_enqueue_timeout_monotonic_timespec(
> + &queue_context,
> + end
> + );
> + }
> +
> + _Thread_queue_Acquire( &_Nanosleep_Pseudo_queue, &queue_context );
> + executing = _Thread_Executing;
> + _Thread_queue_Enqueue(
> + &_Nanosleep_Pseudo_queue.Queue,
> + &_Thread_queue_Operations_FIFO,
> + executing,
> + &queue_context
> + );
> + eno = _POSIX_Get_error_after_wait( executing );
> +
> + if ( eno == ETIMEDOUT ) {
> + eno = 0;
> + }
> +
> + if ( rmtp != NULL && ( flags & TIMER_ABSTIME ) == 0 ) {
> + if ( eno == EINTR ) {
> + struct timespec actual_end;
> +
> + _Timecounter_Nanouptime( &actual_end );
> +
> + if ( _Timespec_Less_than( &actual_end, end ) ) {
> + _Timespec_Subtract( &actual_end, end, rmtp );
> + } else {
> + _Timespec_Set_to_zero( rmtp );
> + }
> + } else {
> + _Timespec_Set_to_zero( rmtp );
> + }
> + }
> +
> + return eno;
> +}
> diff --git a/cpukit/posix/src/nanosleep.c b/cpukit/posix/src/nanosleep.c
> index 8d1a4b84e4..167dcbc787 100644
> --- a/cpukit/posix/src/nanosleep.c
> +++ b/cpukit/posix/src/nanosleep.c
> @@ -23,17 +23,8 @@
>
> #include <time.h>
>
> -#include <rtems/score/threadimpl.h>
> -#include <rtems/score/threadqimpl.h>
> -#include <rtems/score/timespec.h>
> -#include <rtems/score/timecounter.h>
> -#include <rtems/score/watchdogimpl.h>
> -#include <rtems/posix/posixapi.h>
> #include <rtems/seterr.h>
>
> -static Thread_queue_Control _Nanosleep_Pseudo_queue =
> - THREAD_QUEUE_INITIALIZER( "Nanosleep" );
> -
> /*
> * 14.2.5 High Resolution Sleep, P1003.1b-1993, p. 269
> */
> @@ -52,85 +43,3 @@ int nanosleep(
>
> return eno;
> }
> -
> -/*
> - * High Resolution Sleep with Specifiable Clock, IEEE Std 1003.1, 2001
> - */
> -int clock_nanosleep(
> - clockid_t clock_id,
> - int flags,
> - const struct timespec *rqtp,
> - struct timespec *rmtp
> -)
> -{
> - Thread_queue_Context queue_context;
> - struct timespec uptime;
> - const struct timespec *end;
> - Thread_Control *executing;
> - int eno;
> -
> - if ( clock_id != CLOCK_REALTIME && clock_id != CLOCK_MONOTONIC ) {
> - return ENOTSUP;
> - }
> -
> - _Thread_queue_Context_initialize( &queue_context );
> - _Thread_queue_Context_set_thread_state(
> - &queue_context,
> - STATES_WAITING_FOR_TIME | STATES_INTERRUPTIBLE_BY_SIGNAL
> - );
> -
> - if ( ( flags & TIMER_ABSTIME ) != 0 ) {
> - end = rqtp;
> -
> - if ( clock_id == CLOCK_REALTIME ) {
> - _Thread_queue_Context_set_enqueue_timeout_realtime_timespec(
> - &queue_context,
> - end
> - );
> - } else {
> - _Thread_queue_Context_set_enqueue_timeout_monotonic_timespec(
> - &queue_context,
> - end
> - );
> - }
> - } else {
> - _Timecounter_Nanouptime( &uptime );
> - end = _Watchdog_Future_timespec( &uptime, rqtp );
> - _Thread_queue_Context_set_enqueue_timeout_monotonic_timespec(
> - &queue_context,
> - end
> - );
> - }
> -
> - _Thread_queue_Acquire( &_Nanosleep_Pseudo_queue, &queue_context );
> - executing = _Thread_Executing;
> - _Thread_queue_Enqueue(
> - &_Nanosleep_Pseudo_queue.Queue,
> - &_Thread_queue_Operations_FIFO,
> - executing,
> - &queue_context
> - );
> - eno = _POSIX_Get_error_after_wait( executing );
> -
> - if ( eno == ETIMEDOUT ) {
> - eno = 0;
> - }
> -
> - if ( rmtp != NULL && ( flags & TIMER_ABSTIME ) == 0 ) {
> - if ( eno == EINTR ) {
> - struct timespec actual_end;
> -
> - _Timecounter_Nanouptime( &actual_end );
> -
> - if ( _Timespec_Less_than( &actual_end, end ) ) {
> - _Timespec_Subtract( &actual_end, end, rmtp );
> - } else {
> - _Timespec_Set_to_zero( rmtp );
> - }
> - } else {
> - _Timespec_Set_to_zero( rmtp );
> - }
> - }
> -
> - return eno;
> -}
> diff --git a/spec/build/cpukit/librtemscpu.yml
> b/spec/build/cpukit/librtemscpu.yml
> index 682032182f..efd0d1bfe1 100644
> --- a/spec/build/cpukit/librtemscpu.yml
> +++ b/spec/build/cpukit/librtemscpu.yml
> @@ -990,6 +990,7 @@ source:
> - cpukit/posix/src/clockgetcpuclockid.c
> - cpukit/posix/src/clockgetres.c
> - cpukit/posix/src/clockgettime.c
> +- cpukit/posix/src/clocknanosleep.c
> - cpukit/posix/src/clocksettime.c
> - cpukit/posix/src/condattrdestroy.c
> - cpukit/posix/src/condattrgetclock.c
> --
> 2.26.2
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20210517/37c2a5a9/attachment.html>
More information about the devel
mailing list