aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPhilipp Maier <pmaier@sysmocom.de>2018-01-16 18:45:56 +0100
committerPhilipp Maier <pmaier@sysmocom.de>2018-01-24 12:03:28 +0100
commit2a06a491b17b2eaa39d0a10ca43cc946b679f837 (patch)
tree889da2a995061085549b4fd61e42761309d1fd9c /src
parenta55fe9f322cd2856ce2e26cd0fbe0b530cf8dcb6 (diff)
fsm: add functions for unlinking and changing parents
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. - osmo_fsm_inst_unlink_parent(): Make it possible to unlink childs from a parent. - osmo_fsm_inst_change_parent(): Make it possible to change the parent of a child. Change-Id: I6d18cbd4ada903cf3720b3ad2a89fc643085beef
Diffstat (limited to 'src')
-rw-r--r--src/fsm.c37
1 files changed, 34 insertions, 3 deletions
diff --git a/src/fsm.c b/src/fsm.c
index f9effc47..d8751c9c 100644
--- a/src/fsm.c
+++ b/src/fsm.c
@@ -272,13 +272,44 @@ struct osmo_fsm_inst *osmo_fsm_inst_alloc_child(struct osmo_fsm *fsm,
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_change_parent(fi, parent, parent_term_event);
return fi;
}
+/*! unlink child FSM from its parent FSM.
+ * \param[in] fi Descriptor of the child FSM to unlink.
+ * \param[in] ctx New talloc context */
+void osmo_fsm_inst_unlink_parent(struct osmo_fsm_inst *fi, void *ctx)
+{
+ if (fi->proc.parent) {
+ talloc_steal(ctx, fi);
+ fi->proc.parent = NULL;
+ fi->proc.parent_term_event = 0;
+ llist_del(&fi->proc.child);
+ }
+}
+
+/*! change 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_change_parent(struct osmo_fsm_inst *fi,
+ struct osmo_fsm_inst *new_parent,
+ uint32_t new_parent_term_event)
+{
+ /* Make sure a possibly existing old parent is unlinked first
+ * (new_parent can be NULL) */
+ osmo_fsm_inst_unlink_parent(fi, new_parent);
+
+ /* 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
*/