diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-08-11 10:00:26 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-08-11 10:00:26 +0200 |
commit | 02c729ff69f42632c969d63a71e1575bd79b7c6f (patch) | |
tree | b834785bec40b90a421ac856ec21f7430d3a6c15 | |
parent | modules: Update rtems (diff) | |
download | rtems-central-02c729ff69f42632c969d63a71e1575bd79b7c6f.tar.bz2 |
spec: Improve rtems_task_wake_after()
-rw-r--r-- | spec/rtems/task/req/wake-after.yml | 70 |
1 files changed, 66 insertions, 4 deletions
diff --git a/spec/rtems/task/req/wake-after.yml b/spec/rtems/task/req/wake-after.yml index 860796f8..ee7e9ee7 100644 --- a/spec/rtems/task/req/wake-after.yml +++ b/spec/rtems/task/req/wake-after.yml @@ -65,6 +65,12 @@ post-conditions: text: | The calling task shall yield by the scheduler exactly once by the ${../if/wake-after:/name} call. + - name: Nop + test-code: | + T_eq_sz( ctx->scheduler_log.header.recorded, 0 ); + text: | + The calling task shall not carry out a scheduler operation through the + ${../if/wake-after:/name} call. test-epilogue: null test-prologue: null pre-conditions: @@ -84,6 +90,20 @@ pre-conditions: ${../if/yield-processor:/name}. test-epilogue: null test-prologue: null +- name: Suspended + states: + - name: 'Yes' + test-code: | + ctx->suspended = true; + text: | + While the calling task is suspended. + - name: 'No' + test-code: | + ctx->suspended = false; + text: | + While the calling task is not suspended. + test-epilogue: null + test-prologue: null rationale: null references: [] requirement-type: functional @@ -92,6 +112,11 @@ test-action: | ResumeTask( ctx->worker_id ); (void) T_scheduler_record( NULL ); GetTaskTimerInfo( ctx->worker_id, &ctx->timer_info ); + + if ( ctx->suspended ) { + ResumeTask( ctx->worker_id ); + } + FinalClockTick(); test-brief: null test-cleanup: null @@ -113,6 +138,12 @@ test-context: member: | rtems_id worker_id; - brief: | + If this member is true, then the worker shall be suspended during the + ${../if/wake-after:/name} call. + description: null + member: | + bool suspended; +- brief: | This member contains the timer information of the worker task. description: null member: | @@ -136,6 +167,7 @@ test-includes: - rtems.h - rtems/test-scheduler.h - rtems/score/timecounter.h +- rtems/score/threaddispatch.h test-local-includes: - tx-support.h test-prepare: | @@ -162,11 +194,29 @@ test-support: | SuspendSelf(); + ctx->now = rtems_clock_get_ticks_since_boot(); + + if ( ctx->suspended ) { + Per_CPU_Control *cpu_self; + + /* + * The rtems_task_wake_after() disables thread dispatching to carry out + * its operations. While thread dispatching is disabled, when an + * interrupt suspends the calling task, the suspended task executes + * until it enables thread dispatching. We simulate this situation + * with the code below. Where the system was built with SMP support + * enabled, other processors may suspend an executing task in parallel. + * This case is also simulated by the code below. + */ + cpu_self = _Thread_Dispatch_disable(); + SuspendSelf(); + cpu_self->dispatch_necessary = false; + _Thread_Dispatch_enable( cpu_self ); + } + log = T_scheduler_record_4( &ctx->scheduler_log ); T_null( log ); - ctx->now = rtems_clock_get_ticks_since_boot(); - ctx->status = rtems_task_wake_after( ctx->ticks ); (void) T_scheduler_record( NULL ); @@ -186,17 +236,29 @@ transition-map: Status: Ok Timer: Ticks Expire: Relative - Scheduler: Block + Scheduler: + - if: + pre-conditions: + Suspended: 'Yes' + then: Nop + - else: Block pre-conditions: Ticks: - Interval + Suspended: all - enabled-by: true post-conditions: Status: Ok Timer: Inactive Expire: N/A - Scheduler: Yield + Scheduler: + - if: + pre-conditions: + Suspended: 'Yes' + then: Nop + - else: Yield pre-conditions: Ticks: - Yield + Suspended: all type: requirement |