forked from Imagelibrary/rtems
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
35
testsuites/psxtests/psxhdrs/time/clock_nanosleep.c
Normal file
35
testsuites/psxtests/psxhdrs/time/clock_nanosleep.c
Normal 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;
|
||||
}
|
||||
@@ -7,6 +7,9 @@ SUBDIRS += psxtmbarrier01
|
||||
SUBDIRS += psxtmbarrier02
|
||||
SUBDIRS += psxtmbarrier03
|
||||
SUBDIRS += psxtmbarrier04
|
||||
SUBDIRS += psxtmclocknanosleep01
|
||||
SUBDIRS += psxtmclocknanosleep02
|
||||
SUBDIRS += psxtmclocknanosleep03
|
||||
SUBDIRS += psxtmcond01
|
||||
SUBDIRS += psxtmcond02
|
||||
SUBDIRS += psxtmcond03
|
||||
|
||||
@@ -81,6 +81,9 @@ psxtmbarrier01/Makefile
|
||||
psxtmbarrier02/Makefile
|
||||
psxtmbarrier03/Makefile
|
||||
psxtmbarrier04/Makefile
|
||||
psxtmclocknanosleep01/Makefile
|
||||
psxtmclocknanosleep02/Makefile
|
||||
psxtmclocknanosleep03/Makefile
|
||||
psxtmcond01/Makefile
|
||||
psxtmcond02/Makefile
|
||||
psxtmcond03/Makefile
|
||||
|
||||
25
testsuites/psxtmtests/psxtmclocknanosleep01/Makefile.am
Normal file
25
testsuites/psxtmtests/psxtmclocknanosleep01/Makefile.am
Normal 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
|
||||
59
testsuites/psxtmtests/psxtmclocknanosleep01/init.c
Normal file
59
testsuites/psxtmtests/psxtmclocknanosleep01/init.c
Normal 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 */
|
||||
@@ -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
|
||||
|
||||
|
||||
25
testsuites/psxtmtests/psxtmclocknanosleep02/Makefile.am
Normal file
25
testsuites/psxtmtests/psxtmclocknanosleep02/Makefile.am
Normal 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
|
||||
109
testsuites/psxtmtests/psxtmclocknanosleep02/init.c
Normal file
109
testsuites/psxtmtests/psxtmclocknanosleep02/init.c
Normal 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 */
|
||||
@@ -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
|
||||
25
testsuites/psxtmtests/psxtmclocknanosleep03/Makefile.am
Normal file
25
testsuites/psxtmtests/psxtmclocknanosleep03/Makefile.am
Normal 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
|
||||
114
testsuites/psxtmtests/psxtmclocknanosleep03/init.c
Normal file
114
testsuites/psxtmtests/psxtmclocknanosleep03/init.c
Normal 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 */
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user