This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
tnt gerrit-no-reply at lists.osmocom.orgtnt has uploaded this change for review. ( https://gerrit.osmocom.org/12983 Change subject: [WIP] fsm: Delay processing events after dispatch is complete ...................................................................... [WIP] fsm: Delay processing events after dispatch is complete Change-Id: I6f0c64d21d57512c5b329b561ccd415a93790dec Signed-off-by: Sylvain Munaut <tnt at 246tNt.com> --- M include/osmocom/core/fsm.h M src/fsm.c 2 files changed, 72 insertions(+), 13 deletions(-) git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/83/12983/1 diff --git a/include/osmocom/core/fsm.h b/include/osmocom/core/fsm.h index df7e348..c1144c6 100644 --- a/include/osmocom/core/fsm.h +++ b/include/osmocom/core/fsm.h @@ -17,6 +17,9 @@ struct osmo_fsm_inst; +/*! Maximum number of pending events to be disptached to an FSM instance */ +#define OSMO_FSM_MAX_PENDING_EVENTS 8 + enum osmo_fsm_term_cause { /*! terminate because parent terminated */ OSMO_FSM_TERM_PARENT, @@ -115,6 +118,20 @@ /*! \ref llist_head linked to parent->proc.children */ struct llist_head child; } proc; + + /*! Busy inside dispatch */ + int in_dispatch; + + /*! Queue of events to dispatch */ + struct { + uint32_t event; + void *data; + const char *src_file; + int src_line; + } evt_queue[OSMO_FSM_MAX_PENDING_EVENTS]; + + /*! Number of events queued */ + int evt_queue_len; }; void osmo_fsm_log_addr(bool log_addr); diff --git a/src/fsm.c b/src/fsm.c index 6e15ab7..46128d3 100644 --- a/src/fsm.c +++ b/src/fsm.c @@ -571,6 +571,7 @@ { struct osmo_fsm *fsm; const struct osmo_fsm_state *fs; + int i; if (!fi) { LOGPSRC(DLGLOBAL, LOGL_ERROR, file, line, @@ -581,26 +582,67 @@ } fsm = fi->fsm; - OSMO_ASSERT(fi->state < fsm->num_states); - fs = &fi->fsm->states[fi->state]; - LOGPFSMSRC(fi, file, line, - "Received Event %s\n", osmo_fsm_event_name(fsm, event)); +// LOGPFSMSRC(fi, file, line, +// "Received Event %s%s.\n", +// osmo_fsm_event_name(fsm, event), +// fi->in_dispatch ? " while in dispatch, queing it" : ""); - if (((1 << event) & fsm->allstate_event_mask) && fsm->allstate_action) { - fsm->allstate_action(fi, event, data); + if (fi->evt_queue_len == OSMO_FSM_MAX_PENDING_EVENTS) { + LOGPFSMSRC(fi, file, line, + "Unable to queue event %s, overflow ...\n", + osmo_fsm_event_name(fsm, event)); + + return -ENOMEM; + } + + fi->evt_queue[fi->evt_queue_len].event = event; + fi->evt_queue[fi->evt_queue_len].data = data; + fi->evt_queue[fi->evt_queue_len].src_file = file; + fi->evt_queue[fi->evt_queue_len].src_line = line; + fi->evt_queue_len++; + + if (fi->in_dispatch) { + LOGPFSMSRC(fi, file, line, + "Deferred Event %s\n", + osmo_fsm_event_name(fsm, event)); return 0; } - if (!((1 << event) & fs->in_event_mask)) { - LOGPFSMLSRC(fi, LOGL_ERROR, file, line, - "Event %s not permitted\n", - osmo_fsm_event_name(fsm, event)); - return -1; + fi->in_dispatch = 1; + + for (i=0; i < fi->evt_queue_len; i++) { + OSMO_ASSERT(fi->state < fsm->num_states); + fs = &fi->fsm->states[fi->state]; + + event = fi->evt_queue[i].event; + data = fi->evt_queue[i].data; + file = fi->evt_queue[i].src_file; + line = fi->evt_queue[i].src_line; + +// LOGPFSMSRC(fi, file, line, +// "Processing Event %s\n", osmo_fsm_event_name(fsm, event)); + LOGPFSMSRC(fi, file, line, + "Received Event %s\n", osmo_fsm_event_name(fsm, event)); + + if (((1 << event) & fsm->allstate_event_mask) && fsm->allstate_action) { + fsm->allstate_action(fi, event, data); + continue; + } + + if (!((1 << event) & fs->in_event_mask)) { + LOGPFSMLSRC(fi, LOGL_ERROR, file, line, + "Event %s not permitted\n", + osmo_fsm_event_name(fsm, event)); + continue; + } + + if (fs->action) + fs->action(fi, event, data); } - if (fs->action) - fs->action(fi, event, data); + fi->evt_queue_len = 0; + fi->in_dispatch = 0; return 0; } -- To view, visit https://gerrit.osmocom.org/12983 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: libosmocore Gerrit-Branch: master Gerrit-MessageType: newchange Gerrit-Change-Id: I6f0c64d21d57512c5b329b561ccd415a93790dec Gerrit-Change-Number: 12983 Gerrit-PatchSet: 1 Gerrit-Owner: tnt <tnt at 246tNt.com> -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20190220/131c643e/attachment.htm>