[PATCH] media-server: Add ability for retry.

Christian Mauderer christian.mauderer at embedded-brains.de
Fri Jul 17 05:29:28 UTC 2020


Ping.

On 09/07/2020 10:21, Christian Mauderer wrote:
> 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  | 29 ++++++++++++++++-------------
>  2 files changed, 19 insertions(+), 13 deletions(-)
> 
> diff --git a/cpukit/include/rtems/media.h b/cpukit/include/rtems/media.h
> index b2a3e2dc91..db13664975 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 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 5b2b06b5b2..c00825587c 100644
> --- a/cpukit/libblock/src/media.c
> +++ b/cpukit/libblock/src/media.c
> @@ -420,26 +420,29 @@ 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) {
> 

-- 
--------------------------------------------
embedded brains GmbH
Herr Christian Mauderer
Dornierstr. 4
D-82178 Puchheim
Germany
email: christian.mauderer at embedded-brains.de
Phone: +49-89-18 94 741 - 18
Fax:   +49-89-18 94 741 - 08
PGP: Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.


More information about the devel mailing list