summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Willmann <dwillmann@sysmocom.de>2018-02-08 18:00:37 +0100
committerHarald Welte <laforge@gnumonks.org>2018-02-15 18:03:58 +0000
commitb0c43a606334cb6d0796e9fb102823ce040224f6 (patch)
tree0f783e0c6abded3e5bcd23ed2dd5bd7c4a2275e6
parent3c38e60cd55814a7b4c34f22e0b2e6e671f883c4 (diff)
fsm: Add a function to change the FSM instance ID later
Sometimes we want to create an FSM instance before we know its name. In that case we should be able to update the id later. Change-Id: Ic216e5b11d4440f8e106a297714f4f06c1152945
-rw-r--r--include/osmocom/core/fsm.h2
-rw-r--r--src/fsm.c31
2 files changed, 27 insertions, 6 deletions
diff --git a/include/osmocom/core/fsm.h b/include/osmocom/core/fsm.h
index 8f550d14..bbfe3123 100644
--- a/include/osmocom/core/fsm.h
+++ b/include/osmocom/core/fsm.h
@@ -156,6 +156,8 @@ void osmo_fsm_inst_change_parent(struct osmo_fsm_inst *fi,
uint32_t new_parent_term_event);
void osmo_fsm_inst_free(struct osmo_fsm_inst *fi);
+int osmo_fsm_inst_update_id(struct osmo_fsm_inst *fi, const char *id);
+
const char *osmo_fsm_event_name(struct osmo_fsm *fsm, uint32_t event);
const char *osmo_fsm_inst_name(struct osmo_fsm_inst *fi);
const char *osmo_fsm_state_name(struct osmo_fsm *fsm, uint32_t state);
diff --git a/src/fsm.c b/src/fsm.c
index d8751c9c..a1273624 100644
--- a/src/fsm.c
+++ b/src/fsm.c
@@ -197,11 +197,32 @@ static void fsm_tmr_cb(void *data)
osmo_fsm_inst_term(fi, OSMO_FSM_TERM_TIMEOUT, &T);
}
+/*! Change id of the FSM instance
+ * \param[in] fi FSM instance
+ * \param[in] id new ID
+ * \returns 0 if the ID was updated, otherwise -EINVAL
+ */
+int osmo_fsm_inst_update_id(struct osmo_fsm_inst *fi, const char *id)
+{
+ if (id) {
+ if (!osmo_identifier_valid(id)) {
+ LOGP(DLGLOBAL, LOGL_ERROR, "Attempting to allocate FSM instance of type '%s'"
+ " with illegal identifier '%s'\n", fi->fsm->name, id);
+ return -EINVAL;
+ }
+ osmo_talloc_replace_string(fi, (char **)&fi->id, id);
+
+ return 0;
+ }
+ return -EINVAL;
+}
+
/*! allocate a new instance of a specified FSM
* \param[in] fsm Descriptor of the FSM
* \param[in] ctx talloc context from which to allocate memory
* \param[in] priv private data reference store in fsm instance
* \param[in] log_level The log level for events of this FSM
+ * \param[in] id The name/ID of the FSM instance
* \returns newly-allocated, initialized and registered FSM instance
*/
struct osmo_fsm_inst *osmo_fsm_inst_alloc(struct osmo_fsm *fsm, void *ctx, void *priv,
@@ -213,14 +234,12 @@ struct osmo_fsm_inst *osmo_fsm_inst_alloc(struct osmo_fsm *fsm, void *ctx, void
fi->priv = priv;
fi->log_level = log_level;
osmo_timer_setup(&fi->timer, fsm_tmr_cb, fi);
+
if (id) {
- if (!osmo_identifier_valid(id)) {
- LOGP(DLGLOBAL, LOGL_ERROR, "Attempting to allocate FSM instance of type '%s'"
- " with illegal identifier '%s'\n", fsm->name, id);
- talloc_free(fi);
- return NULL;
+ if (osmo_fsm_inst_update_id(fi, id) < 0) {
+ talloc_free(fi);
+ return NULL;
}
- fi->id = talloc_strdup(fi, id);
}
if (!fsm_log_addr) {