Change in libosmocore[master]: [WIP] fsm: Delay processing events after dispatch is complete

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.org
Wed Feb 20 19:33:11 UTC 2019


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


More information about the gerrit-log mailing list