[rtems commit] media-server: Add ability for retry.

Christian Mauderer christianm at rtems.org
Fri Jul 17 06:13:39 UTC 2020


Module:    rtems
Branch:    master
Commit:    3a95a07d88a6926bd2f67dc53c977b8dbc828f9c
Changeset: http://git.rtems.org/rtems/commit/?id=3a95a07d88a6926bd2f67dc53c977b8dbc828f9c

Author:    Christian Mauderer <christian.mauderer at embedded-brains.de>
Date:      Thu Jul  9 10:21:29 2020 +0200

media-server: Add ability for retry.

This adds the possibility to request a retry in the media-listener if an
operation failed. Usefull for example if you want to automatically
reformat a disk if it wasn't possible to mount it.

---

 cpukit/include/rtems/media.h |  3 +++
 cpukit/libblock/src/media.c  | 30 +++++++++++++++++-------------
 2 files changed, 20 insertions(+), 13 deletions(-)

diff --git a/cpukit/include/rtems/media.h b/cpukit/include/rtems/media.h
index b2a3e2d..3fea38b 100644
--- a/cpukit/include/rtems/media.h
+++ b/cpukit/include/rtems/media.h
@@ -281,6 +281,9 @@ typedef enum {
  *
  * @retval RTEMS_SUCCESSFUL Successful operation.
  * @retval RTEMS_IO_ERROR In the inquiry state this will abort the action.
+ * @retval RTEMS_INCORRECT_STATE In the failed state this will cause a retry.
+ * Make sure to have a retry counter or similar to avoid endless loops if you
+ * use this value.
  */
 typedef rtems_status_code (*rtems_media_listener)(
   rtems_media_event event,
diff --git a/cpukit/libblock/src/media.c b/cpukit/libblock/src/media.c
index 5b2b06b..dd604d3 100644
--- a/cpukit/libblock/src/media.c
+++ b/cpukit/libblock/src/media.c
@@ -420,26 +420,30 @@ static rtems_status_code process_event(
 )
 {
   rtems_status_code sc = RTEMS_SUCCESSFUL;
+  rtems_status_code sc_retry = RTEMS_SUCCESSFUL;
   rtems_media_state state = RTEMS_MEDIA_STATE_FAILED;
   char *dest = NULL;
 
-  sc = notify(event, RTEMS_MEDIA_STATE_INQUIRY, src, NULL);
-  if (sc == RTEMS_SUCCESSFUL) {
-    state = RTEMS_MEDIA_STATE_READY;
-  } else {
-    state = RTEMS_MEDIA_STATE_ABORTED;
-  }
-
-  sc = (*worker)(state, src, &dest, worker_arg);
-  if (state == RTEMS_MEDIA_STATE_READY) {
+  do {
+    sc = notify(event, RTEMS_MEDIA_STATE_INQUIRY, src, NULL);
     if (sc == RTEMS_SUCCESSFUL) {
-      state = RTEMS_MEDIA_STATE_SUCCESS;
+      state = RTEMS_MEDIA_STATE_READY;
     } else {
-      state = RTEMS_MEDIA_STATE_FAILED;
+      state = RTEMS_MEDIA_STATE_ABORTED;
+    }
+
+    sc = (*worker)(state, src, &dest, worker_arg);
+    if (state == RTEMS_MEDIA_STATE_READY) {
+      if (sc == RTEMS_SUCCESSFUL) {
+        state = RTEMS_MEDIA_STATE_SUCCESS;
+      } else {
+        state = RTEMS_MEDIA_STATE_FAILED;
+      }
     }
-  }
 
-  notify(event, state, src, dest);
+    sc_retry = notify(event, state, src, dest);
+  } while (state == RTEMS_MEDIA_STATE_FAILED
+    && sc_retry == RTEMS_INCORRECT_STATE);
   remember_event(event, state, src, dest);
 
   if (state == RTEMS_MEDIA_STATE_SUCCESS) {



More information about the vc mailing list