[PATCH 1/4] cpukit: Add and use Watchdog_Discipline.
Gedare Bloom
gedare at rtems.org
Thu Jun 23 19:26:44 UTC 2016
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 | 5 ++-
cpukit/posix/include/rtems/posix/pthreadimpl.h | 3 +-
cpukit/posix/src/condwaitsupp.c | 3 +-
cpukit/posix/src/mqueuerecvsupp.c | 3 +-
cpukit/posix/src/mqueuesendsupp.c | 3 +-
cpukit/posix/src/mutexlocksupp.c | 5 +--
cpukit/posix/src/nanosleep.c | 1 +
cpukit/posix/src/pbarrierwait.c | 2 +-
cpukit/posix/src/prwlockrdlock.c | 2 +-
cpukit/posix/src/prwlocktimedrdlock.c | 3 +-
cpukit/posix/src/prwlocktimedwrlock.c | 3 +-
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 | 3 +-
cpukit/posix/src/sigtimedwait.c | 3 +-
cpukit/posix/src/ualarm.c | 3 +-
cpukit/rtems/src/barrierwait.c | 3 +-
cpukit/rtems/src/eventseize.c | 5 ++-
cpukit/rtems/src/msgqreceive.c | 3 +-
cpukit/rtems/src/msgqsend.c | 1 -
cpukit/rtems/src/msgqurgent.c | 1 -
cpukit/rtems/src/ratemonperiod.c | 3 +-
cpukit/rtems/src/regiongetsegment.c | 1 +
cpukit/rtems/src/semobtain.c | 8 ++--
cpukit/rtems/src/taskwakeafter.c | 5 ++-
cpukit/rtems/src/taskwakewhen.c | 5 ++-
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 | 12 ++++--
cpukit/score/include/rtems/score/threadimpl.h | 32 +++++---------
cpukit/score/include/rtems/score/threadq.h | 12 ++++++
cpukit/score/include/rtems/score/threadqimpl.h | 46 +++++++++++++++++---
cpukit/score/include/rtems/score/watchdog.h | 40 +++++++++++++----
cpukit/score/include/rtems/score/watchdogimpl.h | 50 +++++++++-------------
cpukit/score/src/apimutexlock.c | 3 +-
cpukit/score/src/condition.c | 19 +++++---
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 | 22 +++++-----
cpukit/score/src/semaphore.c | 2 +-
cpukit/score/src/threadqenqueue.c | 27 ++++++++----
cpukit/score/src/threadrestart.c | 2 +-
53 files changed, 218 insertions(+), 183 deletions(-)
diff --git a/cpukit/libnetworking/rtems/rtems_glue.c b/cpukit/libnetworking/rtems/rtems_glue.c
index e9b371f..6e54f2f 100644
--- a/cpukit/libnetworking/rtems/rtems_glue.c
+++ b/cpukit/libnetworking/rtems/rtems_glue.c
@@ -377,11 +377,14 @@ 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_discipline(
+ &queue_context,
+ WATCHDOG_NO_TIMEOUT
+ );
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/include/rtems/posix/pthreadimpl.h b/cpukit/posix/include/rtems/posix/pthreadimpl.h
index 988246e..5f14ef7 100644
--- a/cpukit/posix/include/rtems/posix/pthreadimpl.h
+++ b/cpukit/posix/include/rtems/posix/pthreadimpl.h
@@ -61,9 +61,10 @@ RTEMS_INLINE_ROUTINE void _POSIX_Threads_Sporadic_timer_insert(
the_thread->cpu_time_budget =
_Timespec_To_ticks( &api->Attributes.schedparam.sched_ss_init_budget );
- _Watchdog_Per_CPU_insert_relative(
+ _Watchdog_Per_CPU_insert(
&api->Sporadic.Timer,
_Per_CPU_Get(),
+ WATCHDOG_RELATIVE,
_Timespec_To_ticks( &api->Attributes.schedparam.sched_ss_repl_period )
);
}
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..1a376d1 100644
--- a/cpukit/posix/src/mqueuerecvsupp.c
+++ b/cpukit/posix/src/mqueuerecvsupp.c
@@ -97,13 +97,14 @@ ssize_t _POSIX_Message_queue_Receive_support(
* Now perform the actual message receive
*/
executing = _Thread_Executing;
+ _Thread_queue_Context_set_timeout( &queue_context, timeout );
+ _Thread_queue_Context_set_discipline( &queue_context, WATCHDOG_RELATIVE );
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..91c7c2c 100644
--- a/cpukit/posix/src/mqueuesendsupp.c
+++ b/cpukit/posix/src/mqueuesendsupp.c
@@ -92,6 +92,8 @@ int _POSIX_Message_queue_Send_support(
* Now perform the actual message receive
*/
executing = _Thread_Executing;
+ _Thread_queue_Context_set_timeout( &queue_context, timeout );
+ _Thread_queue_Context_set_discipline( &queue_context, WATCHDOG_RELATIVE );
status = _CORE_message_queue_Submit(
&the_mq->Message_queue,
executing,
@@ -99,7 +101,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..c4079ef 100644
--- a/cpukit/posix/src/mutexlocksupp.c
+++ b/cpukit/posix/src/mutexlocksupp.c
@@ -63,6 +63,8 @@ int _POSIX_Mutex_Lock_support(
}
executing = _Thread_Executing;
+ _Thread_queue_Context_set_timeout( &queue_context, timeout );
+ _Thread_queue_Context_set_discipline( &queue_context, WATCHDOG_RELATIVE );
switch ( the_mutex->protocol ) {
case POSIX_MUTEX_PRIORITY_CEILING:
@@ -70,7 +72,6 @@ int _POSIX_Mutex_Lock_support(
&the_mutex->Mutex,
executing,
wait,
- timeout,
_POSIX_Mutex_Lock_nested,
&queue_context
);
@@ -81,7 +82,6 @@ int _POSIX_Mutex_Lock_support(
POSIX_MUTEX_NO_PROTOCOL_TQ_OPERATIONS,
executing,
wait,
- timeout,
_POSIX_Mutex_Lock_nested,
&queue_context
);
@@ -92,7 +92,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..6a72d9b 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_discipline( &queue_context, WATCHDOG_NO_TIMEOUT );
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..5bb9215 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_discipline( &queue_context, WATCHDOG_NO_TIMEOUT );
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..c7f1600 100644
--- a/cpukit/posix/src/prwlocktimedrdlock.c
+++ b/cpukit/posix/src/prwlocktimedrdlock.c
@@ -56,11 +56,12 @@ int pthread_rwlock_timedrdlock(
return EINVAL;
}
+ _Thread_queue_Context_set_timeout( &queue_context, ticks );
+ _Thread_queue_Context_set_discipline( &queue_context, WATCHDOG_RELATIVE );
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..ad6af40 100644
--- a/cpukit/posix/src/prwlocktimedwrlock.c
+++ b/cpukit/posix/src/prwlocktimedwrlock.c
@@ -58,11 +58,12 @@ int pthread_rwlock_timedwrlock(
return EINVAL;
}
+ _Thread_queue_Context_set_timeout( &queue_context, ticks );
+ _Thread_queue_Context_set_discipline( &queue_context, WATCHDOG_RELATIVE );
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..3f4df2d 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_discipline( &queue_context, WATCHDOG_NO_TIMEOUT );
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..9db24ae 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_discipline( &queue_context, WATCHDOG_NO_TIMEOUT );
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..54fc8d5 100644
--- a/cpukit/posix/src/semaphorewaitsupp.c
+++ b/cpukit/posix/src/semaphorewaitsupp.c
@@ -41,12 +41,13 @@ int _POSIX_Semaphore_Wait_support(
rtems_set_errno_and_return_minus_one( EINVAL );
}
+ _Thread_queue_Context_set_timeout( &queue_context, timeout );
+ _Thread_queue_Context_set_discipline( &queue_context, WATCHDOG_RELATIVE );
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..6ea8d2f 100644
--- a/cpukit/posix/src/sigtimedwait.c
+++ b/cpukit/posix/src/sigtimedwait.c
@@ -153,12 +153,13 @@ 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_timeout( &queue_context, interval );
+ _Thread_queue_Context_set_discipline( &queue_context, WATCHDOG_RELATIVE );
_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/posix/src/ualarm.c b/cpukit/posix/src/ualarm.c
index 86fe1b0..07bbdea 100644
--- a/cpukit/posix/src/ualarm.c
+++ b/cpukit/posix/src/ualarm.c
@@ -55,9 +55,10 @@ static void _POSIX_signals_Ualarm_TSR( Watchdog_Control *the_watchdog )
* If the reset interval is non-zero, reschedule ourselves.
*/
if ( _POSIX_signals_Ualarm_interval != 0 ) {
- _Watchdog_Per_CPU_insert_relative(
+ _Watchdog_Per_CPU_insert(
the_watchdog,
_Per_CPU_Get(),
+ WATCHDOG_RELATIVE,
_POSIX_signals_Ualarm_interval
);
}
diff --git a/cpukit/rtems/src/barrierwait.c b/cpukit/rtems/src/barrierwait.c
index 5f1f023..c645aa1 100644
--- a/cpukit/rtems/src/barrierwait.c
+++ b/cpukit/rtems/src/barrierwait.c
@@ -38,11 +38,12 @@ rtems_status_code rtems_barrier_wait(
return RTEMS_INVALID_ID;
}
+ _Thread_queue_Context_set_timeout( &queue_context, timeout );
+ _Thread_queue_Context_set_discipline( &queue_context, WATCHDOG_RELATIVE );
status = _CORE_barrier_Seize(
&the_barrier->Barrier,
_Thread_Executing,
true,
- timeout,
&queue_context
);
return _Status_Get( status );
diff --git a/cpukit/rtems/src/eventseize.c b/cpukit/rtems/src/eventseize.c
index c91d308..468e066 100644
--- a/cpukit/rtems/src/eventseize.c
+++ b/cpukit/rtems/src/eventseize.c
@@ -81,11 +81,12 @@ rtems_status_code _Event_Seize(
_Thread_Lock_release_default( executing, lock_context );
if ( ticks ) {
- _Thread_Timer_insert_relative(
+ _Thread_Timer_insert(
executing,
cpu_self,
_Thread_Timeout,
- ticks
+ ticks,
+ WATCHDOG_RELATIVE
);
}
diff --git a/cpukit/rtems/src/msgqreceive.c b/cpukit/rtems/src/msgqreceive.c
index 75c15be..72c0955 100644
--- a/cpukit/rtems/src/msgqreceive.c
+++ b/cpukit/rtems/src/msgqreceive.c
@@ -61,13 +61,14 @@ rtems_status_code rtems_message_queue_receive(
);
executing = _Thread_Executing;
+ _Thread_queue_Context_set_timeout( &queue_context, timeout );
+ _Thread_queue_Context_set_discipline( &queue_context, WATCHDOG_RELATIVE );
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/ratemonperiod.c b/cpukit/rtems/src/ratemonperiod.c
index 771f9c1..10a65f47 100644
--- a/cpukit/rtems/src/ratemonperiod.c
+++ b/cpukit/rtems/src/ratemonperiod.c
@@ -77,9 +77,10 @@ static void _Rate_monotonic_Release_job(
_Rate_monotonic_Release( owner, lock_context );
_ISR_lock_ISR_disable( lock_context );
- deadline = _Watchdog_Per_CPU_insert_relative(
+ deadline = _Watchdog_Per_CPU_insert(
&the_period->Timer,
cpu_self,
+ WATCHDOG_RELATIVE,
next_length
);
_ISR_lock_ISR_enable( lock_context );
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..d2771c4 100644
--- a/cpukit/rtems/src/semobtain.c
+++ b/cpukit/rtems/src/semobtain.c
@@ -69,13 +69,15 @@ rtems_status_code rtems_semaphore_obtain(
executing = _Thread_Executing;
wait = !_Options_Is_no_wait( option_set );
+ _Thread_queue_Context_set_timeout( &queue_context, timeout );
+ _Thread_queue_Context_set_discipline( &queue_context, WATCHDOG_RELATIVE );
+
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 +87,6 @@ rtems_status_code rtems_semaphore_obtain(
&the_semaphore->Core_control.Mutex,
executing,
wait,
- timeout,
_CORE_recursive_mutex_Seize_nested,
&queue_context
);
@@ -96,7 +97,6 @@ rtems_status_code rtems_semaphore_obtain(
_Semaphore_Get_operations( the_semaphore ),
executing,
wait,
- timeout,
_CORE_recursive_mutex_Seize_nested,
&queue_context
);
@@ -107,7 +107,6 @@ rtems_status_code rtems_semaphore_obtain(
&the_semaphore->Core_control.MRSP,
executing,
wait,
- timeout,
&queue_context
);
break;
@@ -122,7 +121,6 @@ rtems_status_code rtems_semaphore_obtain(
_Semaphore_Get_operations( the_semaphore ),
executing,
wait,
- timeout,
&queue_context
);
break;
diff --git a/cpukit/rtems/src/taskwakeafter.c b/cpukit/rtems/src/taskwakeafter.c
index fa5f6f4..c1a8234 100644
--- a/cpukit/rtems/src/taskwakeafter.c
+++ b/cpukit/rtems/src/taskwakeafter.c
@@ -41,11 +41,12 @@ rtems_status_code rtems_task_wake_after(
} else {
_Thread_Set_state( executing, STATES_DELAYING );
_Thread_Wait_flags_set( executing, THREAD_WAIT_STATE_BLOCKED );
- _Thread_Timer_insert_relative(
+ _Thread_Timer_insert(
executing,
cpu_self,
_Thread_Timeout,
- ticks
+ ticks,
+ WATCHDOG_RELATIVE
);
}
_Thread_Dispatch_enable( cpu_self );
diff --git a/cpukit/rtems/src/taskwakewhen.c b/cpukit/rtems/src/taskwakewhen.c
index 5d6d45a..6b76d3e 100644
--- a/cpukit/rtems/src/taskwakewhen.c
+++ b/cpukit/rtems/src/taskwakewhen.c
@@ -52,11 +52,12 @@ rtems_status_code rtems_task_wake_when(
executing = _Thread_Executing;
_Thread_Set_state( executing, STATES_WAITING_FOR_TIME );
_Thread_Wait_flags_set( executing, THREAD_WAIT_STATE_BLOCKED );
- _Thread_Timer_insert_absolute(
+ _Thread_Timer_insert(
executing,
cpu_self,
_Thread_Timeout,
- _Watchdog_Ticks_from_seconds( seconds )
+ _Watchdog_Ticks_from_seconds( seconds ),
+ WATCHDOG_ABSOLUTE
);
_Thread_Dispatch_enable( cpu_self );
return RTEMS_SUCCESSFUL;
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..2bf9620 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;
+ Watchdog_Discipline discipline = queue_context->timeout_discipline;
rival.thread = executing;
rival.resource = mrsp;
@@ -280,7 +281,12 @@ RTEMS_INLINE_ROUTINE Status_Control _MRSP_Wait_for_ownership(
_Watchdog_Preinitialize( &rival.Watchdog, cpu_self );
_Watchdog_Initialize( &rival.Watchdog, _MRSP_Timeout );
_ISR_Local_disable( level );
- _Watchdog_Per_CPU_insert_relative( &rival.Watchdog, cpu_self, timeout );
+ _Watchdog_Per_CPU_insert(
+ &rival.Watchdog,
+ cpu_self,
+ discipline,
+ timeout
+ );
_ISR_Local_enable( level );
}
@@ -317,7 +323,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 +362,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..b09e7dd 100644
--- a/cpukit/score/include/rtems/score/threadimpl.h
+++ b/cpukit/score/include/rtems/score/threadimpl.h
@@ -1466,38 +1466,26 @@ RTEMS_INLINE_ROUTINE void _Thread_Timer_initialize(
_Watchdog_Preinitialize( &timer->Watchdog, cpu );
}
-RTEMS_INLINE_ROUTINE void _Thread_Timer_insert_relative(
+RTEMS_INLINE_ROUTINE void _Thread_Timer_insert(
Thread_Control *the_thread,
Per_CPU_Control *cpu,
Watchdog_Service_routine_entry routine,
- Watchdog_Interval ticks
+ uint64_t ticks,
+ Watchdog_Discipline discipline
)
{
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_RELATIVE ];
- the_thread->Timer.Watchdog.routine = routine;
- _Watchdog_Per_CPU_insert_relative( &the_thread->Timer.Watchdog, cpu, ticks );
-
- _ISR_lock_Release_and_ISR_enable( &the_thread->Timer.Lock, &lock_context );
-}
-
-RTEMS_INLINE_ROUTINE void _Thread_Timer_insert_absolute(
- Thread_Control *the_thread,
- Per_CPU_Control *cpu,
- Watchdog_Service_routine_entry routine,
- uint64_t expire
-)
-{
- 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 ];
+ if ( discipline == WATCHDOG_RELATIVE ) {
+ the_thread->Timer.header = &cpu->Watchdog.Header[PER_CPU_WATCHDOG_RELATIVE];
+ } else {
+ _Assert( discipline == 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( &the_thread->Timer.Watchdog, cpu, discipline, ticks );
_ISR_lock_Release_and_ISR_enable( &the_thread->Timer.Lock, &lock_context );
}
diff --git a/cpukit/score/include/rtems/score/threadq.h b/cpukit/score/include/rtems/score/threadq.h
index a4e5292..79cc4c6 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 Interval to wait.
+ */
+ Watchdog_Interval timeout;
+
+ /**
+ * @brief The clock discipline for the interval timeout.
+ * Use WATCHDOG_NO_TIMEOUT to block indefinitely.
+ */
+ Watchdog_Discipline timeout_discipline;
+
+ /**
* @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..dde3d27 100644
--- a/cpukit/score/include/rtems/score/threadqimpl.h
+++ b/cpukit/score/include/rtems/score/threadqimpl.h
@@ -91,6 +91,40 @@ _Thread_queue_Context_set_expected_level(
}
/**
+ * @brief Sets the 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_timeout(
+ Thread_queue_Context *queue_context,
+ Watchdog_Interval timeout
+)
+{
+ queue_context->timeout = timeout;
+}
+
+/**
+ * @brief Sets the clock discipline for the 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_discipline(
+ Thread_queue_Context *queue_context,
+ Watchdog_Discipline discipline
+)
+{
+ queue_context->timeout_discipline = discipline;
+}
+
+/**
* @brief Sets the MP callout in the thread queue context.
*
* @param queue_context The thread queue context.
@@ -305,8 +339,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 +382,6 @@ Thread_Control *_Thread_queue_Do_dequeue(
* MUTEX_TQ_OPERATIONS,
* executing,
* STATES_WAITING_FOR_MUTEX,
- * WATCHDOG_NO_TIMEOUT,
* 0,
* &queue_context
* );
@@ -360,8 +393,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 +400,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 +413,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 +422,13 @@ 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 );
+ _Thread_queue_Context_set_timeout( &queue_context, timeout );
+ _Thread_queue_Context_set_discipline( &queue_context, discipline );
_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..9ba30a5 100644
--- a/cpukit/score/include/rtems/score/watchdogimpl.h
+++ b/cpukit/score/include/rtems/score/watchdogimpl.h
@@ -339,46 +339,36 @@ RTEMS_INLINE_ROUTINE void _Watchdog_Per_CPU_release_critical(
_ISR_lock_Release( &cpu->Watchdog.Lock, lock_context );
}
-RTEMS_INLINE_ROUTINE uint64_t _Watchdog_Per_CPU_insert_relative(
- Watchdog_Control *the_watchdog,
- Per_CPU_Control *cpu,
- uint32_t ticks
+RTEMS_INLINE_ROUTINE uint64_t _Watchdog_Per_CPU_insert(
+ Watchdog_Control *the_watchdog,
+ Per_CPU_Control *cpu,
+ Watchdog_Discipline discipline,
+ uint64_t ticks
)
{
ISR_lock_Context lock_context;
- uint64_t expire;
+ Watchdog_Header *header;
_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 );
-
- return expire;
-}
-
-RTEMS_INLINE_ROUTINE void _Watchdog_Per_CPU_insert_absolute(
- Watchdog_Control *the_watchdog,
- Per_CPU_Control *cpu,
- uint64_t expire
-)
-{
- ISR_lock_Context lock_context;
- _Watchdog_Set_CPU( the_watchdog, cpu );
+ switch ( discipline ) {
+ case WATCHDOG_RELATIVE:
+ ticks += cpu->Watchdog.ticks;
+ header = &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_RELATIVE ];
+ break;
+ case WATCHDOG_ABSOLUTE:
+ header = &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_ABSOLUTE ];
+ break;
+ default:
+ _Assert(0);
+ break;
+ }
- _Watchdog_Per_CPU_acquire_critical( cpu, &lock_context );
- _Watchdog_Insert(
- &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_ABSOLUTE ],
- the_watchdog,
- expire
- );
+ _Watchdog_Insert(header, the_watchdog, ticks);
_Watchdog_Per_CPU_release_critical( cpu, &lock_context );
+ return ticks;
}
RTEMS_INLINE_ROUTINE void _Watchdog_Per_CPU_remove(
diff --git a/cpukit/score/src/apimutexlock.c b/cpukit/score/src/apimutexlock.c
index df53e75..1b452e8 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_discipline( &queue_context, WATCHDOG_NO_TIMEOUT );
_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..c388d94 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_discipline( &queue_context, WATCHDOG_NO_TIMEOUT );
+ cpu_self = _Condition_Do_wait(
+ _condition,
+ &queue_context
+ );
_Mutex_Release( _mutex );
_Thread_Dispatch_enable( cpu_self );
@@ -151,7 +153,9 @@ int _Condition_Wait_timed(
break;
}
- cpu_self = _Condition_Do_wait( _condition, ticks, &queue_context );
+ _Thread_queue_Context_set_timeout( &queue_context, ticks );
+ _Thread_queue_Context_set_discipline( &queue_context, WATCHDOG_RELATIVE );
+ cpu_self = _Condition_Do_wait( _condition, &queue_context );
_Mutex_Release( _mutex );
executing = cpu_self->executing;
@@ -173,7 +177,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_discipline( &queue_context, WATCHDOG_NO_TIMEOUT );
+ cpu_self = _Condition_Do_wait( _condition, &queue_context );
nest_level = _mutex->_nest_level;
_mutex->_nest_level = 0;
@@ -211,7 +216,9 @@ int _Condition_Wait_recursive_timed(
break;
}
- cpu_self = _Condition_Do_wait( _condition, ticks, &queue_context );
+ _Thread_queue_Context_set_timeout( &queue_context, ticks );
+ _Thread_queue_Context_set_discipline( &queue_context, WATCHDOG_RELATIVE );
+ 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..55543f3 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_discipline( &queue_context, WATCHDOG_NO_TIMEOUT );
_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..2d2f9fa 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_discipline( &queue_context, WATCHDOG_NO_TIMEOUT );
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..4b5127c 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_discipline( &queue_context, WATCHDOG_NO_TIMEOUT );
+ _Mutex_Acquire_slow( mutex, owner, executing, &queue_context );
}
}
@@ -260,7 +259,9 @@ int _Mutex_Acquire_timed(
break;
}
- _Mutex_Acquire_slow( mutex, owner, executing, ticks, &queue_context );
+ _Thread_queue_Context_set_timeout( &queue_context, ticks );
+ _Thread_queue_Context_set_discipline( &queue_context, WATCHDOG_RELATIVE );
+ _Mutex_Acquire_slow( mutex, owner, executing, &queue_context );
return STATUS_GET_POSIX( _Thread_Wait_get_status( executing ) );
}
@@ -336,7 +337,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_discipline( &queue_context, WATCHDOG_NO_TIMEOUT );
+ _Mutex_Acquire_slow( &mutex->Mutex, owner, executing, &queue_context );
}
}
@@ -382,13 +384,9 @@ int _Mutex_recursive_Acquire_timed(
break;
}
- _Mutex_Acquire_slow(
- &mutex->Mutex,
- owner,
- executing,
- ticks,
- &queue_context
- );
+ _Thread_queue_Context_set_timeout( &queue_context, ticks );
+ _Thread_queue_Context_set_discipline( &queue_context, WATCHDOG_RELATIVE );
+ _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..799bd0a 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_discipline( &queue_context, WATCHDOG_NO_TIMEOUT );
_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..ee8089a 100644
--- a/cpukit/score/src/threadqenqueue.c
+++ b/cpukit/score/src/threadqenqueue.c
@@ -39,12 +39,13 @@ 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
)
{
Per_CPU_Control *cpu_self;
bool success;
+ Watchdog_Interval timeout = queue_context->timeout;
+ Watchdog_Discipline discipline = queue_context->timeout_discipline;
#if defined(RTEMS_MULTIPROCESSING)
if ( _Thread_MP_Is_receive( the_thread ) && the_thread->receive_packet ) {
@@ -83,13 +84,23 @@ 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 ( discipline ) {
+ case WATCHDOG_RELATIVE:
+ if ( timeout == WATCHDOG_NO_TIMEOUT ) {
+ /* A relative timeout of 0 is an indefinite wait */
+ break;
+ } /* Fall-through */
+ case WATCHDOG_ABSOLUTE:
+ _Thread_Timer_insert(
+ the_thread,
+ cpu_self,
+ _Thread_Timeout,
+ timeout,
+ discipline
+ );
+ break;
+ default:
+ break;
}
/*
diff --git a/cpukit/score/src/threadrestart.c b/cpukit/score/src/threadrestart.c
index 21e260b..ad16e6a 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_discipline( &queue_context, WATCHDOG_NO_TIMEOUT );
_Thread_State_acquire( the_thread, &queue_context.Lock_context );
_Thread_Join(
the_thread,
--
1.9.1
More information about the devel
mailing list