On Fri, Sep 24, 2010 at 09:33:10AM -0700, Steven Dake wrote: > On 09/23/2010 06:55 PM, Angus Salkeld wrote: > >Signed-off-by: Angus Salkeld<asalk...@redhat.com> > >--- > > 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<asalk...@redhat.com> > >+ * > >+ * 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");
Steve this sleep is just before assert(0) so it is only there to make sure the log message gets out. -Angus > >+} > >+ > >+#endif /* FSM_H_DEFINED */ > >+ > >+ > > The sleep (3) in this patch is problematic - don't want 3 second > blocking in the executive. _______________________________________________ Openais mailing list Openais@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/openais