libosmocore 1.9.0.192-1c24
Osmocom core library

Osmocom generic Finite State Machine implementation. More...

#include <errno.h>
#include <stdbool.h>
#include <string.h>
#include <inttypes.h>
#include <osmocom/core/fsm.h>
#include <osmocom/core/talloc.h>
#include <osmocom/core/logging.h>
#include <osmocom/core/utils.h>

Functions

 LLIST_HEAD (osmo_g_fsms)
 
static void fsm_free_or_steal (void *talloc_object)
 Internal call to free an FSM instance, which redirects to the context set by osmo_fsm_set_dealloc_ctx() if any. More...
 
void osmo_fsm_log_addr (bool log_addr)
 specify if FSM instance addresses should be logged or not More...
 
void osmo_fsm_log_timeouts (bool log_timeouts)
 Enable or disable logging of timeout values for FSM instance state changes. More...
 
void osmo_fsm_term_safely (bool term_safely)
 Enable safer way to deallocate cascades of terminating FSM instances. More...
 
void osmo_fsm_set_dealloc_ctx (void *ctx)
 Instead of deallocating FSM instances, move them to the given talloc context. More...
 
static void osmo_fsm_defer_free (void *talloc_object)
 talloc_free() the given object immediately, or once ongoing FSM terminations are done. More...
 
struct osmo_fsmosmo_fsm_find_by_name (const char *name)
 
struct osmo_fsm_instosmo_fsm_inst_find_by_name (const struct osmo_fsm *fsm, const char *name)
 
struct osmo_fsm_instosmo_fsm_inst_find_by_id (const struct osmo_fsm *fsm, const char *id)
 
int osmo_fsm_register (struct osmo_fsm *fsm)
 register a FSM with the core More...
 
void osmo_fsm_unregister (struct osmo_fsm *fsm)
 unregister a FSM from the core More...
 
static void fsm_tmr_cb (void *data)
 
int osmo_fsm_inst_update_id (struct osmo_fsm_inst *fi, const char *id)
 Change id of the FSM instance. More...
 
static void update_name (struct osmo_fsm_inst *fi)
 
int osmo_fsm_inst_update_id_f (struct osmo_fsm_inst *fi, const char *fmt,...)
 Change id of the FSM instance using a string format. More...
 
int osmo_fsm_inst_update_id_f_sanitize (struct osmo_fsm_inst *fi, char replace_with, const char *fmt,...)
 Change id of the FSM instance using a string format, and ensuring a valid id. More...
 
struct osmo_fsm_instosmo_fsm_inst_alloc (struct osmo_fsm *fsm, void *ctx, void *priv, int log_level, const char *id)
 allocate a new instance of a specified FSM More...
 
struct osmo_fsm_instosmo_fsm_inst_alloc_child (struct osmo_fsm *fsm, struct osmo_fsm_inst *parent, uint32_t parent_term_event)
 allocate a new instance of a specified FSM as child of other FSM instance More...
 
void osmo_fsm_inst_unlink_parent (struct osmo_fsm_inst *fi, void *ctx)
 unlink child FSM from its parent FSM. More...
 
void osmo_fsm_inst_change_parent (struct osmo_fsm_inst *fi, struct osmo_fsm_inst *new_parent, uint32_t new_parent_term_event)
 change parent instance of an FSM. More...
 
void osmo_fsm_inst_free (struct osmo_fsm_inst *fi)
 delete a given instance of a FSM More...
 
const char * osmo_fsm_event_name (const struct osmo_fsm *fsm, uint32_t event)
 get human-readable name of FSM event More...
 
const char * osmo_fsm_inst_name (const struct osmo_fsm_inst *fi)
 get human-readable name of FSM instance More...
 
const char * osmo_fsm_state_name (const struct osmo_fsm *fsm, uint32_t state)
 get human-readable name of FSM state More...
 
static int state_chg (struct osmo_fsm_inst *fi, uint32_t new_state, bool keep_timer, unsigned long timeout_ms, int T, const char *file, int line)
 
int _osmo_fsm_inst_state_chg (struct osmo_fsm_inst *fi, uint32_t new_state, unsigned long timeout_secs, int T, const char *file, int line)
 perform a state change of the given FSM instance More...
 
int _osmo_fsm_inst_state_chg_ms (struct osmo_fsm_inst *fi, uint32_t new_state, unsigned long timeout_ms, int T, const char *file, int line)
 
int _osmo_fsm_inst_state_chg_keep_timer (struct osmo_fsm_inst *fi, uint32_t new_state, const char *file, int line)
 perform a state change while keeping the current timer running. More...
 
int _osmo_fsm_inst_state_chg_keep_or_start_timer (struct osmo_fsm_inst *fi, uint32_t new_state, unsigned long timeout_secs, int T, const char *file, int line)
 perform a state change while keeping the current timer if running, or starting a timer otherwise. More...
 
int _osmo_fsm_inst_state_chg_keep_or_start_timer_ms (struct osmo_fsm_inst *fi, uint32_t new_state, unsigned long timeout_ms, int T, const char *file, int line)
 
int _osmo_fsm_inst_dispatch (struct osmo_fsm_inst *fi, uint32_t event, void *data, const char *file, int line)
 dispatch an event to an osmocom finite state machine instance More...
 
void _osmo_fsm_inst_term (struct osmo_fsm_inst *fi, enum osmo_fsm_term_cause cause, void *data, const char *file, int line)
 Terminate FSM instance with given cause. More...
 
void _osmo_fsm_inst_term_children (struct osmo_fsm_inst *fi, enum osmo_fsm_term_cause cause, void *data, const char *file, int line)
 Terminate all child FSM instances of an FSM instance. More...
 
void _osmo_fsm_inst_broadcast_children (struct osmo_fsm_inst *fi, uint32_t event, void *data, const char *file, int line)
 Broadcast an event to all the FSMs children. More...
 

Variables

static bool fsm_log_addr = true
 
static bool fsm_log_timeouts = false
 
static bool fsm_term_safely_enabled = false
 See osmo_fsm_term_safely(). More...
 
struct {
   struct osmo_fsm_inst *   root_fi
 The first FSM instance that invoked osmo_fsm_inst_term() in the current cascade. More...
 
   unsigned int   depth
 2 if a secondary FSM terminates, 3 if a secondary FSM causes a tertiary FSM to terminate, and so on. More...
 
   void *   collect_ctx
 Talloc context to collect all deferred deallocations (FSM instances, and talloc objects if any). More...
 
   void *   fsm_dealloc_ctx
 See osmo_fsm_set_dealloc_ctx() More...
 
fsm_term_safely
 Internal state for FSM instance termination cascades. More...
 
const struct value_string osmo_fsm_term_cause_names []
 

Detailed Description

Osmocom generic Finite State Machine implementation.

Variable Documentation

◆ collect_ctx

void* collect_ctx

Talloc context to collect all deferred deallocations (FSM instances, and talloc objects if any).

◆ depth

unsigned int depth

2 if a secondary FSM terminates, 3 if a secondary FSM causes a tertiary FSM to terminate, and so on.

◆ fsm_dealloc_ctx

void* fsm_dealloc_ctx

◆ root_fi

struct osmo_fsm_inst* root_fi

The first FSM instance that invoked osmo_fsm_inst_term() in the current cascade.