Clock disciplines may be WATCHDOG_RELATIVE, WATCHDOG_ABSOLUTE, or WATCHDOG_NO_TIMEOUT. A discipline of WATCHDOG_RELATIVE with a timeout of WATCHDOG_NO_TIMEOUT is equivalent to a discipline of WATCHDOG_NO_TIMEOUT.
updates #2732 --- cpukit/libnetworking/rtems/rtems_glue.c | 2 +- cpukit/posix/src/condwaitsupp.c | 3 +- cpukit/posix/src/mqueuerecvsupp.c | 2 +- cpukit/posix/src/mqueuesendsupp.c | 2 +- cpukit/posix/src/mutexlocksupp.c | 4 +- cpukit/posix/src/nanosleep.c | 1 + cpukit/posix/src/pbarrierwait.c | 2 +- cpukit/posix/src/prwlockrdlock.c | 2 +- cpukit/posix/src/prwlocktimedrdlock.c | 2 +- cpukit/posix/src/prwlocktimedwrlock.c | 2 +- cpukit/posix/src/prwlocktryrdlock.c | 1 - cpukit/posix/src/prwlocktrywrlock.c | 1 - cpukit/posix/src/prwlockwrlock.c | 2 +- cpukit/posix/src/pthreadjoin.c | 1 + cpukit/posix/src/semaphorewaitsupp.c | 2 +- cpukit/posix/src/sigtimedwait.c | 2 +- cpukit/rtems/src/barrierwait.c | 2 +- cpukit/rtems/src/msgqreceive.c | 2 +- cpukit/rtems/src/msgqsend.c | 1 - cpukit/rtems/src/msgqurgent.c | 1 - cpukit/rtems/src/regiongetsegment.c | 1 + cpukit/rtems/src/semobtain.c | 7 +-- cpukit/score/include/rtems/score/corebarrierimpl.h | 5 -- cpukit/score/include/rtems/score/coremsgimpl.h | 10 ---- cpukit/score/include/rtems/score/coremuteximpl.h | 8 --- cpukit/score/include/rtems/score/corerwlockimpl.h | 6 -- cpukit/score/include/rtems/score/coresemimpl.h | 3 - cpukit/score/include/rtems/score/mrspimpl.h | 5 +- cpukit/score/include/rtems/score/threadimpl.h | 11 ++-- cpukit/score/include/rtems/score/threadq.h | 12 ++++ cpukit/score/include/rtems/score/threadqimpl.h | 67 +++++++++++++++++++--- cpukit/score/include/rtems/score/watchdog.h | 40 ++++++++++--- cpukit/score/include/rtems/score/watchdogimpl.h | 38 ++++++------ cpukit/score/src/apimutexlock.c | 3 +- cpukit/score/src/condition.c | 17 ++++-- cpukit/score/src/corebarrierwait.c | 2 - cpukit/score/src/coremsgseize.c | 2 - cpukit/score/src/coremsgsubmit.c | 2 - cpukit/score/src/coremutexseize.c | 5 +- cpukit/score/src/corerwlockobtainread.c | 2 - cpukit/score/src/corerwlockobtainwrite.c | 2 - cpukit/score/src/futex.c | 2 +- cpukit/score/src/mpci.c | 3 +- cpukit/score/src/mutex.c | 20 +++---- cpukit/score/src/semaphore.c | 2 +- cpukit/score/src/threadqenqueue.c | 30 +++++++--- cpukit/score/src/threadrestart.c | 2 +- 47 files changed, 200 insertions(+), 144 deletions(-) diff --git a/cpukit/libnetworking/rtems/rtems_glue.c b/cpukit/libnetworking/rtems/rtems_glue.c index e9b371f..5a7299c 100644 --- a/cpukit/libnetworking/rtems/rtems_glue.c +++ b/cpukit/libnetworking/rtems/rtems_glue.c @@ -377,11 +377,11 @@ rtems_bsdnet_semaphore_obtain (void) rtems_panic ("rtems-net: network sema obtain: network not initialised\n"); _Thread_queue_Context_initialize(&queue_context); _ISR_lock_ISR_disable(&queue_context.Lock_context); + _Thread_queue_Context_set_no_timeout( &queue_context ); status = _CORE_recursive_mutex_Seize ( &the_networkSemaphore->Core_control.Mutex.Recursive, _Thread_Executing, true, /* wait */ - WATCHDOG_NO_TIMEOUT, /* forever */ _CORE_recursive_mutex_Seize_nested, &queue_context ); diff --git a/cpukit/posix/src/condwaitsupp.c b/cpukit/posix/src/condwaitsupp.c index ebcb3c4..b2ed367 100644 --- a/cpukit/posix/src/condwaitsupp.c +++ b/cpukit/posix/src/condwaitsupp.c @@ -68,12 +68,13 @@ int _POSIX_Condition_variables_Wait_support( if ( !already_timedout ) { _Thread_queue_Context_set_expected_level( &queue_context, 2 ); + _Thread_queue_Context_set_timeout( &queue_context, timeout ); + _Thread_queue_Context_set_discipline( &queue_context, WATCHDOG_RELATIVE ); _Thread_queue_Enqueue_critical( &the_cond->Wait_queue.Queue, POSIX_CONDITION_VARIABLES_TQ_OPERATIONS, executing, STATES_WAITING_FOR_CONDITION_VARIABLE, - timeout, &queue_context ); } else { diff --git a/cpukit/posix/src/mqueuerecvsupp.c b/cpukit/posix/src/mqueuerecvsupp.c index cbb0dc0..dcb8178 100644 --- a/cpukit/posix/src/mqueuerecvsupp.c +++ b/cpukit/posix/src/mqueuerecvsupp.c @@ -97,13 +97,13 @@ ssize_t _POSIX_Message_queue_Receive_support( * Now perform the actual message receive */ executing = _Thread_Executing; + _Thread_queue_Context_set_relative_timeout( &queue_context, timeout ); status = _CORE_message_queue_Seize( &the_mq->Message_queue, executing, msg_ptr, &length_out, do_wait, - timeout, &queue_context ); diff --git a/cpukit/posix/src/mqueuesendsupp.c b/cpukit/posix/src/mqueuesendsupp.c index 9785fb2..3fd51a4 100644 --- a/cpukit/posix/src/mqueuesendsupp.c +++ b/cpukit/posix/src/mqueuesendsupp.c @@ -92,6 +92,7 @@ int _POSIX_Message_queue_Send_support( * Now perform the actual message receive */ executing = _Thread_Executing; + _Thread_queue_Context_set_relative_timeout( &queue_context, timeout ); status = _CORE_message_queue_Submit( &the_mq->Message_queue, executing, @@ -99,7 +100,6 @@ int _POSIX_Message_queue_Send_support( msg_len, _POSIX_Message_queue_Priority_to_core( msg_prio ), do_wait, - timeout, &queue_context ); return _POSIX_Zero_or_minus_one_plus_errno( status ); diff --git a/cpukit/posix/src/mutexlocksupp.c b/cpukit/posix/src/mutexlocksupp.c index d3d07f6..1da6238 100644 --- a/cpukit/posix/src/mutexlocksupp.c +++ b/cpukit/posix/src/mutexlocksupp.c @@ -63,6 +63,7 @@ int _POSIX_Mutex_Lock_support( } executing = _Thread_Executing; + _Thread_queue_Context_set_relative_timeout( &queue_context, timeout ); switch ( the_mutex->protocol ) { case POSIX_MUTEX_PRIORITY_CEILING: @@ -70,7 +71,6 @@ int _POSIX_Mutex_Lock_support( &the_mutex->Mutex, executing, wait, - timeout, _POSIX_Mutex_Lock_nested, &queue_context ); @@ -81,7 +81,6 @@ int _POSIX_Mutex_Lock_support( POSIX_MUTEX_NO_PROTOCOL_TQ_OPERATIONS, executing, wait, - timeout, _POSIX_Mutex_Lock_nested, &queue_context ); @@ -92,7 +91,6 @@ int _POSIX_Mutex_Lock_support( &the_mutex->Mutex.Recursive, executing, wait, - timeout, _POSIX_Mutex_Lock_nested, &queue_context ); diff --git a/cpukit/posix/src/nanosleep.c b/cpukit/posix/src/nanosleep.c index e0e1b26..8fc86d6 100644 --- a/cpukit/posix/src/nanosleep.c +++ b/cpukit/posix/src/nanosleep.c @@ -93,6 +93,7 @@ int nanosleep( executing, STATES_DELAYING | STATES_INTERRUPTIBLE_BY_SIGNAL, ticks, + WATCHDOG_RELATIVE, 1 ); diff --git a/cpukit/posix/src/pbarrierwait.c b/cpukit/posix/src/pbarrierwait.c index 0197e46..117beac 100644 --- a/cpukit/posix/src/pbarrierwait.c +++ b/cpukit/posix/src/pbarrierwait.c @@ -41,11 +41,11 @@ int pthread_barrier_wait( return EINVAL; } + _Thread_queue_Context_set_no_timeout( &queue_context ); status = _CORE_barrier_Seize( &the_barrier->Barrier, _Thread_Executing, true, - WATCHDOG_NO_TIMEOUT, &queue_context ); return _POSIX_Get_error( status ); diff --git a/cpukit/posix/src/prwlockrdlock.c b/cpukit/posix/src/prwlockrdlock.c index 295148e..5b15f55 100644 --- a/cpukit/posix/src/prwlockrdlock.c +++ b/cpukit/posix/src/prwlockrdlock.c @@ -35,11 +35,11 @@ int pthread_rwlock_rdlock( return EINVAL; } + _Thread_queue_Context_set_no_timeout( &queue_context ); status = _CORE_RWLock_Seize_for_reading( &the_rwlock->RWLock, _Thread_Executing, true, /* we are willing to wait forever */ - 0, &queue_context ); return _POSIX_Get_error( status ); diff --git a/cpukit/posix/src/prwlocktimedrdlock.c b/cpukit/posix/src/prwlocktimedrdlock.c index 1c10590..c1a77e9 100644 --- a/cpukit/posix/src/prwlocktimedrdlock.c +++ b/cpukit/posix/src/prwlocktimedrdlock.c @@ -56,11 +56,11 @@ int pthread_rwlock_timedrdlock( return EINVAL; } + _Thread_queue_Context_set_relative_timeout( &queue_context, ticks ); status = _CORE_RWLock_Seize_for_reading( &the_rwlock->RWLock, _Thread_Executing, do_wait, - ticks, &queue_context ); diff --git a/cpukit/posix/src/prwlocktimedwrlock.c b/cpukit/posix/src/prwlocktimedwrlock.c index 8080a8a..b7a9028 100644 --- a/cpukit/posix/src/prwlocktimedwrlock.c +++ b/cpukit/posix/src/prwlocktimedwrlock.c @@ -58,11 +58,11 @@ int pthread_rwlock_timedwrlock( return EINVAL; } + _Thread_queue_Context_set_relative_timeout( &queue_context, ticks ); status = _CORE_RWLock_Seize_for_writing( &the_rwlock->RWLock, _Thread_Executing, do_wait, - ticks, &queue_context ); diff --git a/cpukit/posix/src/prwlocktryrdlock.c b/cpukit/posix/src/prwlocktryrdlock.c index 5c6931e..052f1b0 100644 --- a/cpukit/posix/src/prwlocktryrdlock.c +++ b/cpukit/posix/src/prwlocktryrdlock.c @@ -39,7 +39,6 @@ int pthread_rwlock_tryrdlock( &the_rwlock->RWLock, _Thread_Executing, false, /* do not wait for the rwlock */ - 0, &queue_context ); return _POSIX_Get_error( status ); diff --git a/cpukit/posix/src/prwlocktrywrlock.c b/cpukit/posix/src/prwlocktrywrlock.c index 1181382..976e7a8 100644 --- a/cpukit/posix/src/prwlocktrywrlock.c +++ b/cpukit/posix/src/prwlocktrywrlock.c @@ -39,7 +39,6 @@ int pthread_rwlock_trywrlock( &the_rwlock->RWLock, _Thread_Executing, false, /* we are not willing to wait */ - 0, &queue_context ); return _POSIX_Get_error( status ); diff --git a/cpukit/posix/src/prwlockwrlock.c b/cpukit/posix/src/prwlockwrlock.c index 4592aaa..a78554f 100644 --- a/cpukit/posix/src/prwlockwrlock.c +++ b/cpukit/posix/src/prwlockwrlock.c @@ -39,11 +39,11 @@ int pthread_rwlock_wrlock( return EINVAL; } + _Thread_queue_Context_set_no_timeout( &queue_context ); status = _CORE_RWLock_Seize_for_writing( &the_rwlock->RWLock, _Thread_Executing, true, /* do not timeout -- wait forever */ - 0, &queue_context ); return _POSIX_Get_error( status ); diff --git a/cpukit/posix/src/pthreadjoin.c b/cpukit/posix/src/pthreadjoin.c index 86b8051..641031c 100644 --- a/cpukit/posix/src/pthreadjoin.c +++ b/cpukit/posix/src/pthreadjoin.c @@ -40,6 +40,7 @@ static int _POSIX_Threads_Join( pthread_t thread, void **value_ptr ) _Thread_queue_Context_initialize( &queue_context ); _Thread_queue_Context_set_expected_level( &queue_context, 1 ); + _Thread_queue_Context_set_no_timeout( &queue_context ); the_thread = _Thread_Get( thread, &queue_context.Lock_context ); if ( the_thread == NULL ) { diff --git a/cpukit/posix/src/semaphorewaitsupp.c b/cpukit/posix/src/semaphorewaitsupp.c index 9ba8d55..a4c43fd 100644 --- a/cpukit/posix/src/semaphorewaitsupp.c +++ b/cpukit/posix/src/semaphorewaitsupp.c @@ -41,12 +41,12 @@ int _POSIX_Semaphore_Wait_support( rtems_set_errno_and_return_minus_one( EINVAL ); } + _Thread_queue_Context_set_relative_timeout( &queue_context, timeout ); status = _CORE_semaphore_Seize( &the_semaphore->Semaphore, POSIX_SEMAPHORE_TQ_OPERATIONS, _Thread_Executing, blocking, - timeout, &queue_context ); return _POSIX_Zero_or_minus_one_plus_errno( status ); diff --git a/cpukit/posix/src/sigtimedwait.c b/cpukit/posix/src/sigtimedwait.c index 7855bb0..0e8518e 100644 --- a/cpukit/posix/src/sigtimedwait.c +++ b/cpukit/posix/src/sigtimedwait.c @@ -153,12 +153,12 @@ int sigtimedwait( executing->Wait.option = *set; executing->Wait.return_argument = the_info; _Thread_queue_Context_set_expected_level( &queue_context, 1 ); + _Thread_queue_Context_set_relative_timeout( &queue_context, interval ); _Thread_queue_Enqueue_critical( &_POSIX_signals_Wait_queue.Queue, POSIX_SIGNALS_TQ_OPERATIONS, executing, STATES_WAITING_FOR_SIGNAL | STATES_INTERRUPTIBLE_BY_SIGNAL, - interval, &queue_context ); diff --git a/cpukit/rtems/src/barrierwait.c b/cpukit/rtems/src/barrierwait.c index 5f1f023..c093168 100644 --- a/cpukit/rtems/src/barrierwait.c +++ b/cpukit/rtems/src/barrierwait.c @@ -38,11 +38,11 @@ rtems_status_code rtems_barrier_wait( return RTEMS_INVALID_ID; } + _Thread_queue_Context_set_relative_timeout( &queue_context, timeout ); status = _CORE_barrier_Seize( &the_barrier->Barrier, _Thread_Executing, true, - timeout, &queue_context ); return _Status_Get( status ); diff --git a/cpukit/rtems/src/msgqreceive.c b/cpukit/rtems/src/msgqreceive.c index 75c15be..d509faf 100644 --- a/cpukit/rtems/src/msgqreceive.c +++ b/cpukit/rtems/src/msgqreceive.c @@ -61,13 +61,13 @@ rtems_status_code rtems_message_queue_receive( ); executing = _Thread_Executing; + _Thread_queue_Context_set_relative_timeout( &queue_context, timeout ); status = _CORE_message_queue_Seize( &the_message_queue->message_queue, executing, buffer, size, !_Options_Is_no_wait( option_set ), - timeout, &queue_context ); return _Status_Get( status ); diff --git a/cpukit/rtems/src/msgqsend.c b/cpukit/rtems/src/msgqsend.c index 7968281..1fab4b0 100644 --- a/cpukit/rtems/src/msgqsend.c +++ b/cpukit/rtems/src/msgqsend.c @@ -58,7 +58,6 @@ rtems_status_code rtems_message_queue_send( buffer, size, false, /* sender does not block */ - 0, /* no timeout */ &queue_context ); return _Status_Get( status ); diff --git a/cpukit/rtems/src/msgqurgent.c b/cpukit/rtems/src/msgqurgent.c index 6c6379d..4756da4 100644 --- a/cpukit/rtems/src/msgqurgent.c +++ b/cpukit/rtems/src/msgqurgent.c @@ -58,7 +58,6 @@ rtems_status_code rtems_message_queue_urgent( buffer, size, false, /* sender does not block */ - 0, /* no timeout */ &queue_context ); return _Status_Get( status ); diff --git a/cpukit/rtems/src/regiongetsegment.c b/cpukit/rtems/src/regiongetsegment.c index cfc6645..ec0c525 100644 --- a/cpukit/rtems/src/regiongetsegment.c +++ b/cpukit/rtems/src/regiongetsegment.c @@ -87,6 +87,7 @@ rtems_status_code rtems_region_get_segment( executing, STATES_WAITING_FOR_SEGMENT, timeout, + WATCHDOG_RELATIVE, 2 ); diff --git a/cpukit/rtems/src/semobtain.c b/cpukit/rtems/src/semobtain.c index 0e5330a..9afef54 100644 --- a/cpukit/rtems/src/semobtain.c +++ b/cpukit/rtems/src/semobtain.c @@ -69,13 +69,14 @@ rtems_status_code rtems_semaphore_obtain( executing = _Thread_Executing; wait = !_Options_Is_no_wait( option_set ); + _Thread_queue_Context_set_relative_timeout( &queue_context, timeout ); + switch ( the_semaphore->variant ) { case SEMAPHORE_VARIANT_MUTEX_INHERIT_PRIORITY: status = _CORE_recursive_mutex_Seize( &the_semaphore->Core_control.Mutex.Recursive, executing, wait, - timeout, _CORE_recursive_mutex_Seize_nested, &queue_context ); @@ -85,7 +86,6 @@ rtems_status_code rtems_semaphore_obtain( &the_semaphore->Core_control.Mutex, executing, wait, - timeout, _CORE_recursive_mutex_Seize_nested, &queue_context ); @@ -96,7 +96,6 @@ rtems_status_code rtems_semaphore_obtain( _Semaphore_Get_operations( the_semaphore ), executing, wait, - timeout, _CORE_recursive_mutex_Seize_nested, &queue_context ); @@ -107,7 +106,6 @@ rtems_status_code rtems_semaphore_obtain( &the_semaphore->Core_control.MRSP, executing, wait, - timeout, &queue_context ); break; @@ -122,7 +120,6 @@ rtems_status_code rtems_semaphore_obtain( _Semaphore_Get_operations( the_semaphore ), executing, wait, - timeout, &queue_context ); break; diff --git a/cpukit/score/include/rtems/score/corebarrierimpl.h b/cpukit/score/include/rtems/score/corebarrierimpl.h index d2d9997..a7256b9 100644 --- a/cpukit/score/include/rtems/score/corebarrierimpl.h +++ b/cpukit/score/include/rtems/score/corebarrierimpl.h @@ -87,10 +87,6 @@ RTEMS_INLINE_ROUTINE void _CORE_barrier_Release( * @param[in] the_barrier is the barrier to wait for * @param[in,out] executing The currently executing thread. * @param[in] wait is true if the calling thread is willing to wait - * @param[in] timeout is the number of ticks the calling thread is willing - * to wait if @a wait is true. - * @param[in] mp_callout is the routine to invoke if the - * thread unblocked is remote * * @return The method status. */ @@ -98,7 +94,6 @@ Status_Control _CORE_barrier_Seize( CORE_barrier_Control *the_barrier, Thread_Control *executing, bool wait, - Watchdog_Interval timeout, Thread_queue_Context *queue_context ); diff --git a/cpukit/score/include/rtems/score/coremsgimpl.h b/cpukit/score/include/rtems/score/coremsgimpl.h index d240c4a..3b811c9 100644 --- a/cpukit/score/include/rtems/score/coremsgimpl.h +++ b/cpukit/score/include/rtems/score/coremsgimpl.h @@ -194,8 +194,6 @@ Status_Control _CORE_message_queue_Broadcast( * appended, or enqueued in priority order. * @param[in] wait indicates whether the calling thread is willing to block * if the message queue is full. - * @param[in] timeout is the maximum number of clock ticks that the calling - * thread is willing to block if the message queue is full. * @param[in] queue_context The thread queue context used for * _CORE_message_queue_Acquire() or _CORE_message_queue_Acquire_critical(). * @retval indication of the successful completion or reason for failure @@ -207,7 +205,6 @@ Status_Control _CORE_message_queue_Submit( size_t size, CORE_message_queue_Submit_types submit_type, bool wait, - Watchdog_Interval timeout, Thread_queue_Context *queue_context ); @@ -230,8 +227,6 @@ Status_Control _CORE_message_queue_Submit( * indicates the maximum size message that the caller can receive. * @param[in] wait indicates whether the calling thread is willing to block * if the message queue is empty. - * @param[in] timeout is the maximum number of clock ticks that the calling - * thread is willing to block if the message queue is empty. * @param[in] queue_context The thread queue context used for * _CORE_message_queue_Acquire() or _CORE_message_queue_Acquire_critical(). * @@ -251,7 +246,6 @@ Status_Control _CORE_message_queue_Seize( void *buffer, size_t *size_p, bool wait, - Watchdog_Interval timeout, Thread_queue_Context *queue_context ); @@ -281,7 +275,6 @@ RTEMS_INLINE_ROUTINE Status_Control _CORE_message_queue_Send( const void *buffer, size_t size, bool wait, - Watchdog_Interval timeout, Thread_queue_Context *queue_context ) { @@ -292,7 +285,6 @@ RTEMS_INLINE_ROUTINE Status_Control _CORE_message_queue_Send( size, CORE_MESSAGE_QUEUE_SEND_REQUEST, wait, - timeout, queue_context ); } @@ -302,7 +294,6 @@ RTEMS_INLINE_ROUTINE Status_Control _CORE_message_queue_Urgent( const void *buffer, size_t size, bool wait, - Watchdog_Interval timeout, Thread_queue_Context *queue_context ) { @@ -313,7 +304,6 @@ RTEMS_INLINE_ROUTINE Status_Control _CORE_message_queue_Urgent( size, CORE_MESSAGE_QUEUE_URGENT_REQUEST, wait, - timeout, queue_context ); } diff --git a/cpukit/score/include/rtems/score/coremuteximpl.h b/cpukit/score/include/rtems/score/coremuteximpl.h index 3a5ae99..339834b 100644 --- a/cpukit/score/include/rtems/score/coremuteximpl.h +++ b/cpukit/score/include/rtems/score/coremuteximpl.h @@ -100,7 +100,6 @@ Status_Control _CORE_mutex_Seize_slow( Thread_Control *executing, Thread_Control *owner, bool wait, - Watchdog_Interval timeout, Thread_queue_Context *queue_context ); @@ -109,7 +108,6 @@ Status_Control _CORE_mutex_Seize_no_protocol_slow( const Thread_queue_Operations *operations, Thread_Control *executing, bool wait, - Watchdog_Interval timeout, Thread_queue_Context *queue_context ); @@ -183,7 +181,6 @@ RTEMS_INLINE_ROUTINE Status_Control _CORE_recursive_mutex_Seize( CORE_recursive_mutex_Control *the_mutex, Thread_Control *executing, bool wait, - Watchdog_Interval timeout, Status_Control ( *nested )( CORE_recursive_mutex_Control * ), Thread_queue_Context *queue_context ) @@ -214,7 +211,6 @@ RTEMS_INLINE_ROUTINE Status_Control _CORE_recursive_mutex_Seize( executing, owner, wait, - timeout, queue_context ); } @@ -277,7 +273,6 @@ RTEMS_INLINE_ROUTINE Status_Control _CORE_recursive_mutex_Seize_no_protocol( const Thread_queue_Operations *operations, Thread_Control *executing, bool wait, - Watchdog_Interval timeout, Status_Control ( *nested )( CORE_recursive_mutex_Control * ), Thread_queue_Context *queue_context ) @@ -307,7 +302,6 @@ RTEMS_INLINE_ROUTINE Status_Control _CORE_recursive_mutex_Seize_no_protocol( operations, executing, wait, - timeout, queue_context ); } @@ -434,7 +428,6 @@ RTEMS_INLINE_ROUTINE Status_Control _CORE_ceiling_mutex_Seize( CORE_ceiling_mutex_Control *the_mutex, Thread_Control *executing, bool wait, - Watchdog_Interval timeout, Status_Control ( *nested )( CORE_recursive_mutex_Control * ), Thread_queue_Context *queue_context ) @@ -476,7 +469,6 @@ RTEMS_INLINE_ROUTINE Status_Control _CORE_ceiling_mutex_Seize( CORE_MUTEX_TQ_OPERATIONS, executing, wait, - timeout, queue_context ); } diff --git a/cpukit/score/include/rtems/score/corerwlockimpl.h b/cpukit/score/include/rtems/score/corerwlockimpl.h index e80ab0e..ff881fa 100644 --- a/cpukit/score/include/rtems/score/corerwlockimpl.h +++ b/cpukit/score/include/rtems/score/corerwlockimpl.h @@ -95,15 +95,12 @@ RTEMS_INLINE_ROUTINE void _CORE_RWLock_Release( * * @param[in] the_rwlock is the RWLock to wait for * @param[in] wait is true if the calling thread is willing to wait - * @param[in] timeout is the number of ticks the calling thread is willing - * to wait if @a wait is true. */ Status_Control _CORE_RWLock_Seize_for_reading( CORE_RWLock_Control *the_rwlock, Thread_Control *executing, bool wait, - Watchdog_Interval timeout, Thread_queue_Context *queue_context ); @@ -114,14 +111,11 @@ Status_Control _CORE_RWLock_Seize_for_reading( * * @param[in] the_rwlock is the RWLock to wait for * @param[in] wait is true if the calling thread is willing to wait - * @param[in] timeout is the number of ticks the calling thread is willing - * to wait if @a wait is true. */ Status_Control _CORE_RWLock_Seize_for_writing( CORE_RWLock_Control *the_rwlock, Thread_Control *executing, bool wait, - Watchdog_Interval timeout, Thread_queue_Context *queue_context ); diff --git a/cpukit/score/include/rtems/score/coresemimpl.h b/cpukit/score/include/rtems/score/coresemimpl.h index 487a91b..5a28726 100644 --- a/cpukit/score/include/rtems/score/coresemimpl.h +++ b/cpukit/score/include/rtems/score/coresemimpl.h @@ -165,7 +165,6 @@ RTEMS_INLINE_ROUTINE uint32_t _CORE_semaphore_Get_count( * @param[in] operations The thread queue operations. * @param[in] executing The currently executing thread. * @param[in] wait is true if the thread is willing to wait - * @param[in] timeout is the maximum number of ticks to block * @param[in] queue_context is a temporary variable used to contain the ISR * disable level cookie */ @@ -174,7 +173,6 @@ RTEMS_INLINE_ROUTINE Status_Control _CORE_semaphore_Seize( const Thread_queue_Operations *operations, Thread_Control *executing, bool wait, - Watchdog_Interval timeout, Thread_queue_Context *queue_context ) { @@ -198,7 +196,6 @@ RTEMS_INLINE_ROUTINE Status_Control _CORE_semaphore_Seize( operations, executing, STATES_WAITING_FOR_SEMAPHORE, - timeout, queue_context ); return _Thread_Wait_get_status( executing ); diff --git a/cpukit/score/include/rtems/score/mrspimpl.h b/cpukit/score/include/rtems/score/mrspimpl.h index 66f5cc6..c136a20 100644 --- a/cpukit/score/include/rtems/score/mrspimpl.h +++ b/cpukit/score/include/rtems/score/mrspimpl.h @@ -240,7 +240,6 @@ RTEMS_INLINE_ROUTINE Status_Control _MRSP_Wait_for_ownership( Thread_Control *executing, Priority_Control initial_priority, Priority_Control ceiling_priority, - Watchdog_Interval timeout, Thread_queue_Context *queue_context ) { @@ -250,6 +249,8 @@ RTEMS_INLINE_ROUTINE Status_Control _MRSP_Wait_for_ownership( Per_CPU_Control *cpu_self; ISR_lock_Context giant_lock_context; ISR_Level level; + Watchdog_Interval timeout = queue_context->timeout; + _Assert( queue_context->timeout_discipline == WATCHDOG_RELATIVE ); rival.thread = executing; rival.resource = mrsp; @@ -317,7 +318,6 @@ RTEMS_INLINE_ROUTINE Status_Control _MRSP_Seize( MRSP_Control *mrsp, Thread_Control *executing, bool wait, - Watchdog_Interval timeout, Thread_queue_Context *queue_context ) { @@ -357,7 +357,6 @@ RTEMS_INLINE_ROUTINE Status_Control _MRSP_Seize( executing, initial_priority, ceiling_priority, - timeout, queue_context ); } else { diff --git a/cpukit/score/include/rtems/score/threadimpl.h b/cpukit/score/include/rtems/score/threadimpl.h index 6bb7815..8eafcb8 100644 --- a/cpukit/score/include/rtems/score/threadimpl.h +++ b/cpukit/score/include/rtems/score/threadimpl.h @@ -1477,7 +1477,7 @@ RTEMS_INLINE_ROUTINE void _Thread_Timer_insert_relative( _ISR_lock_ISR_disable_and_acquire( &the_thread->Timer.Lock, &lock_context ); - the_thread->Timer.header = &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_RELATIVE ]; + the_thread->Timer.header = &cpu->Watchdog.Header[PER_CPU_WATCHDOG_RELATIVE]; the_thread->Timer.Watchdog.routine = routine; _Watchdog_Per_CPU_insert_relative( &the_thread->Timer.Watchdog, cpu, ticks ); @@ -1488,20 +1488,23 @@ RTEMS_INLINE_ROUTINE void _Thread_Timer_insert_absolute( Thread_Control *the_thread, Per_CPU_Control *cpu, Watchdog_Service_routine_entry routine, - uint64_t expire + uint64_t ticks ) { ISR_lock_Context lock_context; _ISR_lock_ISR_disable_and_acquire( &the_thread->Timer.Lock, &lock_context ); - the_thread->Timer.header = &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_ABSOLUTE ]; + the_thread->Timer.header = &cpu->Watchdog.Header[PER_CPU_WATCHDOG_ABSOLUTE]; the_thread->Timer.Watchdog.routine = routine; - _Watchdog_Per_CPU_insert_absolute( &the_thread->Timer.Watchdog, cpu, expire ); + _Watchdog_Per_CPU_insert_absolute( &the_thread->Timer.Watchdog, cpu, ticks ); _ISR_lock_Release_and_ISR_enable( &the_thread->Timer.Lock, &lock_context ); } + + + RTEMS_INLINE_ROUTINE void _Thread_Timer_remove( Thread_Control *the_thread ) { ISR_lock_Context lock_context; diff --git a/cpukit/score/include/rtems/score/threadq.h b/cpukit/score/include/rtems/score/threadq.h index a4e5292..b3b8fec 100644 --- a/cpukit/score/include/rtems/score/threadq.h +++ b/cpukit/score/include/rtems/score/threadq.h @@ -24,6 +24,7 @@ #include <rtems/score/object.h> #include <rtems/score/priority.h> #include <rtems/score/rbtree.h> +#include <rtems/score/watchdog.h> #ifdef __cplusplus extern "C" { @@ -79,6 +80,17 @@ typedef struct { uint32_t expected_thread_dispatch_disable_level; /** + * @brief The clock discipline for the interval timeout. + * Use WATCHDOG_NO_TIMEOUT to block indefinitely. + */ + Watchdog_Discipline timeout_discipline; + + /** + * @brief Interval to wait. + */ + uint64_t timeout; + + /** * @brief Callout to unblock the thread in case it is actually a thread * proxy. * diff --git a/cpukit/score/include/rtems/score/threadqimpl.h b/cpukit/score/include/rtems/score/threadqimpl.h index 73d4de2..beb4077 100644 --- a/cpukit/score/include/rtems/score/threadqimpl.h +++ b/cpukit/score/include/rtems/score/threadqimpl.h @@ -91,6 +91,58 @@ _Thread_queue_Context_set_expected_level( } /** + * @brief Sets an indefinite timeout interval in the thread queue context. + * + * @param queue_context The thread queue context. + * @param timeout The new timeout. + * + * @see _Thread_queue_Enqueue_critical(). + */ +RTEMS_INLINE_ROUTINE void +_Thread_queue_Context_set_no_timeout( + Thread_queue_Context *queue_context +) +{ + queue_context->timeout_discipline = WATCHDOG_NO_TIMEOUT; +} + +/** + * @brief Sets a relative timeout in the thread queue context. + * + * @param queue_context The thread queue context. + * @param discipline The clock discipline to use for the timeout. + * + * @see _Thread_queue_Enqueue_critical(). + */ +RTEMS_INLINE_ROUTINE void +_Thread_queue_Context_set_relative_timeout( + Thread_queue_Context *queue_context, + Watchdog_Interval timeout +) +{ + queue_context->timeout_discipline = WATCHDOG_RELATIVE; + queue_context->timeout = timeout; +} + +/** + * @brief Sets an absolute timeout in the thread queue context. + * + * @param queue_context The thread queue context. + * @param discipline The clock discipline to use for the timeout. + * + * @see _Thread_queue_Enqueue_critical(). + */ +RTEMS_INLINE_ROUTINE void +_Thread_queue_Context_set_absolute_timeout( + Thread_queue_Context *queue_context, + uint64_t timeout +) +{ + queue_context->timeout_discipline = WATCHDOG_ABSOLUTE; + queue_context->timeout = timeout; +} + +/** * @brief Sets the MP callout in the thread queue context. * * @param queue_context The thread queue context. @@ -305,8 +357,8 @@ Thread_Control *_Thread_queue_Do_dequeue( * @brief Blocks the thread and places it on the thread queue. * * This enqueues the thread on the thread queue, blocks the thread, and - * optionally starts the thread timer in case the timeout interval is not - * WATCHDOG_NO_TIMEOUT. + * optionally starts the thread timer in case the timeout discipline is not + * WATCHDOG_NO_TIMEOUT. Timeout discipline and value are in the queue_context. * * The caller must be the owner of the thread queue lock. This function will * release the thread queue lock and register it as the new thread lock. @@ -348,7 +400,6 @@ Thread_Control *_Thread_queue_Do_dequeue( * MUTEX_TQ_OPERATIONS, * executing, * STATES_WAITING_FOR_MUTEX, - * WATCHDOG_NO_TIMEOUT, * 0, * &queue_context * ); @@ -360,8 +411,6 @@ Thread_Control *_Thread_queue_Do_dequeue( * @param[in] operations The thread queue operations. * @param[in] the_thread The thread to enqueue. * @param[in] state The new state of the thread. - * @param[in] timeout Interval to wait. Use WATCHDOG_NO_TIMEOUT to block - * potentially forever. * @param[in] queue_context The thread queue context of the lock acquire. */ void _Thread_queue_Enqueue_critical( @@ -369,7 +418,6 @@ void _Thread_queue_Enqueue_critical( const Thread_queue_Operations *operations, Thread_Control *the_thread, States_Control state, - Watchdog_Interval timeout, Thread_queue_Context *queue_context ); @@ -383,6 +431,7 @@ RTEMS_INLINE_ROUTINE void _Thread_queue_Enqueue( Thread_Control *the_thread, States_Control state, Watchdog_Interval timeout, + Watchdog_Discipline discipline, uint32_t expected_level ) { @@ -391,12 +440,16 @@ RTEMS_INLINE_ROUTINE void _Thread_queue_Enqueue( _Thread_queue_Context_initialize( &queue_context ); _Thread_queue_Acquire( the_thread_queue, &queue_context.Lock_context ); _Thread_queue_Context_set_expected_level( &queue_context, expected_level ); + if ( discipline == WATCHDOG_ABSOLUTE ) { + _Thread_queue_Context_set_absolute_timeout( &queue_context, timeout ); + } else { + _Thread_queue_Context_set_relative_timeout( &queue_context, timeout ); + } _Thread_queue_Enqueue_critical( &the_thread_queue->Queue, operations, the_thread, state, - timeout, &queue_context ); } diff --git a/cpukit/score/include/rtems/score/watchdog.h b/cpukit/score/include/rtems/score/watchdog.h index c582dbd..11a5974 100644 --- a/cpukit/score/include/rtems/score/watchdog.h +++ b/cpukit/score/include/rtems/score/watchdog.h @@ -53,6 +53,38 @@ typedef struct Watchdog_Control Watchdog_Control; typedef uint32_t Watchdog_Interval; /** + * @brief The clock discipline to use for the Watchdog timeout interval. + */ +typedef enum { + + /** + * @brief Indefinite wait. + * + * This is to indicate there is no timeout and not to use a watchdog. It + * must be equal to 0, which is an illegal relative clock interval, so that + * it may be used as a Watchdog_Interval value with WATCHDOG_RELATIVE to + * express an indefinite wait. + */ + WATCHDOG_NO_TIMEOUT = 0, + + /** + * @brief Relative clock. + * + * The reference time point for the watchdog is current ticks value + * during insert. Time is measured in clock ticks. + */ + WATCHDOG_RELATIVE, + + /** + * @brief Absolute clock. + * + * The reference time point for this header is the POSIX Epoch. Time is + * measured in nanoseconds since POSIX Epoch. + */ + WATCHDOG_ABSOLUTE +} Watchdog_Discipline; + +/** * @brief Return type from a Watchdog Service Routine. * * This type defines the return type from a Watchdog Service Routine. @@ -68,14 +100,6 @@ typedef Watchdog_Service_routine ( *Watchdog_Service_routine_entry )( Watchdog_Control * ); /** - * @brief The constant for indefinite wait. - * - * This is the constant for indefinite wait. It is actually an - * illegal interval. - */ -#define WATCHDOG_NO_TIMEOUT 0 - -/** * @brief The watchdog header to manage scheduled watchdogs. */ typedef struct { diff --git a/cpukit/score/include/rtems/score/watchdogimpl.h b/cpukit/score/include/rtems/score/watchdogimpl.h index b76a51a..d2e8d18 100644 --- a/cpukit/score/include/rtems/score/watchdogimpl.h +++ b/cpukit/score/include/rtems/score/watchdogimpl.h @@ -340,45 +340,45 @@ RTEMS_INLINE_ROUTINE void _Watchdog_Per_CPU_release_critical( } RTEMS_INLINE_ROUTINE uint64_t _Watchdog_Per_CPU_insert_relative( - Watchdog_Control *the_watchdog, - Per_CPU_Control *cpu, - uint32_t ticks + Watchdog_Control *the_watchdog, + Per_CPU_Control *cpu, + Watchdog_Interval ticks ) { ISR_lock_Context lock_context; + Watchdog_Header *header; uint64_t expire; _Watchdog_Set_CPU( the_watchdog, cpu ); _Watchdog_Per_CPU_acquire_critical( cpu, &lock_context ); - expire = cpu->Watchdog.ticks + ticks; - _Watchdog_Insert( - &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_RELATIVE ], - the_watchdog, - expire - ); - _Watchdog_Per_CPU_release_critical( cpu, &lock_context ); + expire = ticks + cpu->Watchdog.ticks; + header = &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_RELATIVE ]; + + _Watchdog_Insert(header, the_watchdog, expire); + _Watchdog_Per_CPU_release_critical( cpu, &lock_context ); return expire; } -RTEMS_INLINE_ROUTINE void _Watchdog_Per_CPU_insert_absolute( - Watchdog_Control *the_watchdog, - Per_CPU_Control *cpu, - uint64_t expire +RTEMS_INLINE_ROUTINE uint64_t _Watchdog_Per_CPU_insert_absolute( + Watchdog_Control *the_watchdog, + Per_CPU_Control *cpu, + uint64_t expire ) { ISR_lock_Context lock_context; + Watchdog_Header *header; _Watchdog_Set_CPU( the_watchdog, cpu ); _Watchdog_Per_CPU_acquire_critical( cpu, &lock_context ); - _Watchdog_Insert( - &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_ABSOLUTE ], - the_watchdog, - expire - ); + + header = &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_ABSOLUTE ]; + + _Watchdog_Insert(header, the_watchdog, expire); _Watchdog_Per_CPU_release_critical( cpu, &lock_context ); + return expire; } RTEMS_INLINE_ROUTINE void _Watchdog_Per_CPU_remove( diff --git a/cpukit/score/src/apimutexlock.c b/cpukit/score/src/apimutexlock.c index df53e75..f69cfde 100644 --- a/cpukit/score/src/apimutexlock.c +++ b/cpukit/score/src/apimutexlock.c @@ -33,12 +33,11 @@ void _API_Mutex_Lock( API_Mutex_Control *the_mutex ) _Thread_queue_Context_initialize( &queue_context ); _ISR_lock_ISR_disable( &queue_context.Lock_context ); - + _Thread_queue_Context_set_no_timeout( &queue_context ); _CORE_recursive_mutex_Seize( &the_mutex->Mutex, _Thread_Executing, true, - WATCHDOG_NO_TIMEOUT, _CORE_recursive_mutex_Seize_nested, &queue_context ); diff --git a/cpukit/score/src/condition.c b/cpukit/score/src/condition.c index e7d9805..90717bc 100644 --- a/cpukit/score/src/condition.c +++ b/cpukit/score/src/condition.c @@ -82,7 +82,6 @@ static void _Condition_Queue_release( static Per_CPU_Control *_Condition_Do_wait( struct _Condition_Control *_condition, - Watchdog_Interval timeout, Thread_queue_Context *queue_context ) { @@ -100,7 +99,6 @@ static Per_CPU_Control *_Condition_Do_wait( CONDITION_TQ_OPERATIONS, executing, STATES_WAITING_FOR_SYS_LOCK_CONDITION, - timeout, queue_context ); @@ -117,7 +115,11 @@ void _Condition_Wait( _Thread_queue_Context_initialize( &queue_context ); _ISR_lock_ISR_disable( &queue_context.Lock_context ); - cpu_self = _Condition_Do_wait( _condition, 0, &queue_context ); + _Thread_queue_Context_set_no_timeout( &queue_context ); + cpu_self = _Condition_Do_wait( + _condition, + &queue_context + ); _Mutex_Release( _mutex ); _Thread_Dispatch_enable( cpu_self ); @@ -151,7 +153,8 @@ int _Condition_Wait_timed( break; } - cpu_self = _Condition_Do_wait( _condition, ticks, &queue_context ); + _Thread_queue_Context_set_relative_timeout( &queue_context, ticks ); + cpu_self = _Condition_Do_wait( _condition, &queue_context ); _Mutex_Release( _mutex ); executing = cpu_self->executing; @@ -173,7 +176,8 @@ void _Condition_Wait_recursive( _Thread_queue_Context_initialize( &queue_context ); _ISR_lock_ISR_disable( &queue_context.Lock_context ); - cpu_self = _Condition_Do_wait( _condition, 0, &queue_context ); + _Thread_queue_Context_set_no_timeout( &queue_context ); + cpu_self = _Condition_Do_wait( _condition, &queue_context ); nest_level = _mutex->_nest_level; _mutex->_nest_level = 0; @@ -211,7 +215,8 @@ int _Condition_Wait_recursive_timed( break; } - cpu_self = _Condition_Do_wait( _condition, ticks, &queue_context ); + _Thread_queue_Context_set_relative_timeout( &queue_context, ticks ); + cpu_self = _Condition_Do_wait( _condition, &queue_context ); nest_level = _mutex->_nest_level; _mutex->_nest_level = 0; diff --git a/cpukit/score/src/corebarrierwait.c b/cpukit/score/src/corebarrierwait.c index d939acf..7e46c93 100644 --- a/cpukit/score/src/corebarrierwait.c +++ b/cpukit/score/src/corebarrierwait.c @@ -26,7 +26,6 @@ Status_Control _CORE_barrier_Seize( CORE_barrier_Control *the_barrier, Thread_Control *executing, bool wait, - Watchdog_Interval timeout, Thread_queue_Context *queue_context ) { @@ -51,7 +50,6 @@ Status_Control _CORE_barrier_Seize( CORE_BARRIER_TQ_OPERATIONS, executing, STATES_WAITING_FOR_BARRIER, - timeout, queue_context ); return _Thread_Wait_get_status( executing ); diff --git a/cpukit/score/src/coremsgseize.c b/cpukit/score/src/coremsgseize.c index 6906328..d86afd0 100644 --- a/cpukit/score/src/coremsgseize.c +++ b/cpukit/score/src/coremsgseize.c @@ -31,7 +31,6 @@ Status_Control _CORE_message_queue_Seize( void *buffer, size_t *size_p, bool wait, - Watchdog_Interval timeout, Thread_queue_Context *queue_context ) { @@ -120,7 +119,6 @@ Status_Control _CORE_message_queue_Seize( the_message_queue->operations, executing, STATES_WAITING_FOR_MESSAGE, - timeout, queue_context ); return _Thread_Wait_get_status( executing ); diff --git a/cpukit/score/src/coremsgsubmit.c b/cpukit/score/src/coremsgsubmit.c index fb56ffe..97b4382 100644 --- a/cpukit/score/src/coremsgsubmit.c +++ b/cpukit/score/src/coremsgsubmit.c @@ -33,7 +33,6 @@ Status_Control _CORE_message_queue_Submit( size_t size, CORE_message_queue_Submit_types submit_type, bool wait, - Watchdog_Interval timeout, Thread_queue_Context *queue_context ) { @@ -138,7 +137,6 @@ Status_Control _CORE_message_queue_Submit( the_message_queue->operations, executing, STATES_WAITING_FOR_MESSAGE, - timeout, queue_context ); return _Thread_Wait_get_status( executing ); diff --git a/cpukit/score/src/coremutexseize.c b/cpukit/score/src/coremutexseize.c index ab743c4..c468c07 100644 --- a/cpukit/score/src/coremutexseize.c +++ b/cpukit/score/src/coremutexseize.c @@ -21,13 +21,13 @@ #include <rtems/score/coremuteximpl.h> #include <rtems/score/statesimpl.h> #include <rtems/score/thread.h> +#include <rtems/score/watchdog.h> Status_Control _CORE_mutex_Seize_slow( CORE_mutex_Control *the_mutex, Thread_Control *executing, Thread_Control *owner, bool wait, - Watchdog_Interval timeout, Thread_queue_Context *queue_context ) { @@ -69,7 +69,6 @@ Status_Control _CORE_mutex_Seize_slow( CORE_MUTEX_TQ_OPERATIONS, executing, STATES_WAITING_FOR_MUTEX, - timeout, queue_context ); @@ -85,7 +84,6 @@ Status_Control _CORE_mutex_Seize_no_protocol_slow( const Thread_queue_Operations *operations, Thread_Control *executing, bool wait, - Watchdog_Interval timeout, Thread_queue_Context *queue_context ) { @@ -96,7 +94,6 @@ Status_Control _CORE_mutex_Seize_no_protocol_slow( operations, executing, STATES_WAITING_FOR_MUTEX, - timeout, queue_context ); return _Thread_Wait_get_status( executing ); diff --git a/cpukit/score/src/corerwlockobtainread.c b/cpukit/score/src/corerwlockobtainread.c index bce992c..09b26af 100644 --- a/cpukit/score/src/corerwlockobtainread.c +++ b/cpukit/score/src/corerwlockobtainread.c @@ -28,7 +28,6 @@ Status_Control _CORE_RWLock_Seize_for_reading( CORE_RWLock_Control *the_rwlock, Thread_Control *executing, bool wait, - Watchdog_Interval timeout, Thread_queue_Context *queue_context ) { @@ -85,7 +84,6 @@ Status_Control _CORE_RWLock_Seize_for_reading( CORE_RWLOCK_TQ_OPERATIONS, executing, STATES_WAITING_FOR_RWLOCK, - timeout, queue_context ); return _Thread_Wait_get_status( executing ); diff --git a/cpukit/score/src/corerwlockobtainwrite.c b/cpukit/score/src/corerwlockobtainwrite.c index c261d32..9aac5e7 100644 --- a/cpukit/score/src/corerwlockobtainwrite.c +++ b/cpukit/score/src/corerwlockobtainwrite.c @@ -28,7 +28,6 @@ Status_Control _CORE_RWLock_Seize_for_writing( CORE_RWLock_Control *the_rwlock, Thread_Control *executing, bool wait, - Watchdog_Interval timeout, Thread_queue_Context *queue_context ) { @@ -73,7 +72,6 @@ Status_Control _CORE_RWLock_Seize_for_writing( CORE_RWLOCK_TQ_OPERATIONS, executing, STATES_WAITING_FOR_RWLOCK, - timeout, queue_context ); return _Thread_Wait_get_status( executing ); diff --git a/cpukit/score/src/futex.c b/cpukit/score/src/futex.c index a192509..840101a 100644 --- a/cpukit/score/src/futex.c +++ b/cpukit/score/src/futex.c @@ -89,12 +89,12 @@ int _Futex_Wait( struct _Futex_Control *_futex, int *uaddr, int val ) if ( *uaddr == val ) { _Thread_queue_Context_set_expected_level( &queue_context, 1 ); + _Thread_queue_Context_set_no_timeout( &queue_context ); _Thread_queue_Enqueue_critical( &futex->Queue.Queue, FUTEX_TQ_OPERATIONS, executing, STATES_WAITING_FOR_SYS_LOCK_FUTEX, - WATCHDOG_NO_TIMEOUT, &queue_context ); eno = 0; diff --git a/cpukit/score/src/mpci.c b/cpukit/score/src/mpci.c index 9eb169b..a562b29 100644 --- a/cpukit/score/src/mpci.c +++ b/cpukit/score/src/mpci.c @@ -261,6 +261,7 @@ Status_Control _MPCI_Send_request_packet( executing, STATES_WAITING_FOR_RPC_REPLY | extra_state, the_packet->timeout, + WATCHDOG_RELATIVE, 2 ); @@ -328,6 +329,7 @@ void _MPCI_Receive_server( executing = _Thread_Get_executing(); _Thread_queue_Context_initialize( &queue_context ); + _Thread_queue_Context_set_no_timeout( &queue_context ); for ( ; ; ) { @@ -339,7 +341,6 @@ void _MPCI_Receive_server( MPCI_SEMAPHORE_TQ_OPERATIONS, executing, true, - WATCHDOG_NO_TIMEOUT, &queue_context ); diff --git a/cpukit/score/src/mutex.c b/cpukit/score/src/mutex.c index ed374a0..ed600b3 100644 --- a/cpukit/score/src/mutex.c +++ b/cpukit/score/src/mutex.c @@ -104,7 +104,6 @@ static void _Mutex_Acquire_slow( Mutex_Control *mutex, Thread_Control *owner, Thread_Control *executing, - Watchdog_Interval timeout, Thread_queue_Context *queue_context ) { @@ -115,7 +114,6 @@ static void _Mutex_Acquire_slow( MUTEX_TQ_OPERATIONS, executing, STATES_WAITING_FOR_SYS_LOCK_MUTEX, - timeout, queue_context ); } @@ -219,7 +217,8 @@ void _Mutex_Acquire( struct _Mutex_Control *_mutex ) ++executing->resource_count; _Mutex_Queue_release( mutex, &queue_context ); } else { - _Mutex_Acquire_slow( mutex, owner, executing, 0, &queue_context ); + _Thread_queue_Context_set_no_timeout( &queue_context ); + _Mutex_Acquire_slow( mutex, owner, executing, &queue_context ); } } @@ -260,7 +259,8 @@ int _Mutex_Acquire_timed( break; } - _Mutex_Acquire_slow( mutex, owner, executing, ticks, &queue_context ); + _Thread_queue_Context_set_relative_timeout( &queue_context, ticks ); + _Mutex_Acquire_slow( mutex, owner, executing, &queue_context ); return STATUS_GET_POSIX( _Thread_Wait_get_status( executing ) ); } @@ -336,7 +336,8 @@ void _Mutex_recursive_Acquire( struct _Mutex_recursive_Control *_mutex ) ++mutex->nest_level; _Mutex_Queue_release( &mutex->Mutex, &queue_context ); } else { - _Mutex_Acquire_slow( &mutex->Mutex, owner, executing, 0, &queue_context ); + _Thread_queue_Context_set_no_timeout( &queue_context ); + _Mutex_Acquire_slow( &mutex->Mutex, owner, executing, &queue_context ); } } @@ -382,13 +383,8 @@ int _Mutex_recursive_Acquire_timed( break; } - _Mutex_Acquire_slow( - &mutex->Mutex, - owner, - executing, - ticks, - &queue_context - ); + _Thread_queue_Context_set_relative_timeout( &queue_context, ticks ); + _Mutex_Acquire_slow( &mutex->Mutex, owner, executing, &queue_context ); return STATUS_GET_POSIX( _Thread_Wait_get_status( executing ) ); } diff --git a/cpukit/score/src/semaphore.c b/cpukit/score/src/semaphore.c index 03af9cf..72cb1c7 100644 --- a/cpukit/score/src/semaphore.c +++ b/cpukit/score/src/semaphore.c @@ -101,12 +101,12 @@ void _Semaphore_Wait( struct _Semaphore_Control *_sem ) _Semaphore_Queue_release( sem, &queue_context ); } else { _Thread_queue_Context_set_expected_level( &queue_context, 1 ); + _Thread_queue_Context_set_no_timeout( &queue_context ); _Thread_queue_Enqueue_critical( &sem->Queue.Queue, SEMAPHORE_TQ_OPERATIONS, executing, STATES_WAITING_FOR_SYS_LOCK_SEMAPHORE, - WATCHDOG_NO_TIMEOUT, &queue_context ); } diff --git a/cpukit/score/src/threadqenqueue.c b/cpukit/score/src/threadqenqueue.c index 8bd1905..5892ef6 100644 --- a/cpukit/score/src/threadqenqueue.c +++ b/cpukit/score/src/threadqenqueue.c @@ -39,7 +39,6 @@ void _Thread_queue_Enqueue_critical( const Thread_queue_Operations *operations, Thread_Control *the_thread, States_Control state, - Watchdog_Interval timeout, Thread_queue_Context *queue_context ) { @@ -83,13 +82,28 @@ void _Thread_queue_Enqueue_critical( /* * If the thread wants to timeout, then schedule its timer. */ - if ( timeout != WATCHDOG_NO_TIMEOUT ) { - _Thread_Timer_insert_relative( - the_thread, - cpu_self, - _Thread_Timeout, - timeout - ); + switch ( queue_context->timeout_discipline ) { + case WATCHDOG_RELATIVE: + /* A relative timeout of 0 is a special case indefinite (no) timeout */ + if ( queue_context->timeout != 0 ) { + _Thread_Timer_insert_relative( + the_thread, + cpu_self, + _Thread_Timeout, + (Watchdog_Interval) queue_context->timeout + ); + } + break; + case WATCHDOG_ABSOLUTE: + _Thread_Timer_insert_absolute( + the_thread, + cpu_self, + _Thread_Timeout, + queue_context->timeout + ); + break; + default: + break; } /* diff --git a/cpukit/score/src/threadrestart.c b/cpukit/score/src/threadrestart.c index 21e260b..996ef73 100644 --- a/cpukit/score/src/threadrestart.c +++ b/cpukit/score/src/threadrestart.c @@ -472,7 +472,6 @@ void _Thread_Join( THREAD_JOIN_TQ_OPERATIONS, executing, waiting_for_join, - WATCHDOG_NO_TIMEOUT, queue_context ); } @@ -539,6 +538,7 @@ void _Thread_Close( Thread_Control *the_thread, Thread_Control *executing ) _Thread_queue_Context_initialize( &queue_context ); _Thread_queue_Context_set_expected_level( &queue_context, 2 ); + _Thread_queue_Context_set_no_timeout( &queue_context ); _Thread_State_acquire( the_thread, &queue_context.Lock_context ); _Thread_Join( the_thread, -- 1.9.1 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel