<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>