forked from Imagelibrary/rtems
2011-09-01 Joel Sherrill <joel.sherrilL@OARcorp.com>
PR 1895/cpukit * posix/src/mqueuerecvsupp.c, posix/src/pthreadjoin.c, score/src/coretodmsecstoticks.c, score/src/coretodusectoticks.c, score/src/timespectoticks.c: Ensure time conversions to ticks do not ignore partial tick and return 1 less than desired.
This commit is contained in:
@@ -1,3 +1,11 @@
|
|||||||
|
2011-09-01 Joel Sherrill <joel.sherrilL@OARcorp.com>
|
||||||
|
|
||||||
|
PR 1895/cpukit
|
||||||
|
* posix/src/mqueuerecvsupp.c, posix/src/pthreadjoin.c,
|
||||||
|
score/src/coretodmsecstoticks.c, score/src/coretodusectoticks.c,
|
||||||
|
score/src/timespectoticks.c: Ensure time conversions to ticks do not
|
||||||
|
ignore partial tick and return 1 less than desired.
|
||||||
|
|
||||||
2011-07-31 Joel Sherrill <joel.sherrilL@OARcorp.com>
|
2011-07-31 Joel Sherrill <joel.sherrilL@OARcorp.com>
|
||||||
|
|
||||||
PR 1855/cpukit
|
PR 1855/cpukit
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
* This code ignores the O_RDONLY/O_WRONLY/O_RDWR flag at open
|
* This code ignores the O_RDONLY/O_WRONLY/O_RDWR flag at open
|
||||||
* time.
|
* time.
|
||||||
*
|
*
|
||||||
* COPYRIGHT (c) 1989-2008.
|
* COPYRIGHT (c) 1989-2011.
|
||||||
* On-Line Applications Research Corporation (OAR).
|
* On-Line Applications Research Corporation (OAR).
|
||||||
*
|
*
|
||||||
* The license and distribution terms for this file may be
|
* The license and distribution terms for this file may be
|
||||||
@@ -105,8 +105,11 @@ ssize_t _POSIX_Message_queue_Receive_support(
|
|||||||
);
|
);
|
||||||
|
|
||||||
_Thread_Enable_dispatch();
|
_Thread_Enable_dispatch();
|
||||||
*msg_prio =
|
if (msg_prio) {
|
||||||
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
|
*msg_prio = _POSIX_Message_queue_Priority_from_core(
|
||||||
|
_Thread_Executing->Wait.count
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if ( !_Thread_Executing->Wait.return_code )
|
if ( !_Thread_Executing->Wait.return_code )
|
||||||
return length_out;
|
return length_out;
|
||||||
|
|||||||
@@ -55,20 +55,21 @@ on_EINTR:
|
|||||||
|
|
||||||
if ( the_thread->current_state ==
|
if ( the_thread->current_state ==
|
||||||
(STATES_WAITING_FOR_JOIN_AT_EXIT | STATES_TRANSIENT) ) {
|
(STATES_WAITING_FOR_JOIN_AT_EXIT | STATES_TRANSIENT) ) {
|
||||||
return_pointer = the_thread->Wait.return_argument;
|
return_pointer = the_thread->Wait.return_argument;
|
||||||
_Thread_Clear_state(
|
_Thread_Clear_state(
|
||||||
the_thread,
|
the_thread,
|
||||||
(STATES_WAITING_FOR_JOIN_AT_EXIT | STATES_TRANSIENT)
|
(STATES_WAITING_FOR_JOIN_AT_EXIT | STATES_TRANSIENT)
|
||||||
);
|
);
|
||||||
|
_Thread_Enable_dispatch();
|
||||||
} else {
|
} else {
|
||||||
_Thread_Executing->Wait.return_argument = &return_pointer;
|
_Thread_Executing->Wait.return_argument = &return_pointer;
|
||||||
_Thread_queue_Enter_critical_section( &api->Join_List );
|
_Thread_queue_Enter_critical_section( &api->Join_List );
|
||||||
_Thread_queue_Enqueue( &api->Join_List, WATCHDOG_NO_TIMEOUT );
|
_Thread_queue_Enqueue( &api->Join_List, WATCHDOG_NO_TIMEOUT );
|
||||||
}
|
_Thread_Enable_dispatch();
|
||||||
_Thread_Enable_dispatch();
|
|
||||||
|
|
||||||
if ( _Thread_Executing->Wait.return_code == EINTR )
|
if ( _Thread_Executing->Wait.return_code == EINTR )
|
||||||
goto on_EINTR;
|
goto on_EINTR;
|
||||||
|
}
|
||||||
|
|
||||||
if ( value_ptr )
|
if ( value_ptr )
|
||||||
*value_ptr = return_pointer;
|
*value_ptr = return_pointer;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* COPYRIGHT (c) 1989-2008.
|
/* COPYRIGHT (c) 1989-2011.
|
||||||
* On-Line Applications Research Corporation (OAR).
|
* On-Line Applications Research Corporation (OAR).
|
||||||
*
|
*
|
||||||
* The license and distribution terms for this file may be
|
* The license and distribution terms for this file may be
|
||||||
@@ -21,5 +21,18 @@ uint32_t TOD_MILLISECONDS_TO_TICKS(
|
|||||||
uint32_t milliseconds
|
uint32_t milliseconds
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return (milliseconds / rtems_configuration_get_milliseconds_per_tick());
|
uint32_t ticks;
|
||||||
|
uint32_t milliseconds_per_tick;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We should ensure the ticks not be truncated by integer division. We
|
||||||
|
* need to have it be greater than or equal to the requested time. It
|
||||||
|
* should not be shorter.
|
||||||
|
*/
|
||||||
|
milliseconds_per_tick = rtems_configuration_get_milliseconds_per_tick();
|
||||||
|
ticks = milliseconds / milliseconds_per_tick;
|
||||||
|
if ( (milliseconds % milliseconds_per_tick) != 0 )
|
||||||
|
ticks += 1;
|
||||||
|
|
||||||
|
return ticks;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* COPYRIGHT (c) 1989-2008.
|
/* COPYRIGHT (c) 1989-2011.
|
||||||
* On-Line Applications Research Corporation (OAR).
|
* On-Line Applications Research Corporation (OAR).
|
||||||
*
|
*
|
||||||
* The license and distribution terms for this file may be
|
* The license and distribution terms for this file may be
|
||||||
@@ -21,5 +21,18 @@ uint32_t TOD_MICROSECONDS_TO_TICKS(
|
|||||||
uint32_t microseconds
|
uint32_t microseconds
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return (microseconds / rtems_configuration_get_microseconds_per_tick());
|
uint32_t ticks;
|
||||||
|
uint32_t microseconds_per_tick;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We should ensure the ticks not be truncated by integer division. We
|
||||||
|
* need to have it be greater than or equal to the requested time. It
|
||||||
|
* should not be shorter.
|
||||||
|
*/
|
||||||
|
microseconds_per_tick = rtems_configuration_get_microseconds_per_tick();
|
||||||
|
ticks = microseconds / microseconds_per_tick;
|
||||||
|
if ( (microseconds % microseconds_per_tick) != 0 )
|
||||||
|
ticks += 1;
|
||||||
|
|
||||||
|
return ticks;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,16 +35,22 @@ uint32_t _Timespec_To_ticks(
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
uint32_t ticks;
|
uint32_t ticks;
|
||||||
|
uint32_t nanoseconds_per_tick;
|
||||||
|
|
||||||
if ( (time->tv_sec == 0) && (time->tv_nsec == 0) )
|
if ( (time->tv_sec == 0) && (time->tv_nsec == 0) )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ticks = time->tv_sec * TOD_TICKS_PER_SECOND;
|
/**
|
||||||
|
* We should ensure the ticks not be truncated by integer division. We
|
||||||
|
* need to have it be greater than or equal to the requested time. It
|
||||||
|
* should not be shorter.
|
||||||
|
*/
|
||||||
|
ticks = time->tv_sec * TOD_TICKS_PER_SECOND;
|
||||||
|
nanoseconds_per_tick = rtems_configuration_get_nanoseconds_per_tick();
|
||||||
|
ticks += time->tv_nsec / nanoseconds_per_tick;
|
||||||
|
|
||||||
ticks += time->tv_nsec / rtems_configuration_get_nanoseconds_per_tick();
|
if ( (time->tv_nsec % nanoseconds_per_tick) != 0 )
|
||||||
|
ticks += 1;
|
||||||
|
|
||||||
if (ticks)
|
return ticks;
|
||||||
return ticks;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user