posix: add clock_nanosleep and tests

updates #2732
This commit is contained in:
Gedare Bloom
2016-06-09 11:40:35 -04:00
parent f23d470616
commit 6e98ea9157
14 changed files with 477 additions and 9 deletions

View File

@@ -8,6 +8,8 @@
/*
* 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
@@ -30,12 +32,10 @@
static Thread_queue_Control _Nanosleep_Pseudo_queue =
THREAD_QUEUE_INITIALIZER( "Nanosleep" );
/*
* 14.2.5 High Resolution Sleep, P1003.1b-1993, p. 269
*/
int nanosleep(
static inline int nanosleep_helper(
const struct timespec *rqtp,
struct timespec *rmtp
struct timespec *rmtp,
Watchdog_Discipline discipline
)
{
/*
@@ -57,7 +57,7 @@ int nanosleep(
* FSU and GNU/Linux pthreads shares this behavior.
*/
if ( !_Timespec_Is_valid( rqtp ) )
rtems_set_errno_and_return_minus_one( EINVAL );
return EINVAL;
/*
* Convert the timespec delay into the appropriate number of clock ticks.
@@ -93,7 +93,7 @@ int nanosleep(
executing,
STATES_DELAYING | STATES_INTERRUPTIBLE_BY_SIGNAL,
ticks,
WATCHDOG_RELATIVE,
discipline,
1
);
@@ -110,7 +110,7 @@ int nanosleep(
/*
* If the user wants the time remaining, do the conversion.
*/
if ( rmtp ) {
if ( rmtp && discipline == WATCHDOG_RELATIVE ) {
_Timespec_From_ticks( ticks, rmtp );
}
@@ -122,8 +122,45 @@ int nanosleep(
* If there is time remaining, then we were interrupted by a signal.
*/
if ( ticks )
rtems_set_errno_and_return_minus_one( EINTR );
return EINTR;
#endif
return 0;
}
/*
* 14.2.5 High Resolution Sleep, P1003.1b-1993, p. 269
*/
int nanosleep(
const struct timespec *rqtp,
struct timespec *rmtp
)
{
int err = nanosleep_helper(rqtp, rmtp, WATCHDOG_RELATIVE);
if (err) {
rtems_set_errno_and_return_minus_one( err );
}
return 0;
}
/*
* 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
)
{
int err = 0;
if ( clock_id == CLOCK_REALTIME || clock_id == CLOCK_MONOTONIC ) {
if ( flags & TIMER_ABSTIME ) {
err = nanosleep_helper(rqtp, rmtp, WATCHDOG_ABSOLUTE);
} else {
err = nanosleep_helper(rqtp, rmtp, WATCHDOG_RELATIVE);
}
} else {
err = ENOTSUP;
}
return err;
}

View File

@@ -95,6 +95,7 @@ lib_a_SOURCES += time/clock.c
lib_a_SOURCES += time/clock_getcpuclockid.c
lib_a_SOURCES += time/clock_getres.c
lib_a_SOURCES += time/clock_gettime.c
lib_a_SOURCES += time/clock_nanosleep.c
lib_a_SOURCES += time/clock_settime.c
lib_a_SOURCES += time/ctime.c
lib_a_SOURCES += time/ctime_r.c

View File

@@ -0,0 +1,35 @@
/*
* This test file is used to verify that the header files associated with
* invoking this function are correct.
*
* 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>
#ifndef _POSIX_TIMERS
#error "rtems is supposed to have clock_nanosleep"
#endif
int test( void );
int test( void )
{
struct timespec rqtp;
struct timespec rmtp;
int result;
rqtp.tv_sec = 0;
rqtp.tv_nsec = 0;
result = clock_nanosleep( CLOCK_REALTIME, 0, &rqtp, &rmtp );
return result;
}

View File

@@ -7,6 +7,9 @@ SUBDIRS += psxtmbarrier01
SUBDIRS += psxtmbarrier02
SUBDIRS += psxtmbarrier03
SUBDIRS += psxtmbarrier04
SUBDIRS += psxtmclocknanosleep01
SUBDIRS += psxtmclocknanosleep02
SUBDIRS += psxtmclocknanosleep03
SUBDIRS += psxtmcond01
SUBDIRS += psxtmcond02
SUBDIRS += psxtmcond03

View File

@@ -81,6 +81,9 @@ psxtmbarrier01/Makefile
psxtmbarrier02/Makefile
psxtmbarrier03/Makefile
psxtmbarrier04/Makefile
psxtmclocknanosleep01/Makefile
psxtmclocknanosleep02/Makefile
psxtmclocknanosleep03/Makefile
psxtmcond01/Makefile
psxtmcond02/Makefile
psxtmcond03/Makefile

View File

@@ -0,0 +1,25 @@
rtems_tests_PROGRAMS = psxtmclocknanosleep01
psxtmclocknanosleep01_SOURCES = init.c ../../tmtests/include/timesys.h \
../../support/src/tmtests_empty_function.c \
../../support/src/tmtests_support.c
dist_rtems_tests_DATA = psxtmclocknanosleep01.doc
include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
include $(top_srcdir)/../automake/compile.am
include $(top_srcdir)/../automake/leaf.am
OPERATION_COUNT = @OPERATION_COUNT@
AM_CPPFLAGS += -I$(top_srcdir)/../tmtests/include
AM_CPPFLAGS += -DOPERATION_COUNT=$(OPERATION_COUNT)
AM_CPPFLAGS += -I$(top_srcdir)/../support/include
LINK_OBJS = $(psxtmclocknanosleep01_OBJECTS)
LINK_LIBS = $(psxtmclocknanosleep01_LDLIBS)
psxtmclocknanosleep01$(EXEEXT): $(psxtmclocknanosleep01_OBJECTS) $(psxtmclocknanosleep01_DEPENDENCIES)
@rm -f psxtmclocknanosleep01$(EXEEXT)
$(make-exe)
include $(top_srcdir)/../automake/local.am

View File

@@ -0,0 +1,59 @@
/*
* COPYRIGHT (c) 1989-2013.
* 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 <timesys.h>
#include <rtems/btimer.h>
#include "test_support.h"
const char rtems_test_name[] = "PSXTMCLOCKNANOSLEEP 01";
/* forward declarations to avoid warnings */
void *POSIX_Init(void *argument);
void *POSIX_Init(
void *argument
)
{
benchmark_timer_t end_time;
struct timespec sleepTime;
sleepTime.tv_sec = 0;
sleepTime.tv_nsec = 0;
TEST_BEGIN();
benchmark_timer_initialize();
clock_nanosleep( CLOCK_REALTIME, 0, &sleepTime, (struct timespec *) NULL );
end_time = benchmark_timer_read();
put_time( "nanosleep: yield", end_time, 1, 0, 0 );
TEST_END();
rtems_test_exit(0);
}
/* configuration information */
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
#define CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER
#define CONFIGURE_MAXIMUM_POSIX_THREADS 1
#define CONFIGURE_POSIX_INIT_THREAD_TABLE
#define CONFIGURE_INIT
#include <rtems/confdefs.h>
/* end of file */

View File

@@ -0,0 +1,12 @@
# Copyright 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.
#
This test benchmarks the following operations:
+ Benchmark a call to clock_nanosleep() which yields

View File

@@ -0,0 +1,25 @@
rtems_tests_PROGRAMS = psxtmclocknanosleep02
psxtmclocknanosleep02_SOURCES = init.c ../../tmtests/include/timesys.h \
../../support/src/tmtests_empty_function.c \
../../support/src/tmtests_support.c
dist_rtems_tests_DATA = psxtmclocknanosleep02.doc
include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
include $(top_srcdir)/../automake/compile.am
include $(top_srcdir)/../automake/leaf.am
OPERATION_COUNT = @OPERATION_COUNT@
AM_CPPFLAGS += -I$(top_srcdir)/../tmtests/include
AM_CPPFLAGS += -DOPERATION_COUNT=$(OPERATION_COUNT)
AM_CPPFLAGS += -I$(top_srcdir)/../support/include
LINK_OBJS = $(psxtmclocknanosleep02_OBJECTS)
LINK_LIBS = $(psxtmclocknanosleep02_LDLIBS)
psxtmclocknanosleep02$(EXEEXT): $(psxtmclocknanosleep02_OBJECTS) $(psxtmclocknanosleep02_DEPENDENCIES)
@rm -f psxtmclocknanosleep02$(EXEEXT)
$(make-exe)
include $(top_srcdir)/../automake/local.am

View File

@@ -0,0 +1,109 @@
/*
* COPYRIGHT (c) 1989-2013.
* 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 <timesys.h>
#include <rtems/btimer.h>
#include "test_support.h"
#include <pthread.h>
const char rtems_test_name[] = "PSXTMCLOCKNANOSLEEP 02";
/* forward declarations to avoid warnings */
void *POSIX_Init(void *argument);
void *Middle(void *argument);
void *Low(void *argument);
void *Low(
void *argument
)
{
benchmark_timer_t end_time;
end_time = benchmark_timer_read();
put_time(
"clock_nanosleep: blocking",
end_time,
OPERATION_COUNT,
0,
0
);
TEST_END();
rtems_test_exit( 0 );
return NULL;
}
void *Middle(
void *argument
)
{
/* calling nanosleep */
struct timespec sleepTime;
sleepTime.tv_sec = 0;
sleepTime.tv_nsec = 1;
clock_nanosleep(CLOCK_REALTIME, 0, &sleepTime, (struct timespec *) NULL);
return NULL;
}
void *POSIX_Init(
void *argument
)
{
int i;
int status;
pthread_t threadId;
struct timespec sleepTime;
struct timespec remainder;
sleepTime.tv_sec = 0;
sleepTime.tv_nsec = 1;
remainder.tv_sec = 0;
remainder.tv_nsec = 0;
TEST_BEGIN();
for ( i=0 ; i < OPERATION_COUNT - 1 ; i++ ) {
status = pthread_create( &threadId, NULL, Middle, NULL );
rtems_test_assert( !status );
}
status = pthread_create( &threadId, NULL, Low, NULL );
rtems_test_assert( !status );
/* start the timer and switch through all the other tasks */
benchmark_timer_initialize();
/* calling clock_nanosleep*/
clock_nanosleep(CLOCK_REALTIME, 0, &sleepTime, &remainder);
return NULL;
}
/* configuration information */
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
#define CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER
#define CONFIGURE_MAXIMUM_POSIX_THREADS OPERATION_COUNT + 2
#define CONFIGURE_POSIX_INIT_THREAD_TABLE
#define CONFIGURE_INIT
#include <rtems/confdefs.h>
/* end of file */

View File

@@ -0,0 +1,10 @@
# 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.
#
This test benchmarks the following operations:
+ clock_nanosleep - blocking

View File

@@ -0,0 +1,25 @@
rtems_tests_PROGRAMS = psxtmclocknanosleep03
psxtmclocknanosleep03_SOURCES = init.c ../../tmtests/include/timesys.h \
../../support/src/tmtests_empty_function.c \
../../support/src/tmtests_support.c
dist_rtems_tests_DATA = psxtmclocknanosleep03.doc
include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
include $(top_srcdir)/../automake/compile.am
include $(top_srcdir)/../automake/leaf.am
OPERATION_COUNT = @OPERATION_COUNT@
AM_CPPFLAGS += -I$(top_srcdir)/../tmtests/include
AM_CPPFLAGS += -DOPERATION_COUNT=$(OPERATION_COUNT)
AM_CPPFLAGS += -I$(top_srcdir)/../support/include
LINK_OBJS = $(psxtmclocknanosleep03_OBJECTS)
LINK_LIBS = $(psxtmclocknanosleep03_LDLIBS)
psxtmclocknanosleep03$(EXEEXT): $(psxtmclocknanosleep03_OBJECTS) $(psxtmclocknanosleep03_DEPENDENCIES)
@rm -f psxtmclocknanosleep03$(EXEEXT)
$(make-exe)
include $(top_srcdir)/../automake/local.am

View File

@@ -0,0 +1,114 @@
/*
* COPYRIGHT (c) 1989-2013.
* 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 <timesys.h>
#include <rtems/btimer.h>
#include "test_support.h"
#include <pthread.h>
const char rtems_test_name[] = "PSXTMCLOCKNANOSLEEP 03";
/* forward declarations to avoid warnings */
void *POSIX_Init(void *argument);
void *Middle(void *argument);
void *Low(void *argument);
void *Low(
void *argument
)
{
benchmark_timer_t end_time;
end_time = benchmark_timer_read();
put_time(
"clock_nanosleep: blocking",
end_time,
OPERATION_COUNT,
0,
0
);
TEST_END();
rtems_test_exit( 0 );
return NULL;
}
void *Middle(
void *argument
)
{
/* calling nanosleep */
struct timespec sleepTime;
sleepTime.tv_sec = 0;
sleepTime.tv_nsec = 1;
clock_nanosleep(
CLOCK_REALTIME,
TIMER_ABSTIME,
&sleepTime,
(struct timespec *) NULL
);
return NULL;
}
void *POSIX_Init(
void *argument
)
{
int i;
int status;
pthread_t threadId;
struct timespec sleepTime;
struct timespec remainder;
sleepTime.tv_sec = 0;
sleepTime.tv_nsec = 1;
remainder.tv_sec = 0;
remainder.tv_nsec = 0;
TEST_BEGIN();
for ( i=0 ; i < OPERATION_COUNT - 1 ; i++ ) {
status = pthread_create( &threadId, NULL, Middle, NULL );
rtems_test_assert( !status );
}
status = pthread_create( &threadId, NULL, Low, NULL );
rtems_test_assert( !status );
/* start the timer and switch through all the other tasks */
benchmark_timer_initialize();
/* calling clock_nanosleep*/
clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME, &sleepTime, &remainder);
return NULL;
}
/* configuration information */
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
#define CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER
#define CONFIGURE_MAXIMUM_POSIX_THREADS OPERATION_COUNT + 2
#define CONFIGURE_POSIX_INIT_THREAD_TABLE
#define CONFIGURE_INIT
#include <rtems/confdefs.h>
/* end of file */

View File

@@ -0,0 +1,10 @@
# 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.
#
This test benchmarks the following operations:
+ clock_nanosleep - blocking with TIMER_ABSTIME