Correct round-to-ticks logic in sigtimedwait()

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5457 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2012-12-24 14:31:02 +00:00
parent fc8b6759b7
commit bbcf3ce491
2 changed files with 22 additions and 3 deletions

View File

@ -3812,4 +3812,7 @@
* include/pthread.h: In sys/prctl.h because it is needed by
pthread_[set|get]name_np()
* tools/kconfig.bat: Kludge to run kconfig-frontends from a DOS shell.
* sched/sig_timedwait.c: Should always move the time up to the next
largest number of system ticks. The logic was rounding. Noted by
Petteri Aimonen.

View File

@ -238,10 +238,25 @@ int sigtimedwait(FAR const sigset_t *set, FAR struct siginfo *info,
if (timeout)
{
/* Convert the timespec to milliseconds */
/* Convert the timespec to system clock ticks, making sure that
* the resultint delay is greater than or equal to the requested
* time in nanoseconds.
*/
waitticks = MSEC2TICK(timeout->tv_sec * MSEC_PER_SEC
+ timeout->tv_nsec / NSEC_PER_MSEC);
#ifdef CONFIG_HAVE_LONG_LONG
uint64_t waitticks64 = (timeout->tv_sec * NSEC_PER_SEC +
timeout->tv_nsec + NSEC_PER_TICK - 1) /
NSEC_PER_TICK;
DEBUGASSERT(waitticks64 <= UINT32_MAX);
waitticks = (uint32_t)waitticks64;
#else
uint32_t waitmsec;
DEBUGASSERT(timeout->tv_sec < UINT32_MAX / MSEC_PER_SEC);
waitmsec = timeout->tv_sec * MSEC_PER_SEC +
(timeout->tv_nsec + NSEC_PER_MSEC - 1) / NSEC_PER_MSEC;
waitticks = (waitmsec + MSEC_PER_TICK - 1) / MSEC_PER_TICK;
#endif
/* Create a watchdog */
@ -326,6 +341,7 @@ int sigtimedwait(FAR const sigset_t *set, FAR struct siginfo *info,
{
memcpy(info, &rtcb->sigunbinfo, sizeof(struct siginfo));
}
irqrestore(saved_state);
}