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/.
Harald Welte gerrit-no-reply at lists.osmocom.org
Review at https://gerrit.osmocom.org/2372
osmo_fsm: Lookup functions to find FSM Instance by name or ID
Introduce two lookup helper functions to resolve a fsm_instance based on
the FSM and name or ID. Also, add related test cases.
Change-Id: I707f3ed2795c28a924e64adc612d378c21baa815
---
M include/osmocom/core/fsm.h
M src/fsm.c
M tests/fsm/fsm_test.c
M tests/fsm/fsm_test.err
4 files changed, 45 insertions(+), 11 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/72/2372/1
diff --git a/include/osmocom/core/fsm.h b/include/osmocom/core/fsm.h
index 3a1f233..f42dd0c 100644
--- a/include/osmocom/core/fsm.h
+++ b/include/osmocom/core/fsm.h
@@ -141,6 +141,10 @@
int osmo_fsm_register(struct osmo_fsm *fsm);
void osmo_fsm_unregister(struct osmo_fsm *fsm);
struct osmo_fsm *osmo_fsm_find_by_name(const char *name);
+struct osmo_fsm_inst *osmo_fsm_inst_find_by_name(const struct osmo_fsm *fsm,
+ const char *name);
+struct osmo_fsm_inst *osmo_fsm_inst_find_by_id(const struct osmo_fsm *fsm,
+ const char *id);
struct osmo_fsm_inst *osmo_fsm_inst_alloc(struct osmo_fsm *fsm, void *ctx, void *priv,
int log_level, const char *id);
struct osmo_fsm_inst *osmo_fsm_inst_alloc_child(struct osmo_fsm *fsm,
diff --git a/src/fsm.c b/src/fsm.c
index 0e2c9be..7b2be70 100644
--- a/src/fsm.c
+++ b/src/fsm.c
@@ -113,6 +113,30 @@
return NULL;
}
+struct osmo_fsm_inst *osmo_fsm_inst_find_by_name(const struct osmo_fsm *fsm,
+ const char *name)
+{
+ struct osmo_fsm_inst *fi;
+
+ llist_for_each_entry(fi, &fsm->instances, list) {
+ if (!strcmp(name, fi->name))
+ return fi;
+ }
+ return NULL;
+}
+
+struct osmo_fsm_inst *osmo_fsm_inst_find_by_id(const struct osmo_fsm *fsm,
+ const char *id)
+{
+ struct osmo_fsm_inst *fi;
+
+ llist_for_each_entry(fi, &fsm->instances, list) {
+ if (!strcmp(id, fi->id))
+ return fi;
+ }
+ return NULL;
+}
+
/*! \brief register a FSM with the core
*
* A FSM descriptor needs to be registered with the core before any
diff --git a/tests/fsm/fsm_test.c b/tests/fsm/fsm_test.c
index 7a64421..c3ab91c 100644
--- a/tests/fsm/fsm_test.c
+++ b/tests/fsm/fsm_test.c
@@ -94,7 +94,7 @@
struct osmo_fsm_inst *fi;
LOGP(DMAIN, LOGL_INFO, "Checking FSM allocation\n");
- fi = osmo_fsm_inst_alloc(&fsm, g_ctx, NULL, LOGL_DEBUG, NULL);
+ fi = osmo_fsm_inst_alloc(&fsm, g_ctx, NULL, LOGL_DEBUG, "my_id");
OSMO_ASSERT(fi);
OSMO_ASSERT(fi->fsm == &fsm);
OSMO_ASSERT(!strncmp(osmo_fsm_inst_name(fi), fsm.name, strlen(fsm.name)));
@@ -143,10 +143,16 @@
log_add_target(stderr_target);
log_set_print_filename(stderr_target, 0);
- g_ctx = NULL;
- osmo_fsm_register(&fsm);
+ g_ctx = NULL;
+ OSMO_ASSERT(osmo_fsm_find_by_name(fsm.name) == NULL);
+ osmo_fsm_register(&fsm);
+ OSMO_ASSERT(osmo_fsm_find_by_name(fsm.name) == &fsm);
+
+ OSMO_ASSERT(osmo_fsm_inst_find_by_name(&fsm, "my_id") == NULL);
finst = foo();
+ OSMO_ASSERT(osmo_fsm_inst_find_by_id(&fsm, "my_id") == finst);
+ OSMO_ASSERT(osmo_fsm_inst_find_by_name(&fsm, "Test FSM(my_id)") == finst);
while (1) {
osmo_select_main(0);
diff --git a/tests/fsm/fsm_test.err b/tests/fsm/fsm_test.err
index c9021bb..6f031be 100644
--- a/tests/fsm/fsm_test.err
+++ b/tests/fsm/fsm_test.err
@@ -1,11 +1,11 @@
Checking FSM allocation
-[0;mTest FSM{NULL}: Allocated
-[0;mTest FSM{NULL}: Received Event 1
-[0;mTest FSM{NULL}: Event 1 not permitted
-[0;mTest FSM{NULL}: Received Event 0
-[0;mTest FSM{NULL}: state_chg to ONE
-[0;mTest FSM{ONE}: Received Event 1
-[0;mTest FSM{ONE}: state_chg to TWO
-[0;mTest FSM{TWO}: Timeout of T2342
+[0;mTest FSM(my_id){NULL}: Allocated
+[0;mTest FSM(my_id){NULL}: Received Event 1
+[0;mTest FSM(my_id){NULL}: Event 1 not permitted
+[0;mTest FSM(my_id){NULL}: Received Event 0
+[0;mTest FSM(my_id){NULL}: state_chg to ONE
+[0;mTest FSM(my_id){ONE}: Received Event 1
+[0;mTest FSM(my_id){ONE}: state_chg to TWO
+[0;mTest FSM(my_id){TWO}: Timeout of T2342
[0;mTimer
[0;m
\ No newline at end of file
--
To view, visit https://gerrit.osmocom.org/2372
To unsubscribe, visit https://gerrit.osmocom.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I707f3ed2795c28a924e64adc612d378c21baa815
Gerrit-PatchSet: 1
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <laforge at gnumonks.org>