Hello Harald Welte, Jenkins Builder,

I'd like you to reexamine a change.  Please visit

    https://gerrit.osmocom.org/5832

to look at the new patch set (#7).

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
---
M include/osmocom/core/fsm.h
M src/fsm.c
2 files changed, 38 insertions(+), 3 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/32/5832/7

diff --git a/include/osmocom/core/fsm.h b/include/osmocom/core/fsm.h
index 2fbb250..8f550d1 100644
--- a/include/osmocom/core/fsm.h
+++ b/include/osmocom/core/fsm.h
@@ -150,6 +150,10 @@
 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_unlink_parent(struct osmo_fsm_inst *fi, void *ctx);
+void osmo_fsm_inst_change_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..d8751c9 100644
--- a/src/fsm.c
+++ b/src/fsm.c
@@ -272,13 +272,44 @@
 
        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
  */

-- 
To view, visit https://gerrit.osmocom.org/5832
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I6d18cbd4ada903cf3720b3ad2a89fc643085beef
Gerrit-PatchSet: 7
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Owner: dexter <pma...@sysmocom.de>
Gerrit-Reviewer: Harald Welte <lafo...@gnumonks.org>
Gerrit-Reviewer: Jenkins Builder

Reply via email to