On 09/23/2010 06:55 PM, Angus Salkeld wrote:
> Signed-off-by: Angus Salkeld<[email protected]>
> ---
>   exec/Makefile.am |    2 +-
>   exec/fsm.h       |  125 
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>   2 files changed, 126 insertions(+), 1 deletions(-)
>   create mode 100644 exec/fsm.h
>
> diff --git a/exec/Makefile.am b/exec/Makefile.am
> index b2935de..a3a49bf 100644
> --- a/exec/Makefile.am
> +++ b/exec/Makefile.am
> @@ -75,7 +75,7 @@ noinst_HEADERS              = apidef.h crypto.h 
> mainconfig.h main.h tsafe.h \
>                         quorum.h service.h sync.h timer.h tlist.h 
> totemconfig.h \
>                         totemmrp.h totemnet.h totemudp.h totemiba.h 
> totemrrp.h \
>                         totemsrp.h util.h vsf.h wthread.h schedwrk.h \
> -                       evil.h syncv2.h
> +                       evil.h syncv2.h fsm.h
>
>   EXTRA_DIST          = $(LCRSO_SRC)
>
> diff --git a/exec/fsm.h b/exec/fsm.h
> new file mode 100644
> index 0000000..fbb0c7f
> --- /dev/null
> +++ b/exec/fsm.h
> @@ -0,0 +1,125 @@
> +/*
> + * Copyright (c) 2010 Red Hat
> + *
> + * All rights reserved.
> + *
> + * Author: Angus Salkeld<[email protected]>
> + *
> + * This software licensed under BSD license, the text of which follows:
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions are 
> met:
> + *
> + * - Redistributions of source code must retain the above copyright notice,
> + *   this list of conditions and the following disclaimer.
> + * - Redistributions in binary form must reproduce the above copyright 
> notice,
> + *   this list of conditions and the following disclaimer in the 
> documentation
> + *   and/or other materials provided with the distribution.
> + * - Neither the name of the MontaVista Software, Inc. nor the names of its
> + *   contributors may be used to endorse or promote products derived from 
> this
> + *   software without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 
> IS"
> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
> + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
> + * THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +#ifndef FSM_H_DEFINED
> +#define FSM_H_DEFINED
> +
> +#include<sys/time.h>
> +#include<corosync/corotypes.h>
> +
> +struct cs_fsm;
> +struct cs_fsm_entry;
> +typedef void (*cs_fsm_event_action_fn)(struct cs_fsm* fsm, int32_t event, 
> void * data);
> +typedef const char * (*cs_fsm_state_to_str_fn)(struct cs_fsm* fsm, int32_t 
> state);
> +typedef const char * (*cs_fsm_event_to_str_fn)(struct cs_fsm* fsm, int32_t 
> event);
> +#define CS_FSM_NEXT_STATE_SIZE 32
> +struct cs_fsm_entry {
> +     int32_t curr_state;
> +     int32_t event;
> +     cs_fsm_event_action_fn handler_fn;
> +     int32_t next_states[CS_FSM_NEXT_STATE_SIZE];
> +};
> +
> +struct cs_fsm {
> +     const char *name;
> +     int32_t curr_state;
> +     int32_t curr_entry;
> +     size_t entries;
> +     struct cs_fsm_entry *table;
> +     cs_fsm_state_to_str_fn state_to_str;
> +     cs_fsm_event_to_str_fn event_to_str;
> +};
> +
> +/*
> + * the table entry is defined by the state + event (curr_entry).
> + * so cs_fsm_process() sets the entry and cs_fsm_state_set()
> + * sets the new state.
> + */
> +static inline void cs_fsm_process (struct cs_fsm *fsm, int32_t new_event, 
> void * data)
> +{
> +     int32_t i;
> +
> +     for (i = 0; i<  fsm->entries; i++) {
> +             if (fsm->table[i].event == new_event&&
> +                 fsm->table[i].curr_state == fsm->curr_state) {
> +
> +                     assert (fsm->table[i].handler_fn != NULL);
> +                     /* set current entry */
> +                     fsm->curr_entry = i;
> +                     fsm->table[i].handler_fn (fsm, new_event, data);
> +                     return;
> +             }
> +     }
> +     log_printf (LOGSYS_LEVEL_ERROR, "Fsm:%s could not find event \"%s\" in 
> state \"%s\"",
> +             fsm->name, fsm->event_to_str(fsm, new_event), 
> fsm->state_to_str(fsm, fsm->curr_state));
> +     sleep(3);
> +     assert (0&&  "event not found");
> +}
> +
> +static inline void cs_fsm_state_set (struct cs_fsm* fsm, int32_t next_state, 
> void* data)
> +{
> +     int i;
> +     struct cs_fsm_entry *entry =&fsm->table[fsm->curr_entry];
> +
> +     if (fsm->curr_state == next_state) {
> +             return;
> +     }
> +     /*
> +      * confirm that "next_state" is in the current entry's next list
> +      */
> +     for (i = 0; i<  CS_FSM_NEXT_STATE_SIZE; i++) {
> +             if (entry->next_states[i]<  0) {
> +                     break;
> +             }
> +             if (entry->next_states[i] == next_state) {
> +                     log_printf (LOGSYS_LEVEL_INFO, "Fsm:%s event \"%s\", 
> state \"%s\" -->  \"%s\"\n",
> +                             fsm->name,
> +                             fsm->event_to_str(fsm, entry->event),
> +                             fsm->state_to_str(fsm, 
> fsm->table[fsm->curr_entry].curr_state),
> +                             fsm->state_to_str(fsm, next_state));
> +                     fsm->curr_state = next_state;
> +                     return;
> +             }
> +     }
> +     log_printf (LOGSYS_LEVEL_CRIT, "Fsm:%s Can't change state from \"%s\" 
> to \"%s\" (event was \"%s\")\n",
> +             fsm->name,
> +             fsm->state_to_str(fsm, fsm->table[fsm->curr_entry].curr_state),
> +             fsm->state_to_str(fsm, next_state),
> +             fsm->event_to_str(fsm, entry->event));
> +     sleep(3);
> +     assert (0&&  "invalid next state");
> +}
> +
> +#endif /* FSM_H_DEFINED */
> +
> +

The sleep (3) in this patch is problematic - don't want 3 second 
blocking in the executive.
_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to