[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