[rtems-central commit] spec: Improve rtems_task_wake_after()

Sebastian Huber sebh at rtems.org
Thu Aug 12 06:30:36 UTC 2021


Module:    rtems-central
Branch:    master
Commit:    02c729ff69f42632c969d63a71e1575bd79b7c6f
Changeset: http://git.rtems.org/rtems-central/commit/?id=02c729ff69f42632c969d63a71e1575bd79b7c6f

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Wed Aug 11 10:00:26 2021 +0200

spec: Improve rtems_task_wake_after()

---

 spec/rtems/task/req/wake-after.yml | 70 +++++++++++++++++++++++++++++++++++---
 1 file changed, 66 insertions(+), 4 deletions(-)

diff --git a/spec/rtems/task/req/wake-after.yml b/spec/rtems/task/req/wake-after.yml
index 860796f..ee7e9ee 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



More information about the vc mailing list