summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2017-04-16 17:23:56 +0200
committerHarald Welte <laforge@gnumonks.org>2017-04-16 17:28:23 +0200
commit4585e6755dd569ab620c711f20a3d45d4ad87216 (patch)
treefe76626f7771919be792dae0f2aff21759169ddd
parent7bc88bbd7ea43082fec181c6892259218ce198a0 (diff)
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
-rw-r--r--include/osmocom/core/fsm.h4
-rw-r--r--src/fsm.c24
-rw-r--r--tests/fsm/fsm_test.c8
-rw-r--r--tests/fsm/fsm_test.err16
4 files changed, 43 insertions, 9 deletions
diff --git a/include/osmocom/core/fsm.h b/include/osmocom/core/fsm.h
index 3a1f2338..f42dd0c6 100644
--- a/include/osmocom/core/fsm.h
+++ b/include/osmocom/core/fsm.h
@@ -141,6 +141,10 @@ void osmo_fsm_log_addr(bool log_addr);
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 0e2c9be4..7b2be701 100644
--- a/src/fsm.c
+++ b/src/fsm.c
@@ -113,6 +113,30 @@ struct osmo_fsm *osmo_fsm_find_by_name(const char *name)
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 7a644213..c3ab91c2 100644
--- a/tests/fsm/fsm_test.c
+++ b/tests/fsm/fsm_test.c
@@ -94,7 +94,7 @@ static struct osmo_fsm_inst *foo(void)
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 @@ int main(int argc, char **argv)
log_add_target(stderr_target);
log_set_print_filename(stderr_target, 0);
+
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 c9021bbd..6f031be8 100644
--- a/tests/fsm/fsm_test.err
+++ b/tests/fsm/fsm_test.err
@@ -1,11 +1,11 @@
Checking FSM allocation
-Test FSM{NULL}: Allocated
-Test FSM{NULL}: Received Event 1
-Test FSM{NULL}: Event 1 not permitted
-Test FSM{NULL}: Received Event 0
-Test FSM{NULL}: state_chg to ONE
-Test FSM{ONE}: Received Event 1
-Test FSM{ONE}: state_chg to TWO
-Test FSM{TWO}: Timeout of T2342
+Test FSM(my_id){NULL}: Allocated
+Test FSM(my_id){NULL}: Received Event 1
+Test FSM(my_id){NULL}: Event 1 not permitted
+Test FSM(my_id){NULL}: Received Event 0
+Test FSM(my_id){NULL}: state_chg to ONE
+Test FSM(my_id){ONE}: Received Event 1
+Test FSM(my_id){ONE}: state_chg to TWO
+Test FSM(my_id){TWO}: Timeout of T2342
Timer
 \ No newline at end of file