diff options
author | Philipp Maier <pmaier@sysmocom.de> | 2018-01-16 18:45:56 +0100 |
---|---|---|
committer | Philipp Maier <pmaier@sysmocom.de> | 2018-01-24 12:03:28 +0100 |
commit | 2a06a491b17b2eaa39d0a10ca43cc946b679f837 (patch) | |
tree | 889da2a995061085549b4fd61e42761309d1fd9c | |
parent | a55fe9f322cd2856ce2e26cd0fbe0b530cf8dcb6 (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
-rw-r--r-- | include/osmocom/core/fsm.h | 4 | ||||
-rw-r--r-- | src/fsm.c | 37 |
2 files changed, 38 insertions, 3 deletions
diff --git a/include/osmocom/core/fsm.h b/include/osmocom/core/fsm.h index 2fbb2501..8f550d14 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(struct osmo_fsm *fsm, void *ctx, void 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); @@ -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 */ |