[PATCH] media-server: Add ability for retry.
Gedare Bloom
gedare at rtems.org
Fri Jul 17 05:43:27 UTC 2020
On Thu, Jul 9, 2020 at 2:21 AM Christian Mauderer
<christian.mauderer at embedded-brains.de> 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.
delete one 'this'
Glad you have this comment, that was my first thought when I read the
commit msg.
> */
> 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);
line length
How do you use a retry counter? It's not obvious to me, but this is
not an area I work with much.
> remember_event(event, state, src, dest);
>
> if (state == RTEMS_MEDIA_STATE_SUCCESS) {
> --
> 2.26.2
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
More information about the devel
mailing list