From c57d49f420c5f00098384ca9ceb7c6b4a65b3fc7 Mon Sep 17 00:00:00 2001 From: Jussi Kivilinna Date: Fri, 21 Apr 2017 08:51:31 -0600 Subject: [PATCH] clock: Add new type ssystime_t for relative 64-bit ticks, change ticks<->time conversion functions to use ssystime_t --- include/nuttx/clock.h | 8 ++++++++ sched/clock/clock.h | 7 ++++--- sched/clock/clock_abstime2ticks.c | 2 +- sched/clock/clock_ticks2time.c | 4 ++-- sched/clock/clock_time2ticks.c | 7 ++++--- sched/mqueue/mq_timedreceive.c | 2 +- sched/mqueue/mq_timedsend.c | 2 +- sched/pthread/pthread_condtimedwait.c | 2 +- sched/pthread/pthread_create.c | 4 ++-- sched/sched/sched_getparam.c | 6 ++++-- sched/sched/sched_setparam.c | 4 ++-- sched/sched/sched_setscheduler.c | 4 ++-- sched/semaphore/sem_timedwait.c | 2 +- sched/signal/sig_nanosleep.c | 8 ++++---- sched/timer/timer_gettime.c | 2 +- sched/timer/timer_settime.c | 12 ++++++++++-- 16 files changed, 48 insertions(+), 28 deletions(-) diff --git a/include/nuttx/clock.h b/include/nuttx/clock.h index ea418ee8c8..c6a1deafc5 100644 --- a/include/nuttx/clock.h +++ b/include/nuttx/clock.h @@ -199,6 +199,14 @@ typedef uint64_t systime_t; typedef uint32_t systime_t; #endif +/* This type used to hold relative ticks that may have negative value */ + +#ifdef CONFIG_SYSTEM_TIME64 +typedef int64_t ssystime_t; +#else +typedef int32_t ssystime_t; +#endif + /**************************************************************************** * Public Data ****************************************************************************/ diff --git a/sched/clock/clock.h b/sched/clock/clock.h index fb6e588e8c..7e6a1c0933 100644 --- a/sched/clock/clock.h +++ b/sched/clock/clock.h @@ -98,9 +98,10 @@ void weak_function clock_timer(void); int clock_abstime2ticks(clockid_t clockid, FAR const struct timespec *abstime, - FAR int *ticks); -int clock_time2ticks(FAR const struct timespec *reltime, FAR int *ticks); -int clock_ticks2time(int ticks, FAR struct timespec *reltime); + FAR ssystime_t *ticks); +int clock_time2ticks(FAR const struct timespec *reltime, + FAR ssystime_t *ticks); +int clock_ticks2time(ssystime_t ticks, FAR struct timespec *reltime); void clock_timespec_add(FAR const struct timespec *ts1, FAR const struct timespec *ts2, FAR struct timespec *ts3); diff --git a/sched/clock/clock_abstime2ticks.c b/sched/clock/clock_abstime2ticks.c index d21e706e39..5ac7081a20 100644 --- a/sched/clock/clock_abstime2ticks.c +++ b/sched/clock/clock_abstime2ticks.c @@ -99,7 +99,7 @@ static long compare_timespec(FAR const struct timespec *a, ****************************************************************************/ int clock_abstime2ticks(clockid_t clockid, FAR const struct timespec *abstime, - FAR int *ticks) + FAR ssystime_t *ticks) { struct timespec currtime; struct timespec reltime; diff --git a/sched/clock/clock_ticks2time.c b/sched/clock/clock_ticks2time.c index 33353193a8..899ecd9818 100644 --- a/sched/clock/clock_ticks2time.c +++ b/sched/clock/clock_ticks2time.c @@ -63,9 +63,9 @@ * ****************************************************************************/ -int clock_ticks2time(int ticks, FAR struct timespec *reltime) +int clock_ticks2time(ssystime_t ticks, FAR struct timespec *reltime) { - int remainder; + ssystime_t remainder; reltime->tv_sec = ticks / TICK_PER_SEC; remainder = ticks - TICK_PER_SEC * reltime->tv_sec; diff --git a/sched/clock/clock_time2ticks.c b/sched/clock/clock_time2ticks.c index 5bb613b61d..5f0bc28c40 100644 --- a/sched/clock/clock_time2ticks.c +++ b/sched/clock/clock_time2ticks.c @@ -67,7 +67,8 @@ * ****************************************************************************/ -int clock_time2ticks(FAR const struct timespec *reltime, FAR int *ticks) +int clock_time2ticks(FAR const struct timespec *reltime, + FAR ssystime_t *ticks) { #ifdef CONFIG_HAVE_LONG_LONG int64_t relnsec; @@ -83,7 +84,7 @@ int clock_time2ticks(FAR const struct timespec *reltime, FAR int *ticks) * that is greater than or equal to the exact number of tick. */ - *ticks = (int)((relnsec + NSEC_PER_TICK - 1) / NSEC_PER_TICK); + *ticks = (ssystime_t)((relnsec + NSEC_PER_TICK - 1) / NSEC_PER_TICK); return OK; #else int32_t relusec; @@ -110,7 +111,7 @@ int clock_time2ticks(FAR const struct timespec *reltime, FAR int *ticks) * that is greater than or equal to the exact number of tick. */ - *ticks = (int)((relusec + USEC_PER_TICK - 1) / USEC_PER_TICK); + *ticks = (ssystime_t)((relusec + USEC_PER_TICK - 1) / USEC_PER_TICK); return OK; #endif } diff --git a/sched/mqueue/mq_timedreceive.c b/sched/mqueue/mq_timedreceive.c index 9df2a6ab61..096f057c59 100644 --- a/sched/mqueue/mq_timedreceive.c +++ b/sched/mqueue/mq_timedreceive.c @@ -230,7 +230,7 @@ ssize_t mq_timedreceive(mqd_t mqdes, FAR char *msg, size_t msglen, if (mqdes->msgq->msglist.head == NULL) { - int ticks; + ssystime_t ticks; /* Convert the timespec to clock ticks. We must have interrupts * disabled here so that this time stays valid until the wait begins. diff --git a/sched/mqueue/mq_timedsend.c b/sched/mqueue/mq_timedsend.c index 83e25515eb..98f3221082 100644 --- a/sched/mqueue/mq_timedsend.c +++ b/sched/mqueue/mq_timedsend.c @@ -173,7 +173,7 @@ int mq_timedsend(mqd_t mqdes, FAR const char *msg, size_t msglen, int prio, FAR struct mqueue_inode_s *msgq; FAR struct mqueue_msg_s *mqmsg = NULL; irqstate_t flags; - int ticks; + ssystime_t ticks; int result; int ret = ERROR; diff --git a/sched/pthread/pthread_condtimedwait.c b/sched/pthread/pthread_condtimedwait.c index 22ce470770..98521665fd 100644 --- a/sched/pthread/pthread_condtimedwait.c +++ b/sched/pthread/pthread_condtimedwait.c @@ -169,7 +169,7 @@ int pthread_cond_timedwait(FAR pthread_cond_t *cond, FAR pthread_mutex_t *mutex, FAR struct tcb_s *rtcb = this_task(); irqstate_t flags; uint16_t oldstate; - int ticks; + ssystime_t ticks; int mypid = (int)getpid(); int ret = OK; int status; diff --git a/sched/pthread/pthread_create.c b/sched/pthread/pthread_create.c index 4fbf646424..23ebd95489 100644 --- a/sched/pthread/pthread_create.c +++ b/sched/pthread/pthread_create.c @@ -358,8 +358,8 @@ int pthread_create(FAR pthread_t *thread, FAR const pthread_attr_t *attr, if (policy == SCHED_SPORADIC) { FAR struct sporadic_s *sporadic; - int repl_ticks; - int budget_ticks; + ssystime_t repl_ticks; + ssystime_t budget_ticks; /* Convert timespec values to system clock ticks */ diff --git a/sched/sched/sched_getparam.c b/sched/sched/sched_getparam.c index 155049ff1f..72833d9471 100644 --- a/sched/sched/sched_getparam.c +++ b/sched/sched/sched_getparam.c @@ -127,8 +127,10 @@ int sched_getparam (pid_t pid, FAR struct sched_param *param) param->sched_ss_low_priority = (int)sporadic->low_priority; param->sched_ss_max_repl = (int)sporadic->max_repl; - clock_ticks2time((int)sporadic->repl_period, ¶m->sched_ss_repl_period); - clock_ticks2time((int)sporadic->budget, ¶m->sched_ss_init_budget); + clock_ticks2time((ssystime_t)sporadic->repl_period, + ¶m->sched_ss_repl_period); + clock_ticks2time((ssystime_t)sporadic->budget, + ¶m->sched_ss_init_budget); } else { diff --git a/sched/sched/sched_setparam.c b/sched/sched/sched_setparam.c index 824d51b53b..93bfccfe43 100644 --- a/sched/sched/sched_setparam.c +++ b/sched/sched/sched_setparam.c @@ -134,8 +134,8 @@ int sched_setparam(pid_t pid, FAR const struct sched_param *param) { FAR struct sporadic_s *sporadic; irqstate_t flags; - int repl_ticks; - int budget_ticks; + ssystime_t repl_ticks; + ssystime_t budget_ticks; if (param->sched_ss_max_repl < 1 || param->sched_ss_max_repl > CONFIG_SCHED_SPORADIC_MAXREPL) diff --git a/sched/sched/sched_setscheduler.c b/sched/sched/sched_setscheduler.c index 20026e7ec9..58fb3d0969 100644 --- a/sched/sched/sched_setscheduler.c +++ b/sched/sched/sched_setscheduler.c @@ -180,8 +180,8 @@ int sched_setscheduler(pid_t pid, int policy, case SCHED_SPORADIC: { FAR struct sporadic_s *sporadic; - int repl_ticks; - int budget_ticks; + ssystime_t repl_ticks; + ssystime_t budget_ticks; if (param->sched_ss_max_repl < 1 || param->sched_ss_max_repl > CONFIG_SCHED_SPORADIC_MAXREPL) diff --git a/sched/semaphore/sem_timedwait.c b/sched/semaphore/sem_timedwait.c index 23c16cc2d5..2ab32f6b86 100644 --- a/sched/semaphore/sem_timedwait.c +++ b/sched/semaphore/sem_timedwait.c @@ -98,7 +98,7 @@ int sem_timedwait(FAR sem_t *sem, FAR const struct timespec *abstime) { FAR struct tcb_s *rtcb = this_task(); irqstate_t flags; - int ticks; + ssystime_t ticks; int errcode; int ret = ERROR; diff --git a/sched/signal/sig_nanosleep.c b/sched/signal/sig_nanosleep.c index 5b3a461b53..1e8163e8a3 100644 --- a/sched/signal/sig_nanosleep.c +++ b/sched/signal/sig_nanosleep.c @@ -170,7 +170,7 @@ int nanosleep(FAR const struct timespec *rqtp, FAR struct timespec *rmtp) { systime_t elapsed; systime_t remaining; - int ticks; + ssystime_t ticks; /* REVISIT: The conversion from time to ticks and back could * be avoided. clock_timespec_subtract() would be used instead @@ -192,16 +192,16 @@ int nanosleep(FAR const struct timespec *rqtp, FAR struct timespec *rmtp) * amount of time that we failed to wait. */ - if (elapsed >= (uint32_t)ticks) + if (elapsed >= (systime_t)ticks) { remaining = 0; } else { - remaining = (uint32_t)ticks - elapsed; + remaining = (systime_t)ticks - elapsed; } - (void)clock_ticks2time((int)remaining, rmtp); + (void)clock_ticks2time((ssystime_t)remaining, rmtp); } leave_critical_section(flags); diff --git a/sched/timer/timer_gettime.c b/sched/timer/timer_gettime.c index c1e58899b4..25e0168765 100644 --- a/sched/timer/timer_gettime.c +++ b/sched/timer/timer_gettime.c @@ -86,7 +86,7 @@ int timer_gettime(timer_t timerid, FAR struct itimerspec *value) { FAR struct posix_timer_s *timer = (FAR struct posix_timer_s *)timerid; - int ticks; + ssystime_t ticks; if (!timer || !value) { diff --git a/sched/timer/timer_settime.c b/sched/timer/timer_settime.c index aa6007f95a..9e1fb5d4b2 100644 --- a/sched/timer/timer_settime.c +++ b/sched/timer/timer_settime.c @@ -304,7 +304,7 @@ int timer_settime(timer_t timerid, int flags, { FAR struct posix_timer_s *timer = (FAR struct posix_timer_s *)timerid; irqstate_t intflags; - int delay; + ssystime_t delay; int ret = OK; /* Some sanity checks */ @@ -332,7 +332,11 @@ int timer_settime(timer_t timerid, int flags, if (value->it_interval.tv_sec > 0 || value->it_interval.tv_nsec > 0) { - (void)clock_time2ticks(&value->it_interval, &timer->pt_delay); + (void)clock_time2ticks(&value->it_interval, &delay); + + /* REVISIT: Should pt_delay be ssystime_t? */ + + timer->pt_delay = (int)delay; } else { @@ -379,6 +383,10 @@ int timer_settime(timer_t timerid, int flags, if (delay > 0) { + /* REVISIT: Should pt_last be ssystime_t? Should wd_start delay be + * ssystime_t? + */ + timer->pt_last = delay; ret = wd_start(timer->pt_wdog, delay, (wdentry_t)timer_timeout, 1, (uint32_t)((wdparm_t)timer));