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/.
dexter gerrit-no-reply at lists.osmocom.org
Review at https://gerrit.osmocom.org/5832
fsm: add function osmo_fsm_inst_set_parent()
At the moment it is not possible to unlink a child from from
its parent, nor is it possible to assign a new parent to a
child FSM.
- Make it possible to unlink childs from a parent.
- Make it possible to change the parent of a child
Change-Id: I6d18cbd4ada903cf3720b3ad2a89fc643085beef
---
M include/osmocom/core/fsm.h
M src/fsm.c
2 files changed, 28 insertions(+), 3 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/32/5832/1
diff --git a/include/osmocom/core/fsm.h b/include/osmocom/core/fsm.h
index 2fbb250..1ae638b 100644
--- a/include/osmocom/core/fsm.h
+++ b/include/osmocom/core/fsm.h
@@ -150,6 +150,9 @@
struct osmo_fsm_inst *osmo_fsm_inst_alloc_child(struct osmo_fsm *fsm,
struct osmo_fsm_inst *parent,
uint32_t parent_term_event);
+void osmo_fsm_inst_set_parent(struct osmo_fsm_inst *fi,
+ struct osmo_fsm_inst *new_parent,
+ uint32_t new_parent_term_event);
void osmo_fsm_inst_free(struct osmo_fsm_inst *fi);
const char *osmo_fsm_event_name(struct osmo_fsm *fsm, uint32_t event);
diff --git a/src/fsm.c b/src/fsm.c
index f9effc4..187d316 100644
--- a/src/fsm.c
+++ b/src/fsm.c
@@ -272,13 +272,35 @@
LOGPFSM(fi, "is child of %s\n", osmo_fsm_inst_name(parent));
- fi->proc.parent = parent;
- fi->proc.parent_term_event = parent_term_event;
- llist_add(&fi->proc.child, &parent->proc.children);
+ osmo_fsm_inst_set_parent(fi, parent, parent_term_event);
return fi;
}
+/*! set parent instance of an FSM.
+ * \param[in] fi Descriptor of the to-be-allocated FSM.
+ * \param[in] new_parent New parent FSM instance.
+ * \param[in] new_parent_term_event Event to be sent to parent when terminating. */
+void osmo_fsm_inst_set_parent(struct osmo_fsm_inst *fi,
+ struct osmo_fsm_inst *new_parent,
+ uint32_t new_parent_term_event)
+{
+ /* If a parent already exists, unlink first */
+ if (fi->proc.parent) {
+ fi->proc.parent = NULL;
+ fi->proc.parent_term_event = 0;
+ llist_del(&fi->proc.child);
+ }
+
+ /* Add new parent */
+ if (new_parent) {
+ fi->proc.parent = new_parent;
+ fi->proc.parent_term_event = new_parent_term_event;
+ llist_add(&fi->proc.child, &new_parent->proc.children);
+
+ }
+}
+
/*! delete a given instance of a FSM
* \param[in] fsm The FSM to be un-registered and deleted
*/
--
To view, visit https://gerrit.osmocom.org/5832
To unsubscribe, visit https://gerrit.osmocom.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I6d18cbd4ada903cf3720b3ad2a89fc643085beef
Gerrit-PatchSet: 1
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Owner: dexter <pmaier at sysmocom.de>