<p>tnt has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/12983">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">[WIP] fsm: Delay processing events after dispatch is complete<br><br>Change-Id: I6f0c64d21d57512c5b329b561ccd415a93790dec<br>Signed-off-by: Sylvain Munaut <tnt@246tNt.com><br>---<br>M include/osmocom/core/fsm.h<br>M src/fsm.c<br>2 files changed, 72 insertions(+), 13 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/83/12983/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/core/fsm.h b/include/osmocom/core/fsm.h</span><br><span>index df7e348..c1144c6 100644</span><br><span>--- a/include/osmocom/core/fsm.h</span><br><span>+++ b/include/osmocom/core/fsm.h</span><br><span>@@ -17,6 +17,9 @@</span><br><span> </span><br><span> struct osmo_fsm_inst;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! Maximum number of pending events to be disptached to an FSM instance */</span><br><span style="color: hsl(120, 100%, 40%);">+#define OSMO_FSM_MAX_PENDING_EVENTS 8</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> enum osmo_fsm_term_cause {</span><br><span> /*! terminate because parent terminated */</span><br><span> OSMO_FSM_TERM_PARENT,</span><br><span>@@ -115,6 +118,20 @@</span><br><span> /*! \ref llist_head linked to parent->proc.children */</span><br><span> struct llist_head child;</span><br><span> } proc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /*! Busy inside dispatch */</span><br><span style="color: hsl(120, 100%, 40%);">+ int in_dispatch;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /*! Queue of events to dispatch */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct {</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t event;</span><br><span style="color: hsl(120, 100%, 40%);">+ void *data;</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *src_file;</span><br><span style="color: hsl(120, 100%, 40%);">+ int src_line;</span><br><span style="color: hsl(120, 100%, 40%);">+ } evt_queue[OSMO_FSM_MAX_PENDING_EVENTS];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /*! Number of events queued */</span><br><span style="color: hsl(120, 100%, 40%);">+ int evt_queue_len;</span><br><span> };</span><br><span> </span><br><span> void osmo_fsm_log_addr(bool log_addr);</span><br><span>diff --git a/src/fsm.c b/src/fsm.c</span><br><span>index 6e15ab7..46128d3 100644</span><br><span>--- a/src/fsm.c</span><br><span>+++ b/src/fsm.c</span><br><span>@@ -571,6 +571,7 @@</span><br><span> {</span><br><span> struct osmo_fsm *fsm;</span><br><span> const struct osmo_fsm_state *fs;</span><br><span style="color: hsl(120, 100%, 40%);">+ int i;</span><br><span> </span><br><span> if (!fi) {</span><br><span> LOGPSRC(DLGLOBAL, LOGL_ERROR, file, line,</span><br><span>@@ -581,26 +582,67 @@</span><br><span> }</span><br><span> </span><br><span> fsm = fi->fsm;</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(fi->state < fsm->num_states);</span><br><span style="color: hsl(0, 100%, 40%);">- fs = &fi->fsm->states[fi->state];</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- LOGPFSMSRC(fi, file, line,</span><br><span style="color: hsl(0, 100%, 40%);">- "Received Event %s\n", osmo_fsm_event_name(fsm, event));</span><br><span style="color: hsl(120, 100%, 40%);">+// LOGPFSMSRC(fi, file, line,</span><br><span style="color: hsl(120, 100%, 40%);">+// "Received Event %s%s.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+// osmo_fsm_event_name(fsm, event),</span><br><span style="color: hsl(120, 100%, 40%);">+// fi->in_dispatch ? " while in dispatch, queing it" : "");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (((1 << event) & fsm->allstate_event_mask) && fsm->allstate_action) {</span><br><span style="color: hsl(0, 100%, 40%);">- fsm->allstate_action(fi, event, data);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (fi->evt_queue_len == OSMO_FSM_MAX_PENDING_EVENTS) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPFSMSRC(fi, file, line,</span><br><span style="color: hsl(120, 100%, 40%);">+ "Unable to queue event %s, overflow ...\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_event_name(fsm, event));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return -ENOMEM;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ fi->evt_queue[fi->evt_queue_len].event = event;</span><br><span style="color: hsl(120, 100%, 40%);">+ fi->evt_queue[fi->evt_queue_len].data = data;</span><br><span style="color: hsl(120, 100%, 40%);">+ fi->evt_queue[fi->evt_queue_len].src_file = file;</span><br><span style="color: hsl(120, 100%, 40%);">+ fi->evt_queue[fi->evt_queue_len].src_line = line;</span><br><span style="color: hsl(120, 100%, 40%);">+ fi->evt_queue_len++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (fi->in_dispatch) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPFSMSRC(fi, file, line,</span><br><span style="color: hsl(120, 100%, 40%);">+ "Deferred Event %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_event_name(fsm, event));</span><br><span> return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!((1 << event) & fs->in_event_mask)) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGPFSMLSRC(fi, LOGL_ERROR, file, line,</span><br><span style="color: hsl(0, 100%, 40%);">- "Event %s not permitted\n",</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_fsm_event_name(fsm, event));</span><br><span style="color: hsl(0, 100%, 40%);">- return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+ fi->in_dispatch = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i=0; i < fi->evt_queue_len; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(fi->state < fsm->num_states);</span><br><span style="color: hsl(120, 100%, 40%);">+ fs = &fi->fsm->states[fi->state];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ event = fi->evt_queue[i].event;</span><br><span style="color: hsl(120, 100%, 40%);">+ data = fi->evt_queue[i].data;</span><br><span style="color: hsl(120, 100%, 40%);">+ file = fi->evt_queue[i].src_file;</span><br><span style="color: hsl(120, 100%, 40%);">+ line = fi->evt_queue[i].src_line;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// LOGPFSMSRC(fi, file, line,</span><br><span style="color: hsl(120, 100%, 40%);">+// "Processing Event %s\n", osmo_fsm_event_name(fsm, event));</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPFSMSRC(fi, file, line,</span><br><span style="color: hsl(120, 100%, 40%);">+ "Received Event %s\n", osmo_fsm_event_name(fsm, event));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (((1 << event) & fsm->allstate_event_mask) && fsm->allstate_action) {</span><br><span style="color: hsl(120, 100%, 40%);">+ fsm->allstate_action(fi, event, data);</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!((1 << event) & fs->in_event_mask)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPFSMLSRC(fi, LOGL_ERROR, file, line,</span><br><span style="color: hsl(120, 100%, 40%);">+ "Event %s not permitted\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_event_name(fsm, event));</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (fs->action)</span><br><span style="color: hsl(120, 100%, 40%);">+ fs->action(fi, event, data);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (fs->action)</span><br><span style="color: hsl(0, 100%, 40%);">- fs->action(fi, event, data);</span><br><span style="color: hsl(120, 100%, 40%);">+ fi->evt_queue_len = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ fi->in_dispatch = 0;</span><br><span> </span><br><span> return 0;</span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12983">change 12983</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/12983"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I6f0c64d21d57512c5b329b561ccd415a93790dec </div>
<div style="display:none"> Gerrit-Change-Number: 12983 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: tnt <tnt@246tNt.com> </div>