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