\doxysection{fsm.\+h}
\label{fsm_8h_source}\index{include/osmocom/core/fsm.h@{include/osmocom/core/fsm.h}}
\textbf{ Go to the documentation of this file.}
\begin{DoxyCode}{0}
\DoxyCodeLine{1 }
\DoxyCodeLine{5 \textcolor{preprocessor}{\#pragma once}}
\DoxyCodeLine{6 }
\DoxyCodeLine{7 \textcolor{preprocessor}{\#include <stdint.h>}}
\DoxyCodeLine{8 \textcolor{preprocessor}{\#include <stdbool.h>}}
\DoxyCodeLine{9 }
\DoxyCodeLine{10 \textcolor{preprocessor}{\#include <osmocom/core/linuxlist.h>}}
\DoxyCodeLine{11 \textcolor{preprocessor}{\#include <osmocom/core/timer.h>}}
\DoxyCodeLine{12 \textcolor{preprocessor}{\#include <osmocom/core/utils.h>}}
\DoxyCodeLine{13 \textcolor{preprocessor}{\#include <osmocom/core/logging.h>}}
\DoxyCodeLine{14 }
\DoxyCodeLine{19 \textcolor{keyword}{struct }osmo\_fsm\_inst;}
\DoxyCodeLine{20 }
\DoxyCodeLine{21 \textcolor{keyword}{enum} osmo\_fsm\_term\_cause \{}
\DoxyCodeLine{23         OSMO\_FSM\_TERM\_PARENT,}
\DoxyCodeLine{25         OSMO\_FSM\_TERM\_REQUEST,}
\DoxyCodeLine{27         OSMO\_FSM\_TERM\_REGULAR,}
\DoxyCodeLine{29         OSMO\_FSM\_TERM\_ERROR,}
\DoxyCodeLine{31         OSMO\_FSM\_TERM\_TIMEOUT,}
\DoxyCodeLine{32 \};}
\DoxyCodeLine{33 }
\DoxyCodeLine{34 \textcolor{keyword}{extern} \textcolor{keyword}{const} \textcolor{keyword}{struct }value\_string osmo\_fsm\_term\_cause\_names[];}
\DoxyCodeLine{35 \textcolor{keyword}{static} \textcolor{keyword}{inline} \textcolor{keyword}{const} \textcolor{keywordtype}{char} *osmo\_fsm\_term\_cause\_name(\textcolor{keyword}{enum} osmo\_fsm\_term\_cause cause)}
\DoxyCodeLine{36 \{}
\DoxyCodeLine{37         \textcolor{keywordflow}{return} get\_value\_string(osmo\_fsm\_term\_cause\_names, cause);}
\DoxyCodeLine{38 \}}
\DoxyCodeLine{39 }
\DoxyCodeLine{40 }
\DoxyCodeLine{42 \textcolor{keyword}{struct }osmo\_fsm\_state \{}
\DoxyCodeLine{44         uint32\_t in\_event\_mask;}
\DoxyCodeLine{46         uint32\_t out\_state\_mask;}
\DoxyCodeLine{48         \textcolor{keyword}{const} \textcolor{keywordtype}{char} *name;}
\DoxyCodeLine{50         void (*action)(\textcolor{keyword}{struct }osmo\_fsm\_inst *fi, uint32\_t event, \textcolor{keywordtype}{void} *data);}
\DoxyCodeLine{52         void (*onenter)(\textcolor{keyword}{struct }osmo\_fsm\_inst *fi, uint32\_t prev\_state);}
\DoxyCodeLine{54         void (*onleave)(\textcolor{keyword}{struct }osmo\_fsm\_inst *fi, uint32\_t next\_state);}
\DoxyCodeLine{55 \};}
\DoxyCodeLine{56 }
\DoxyCodeLine{58 \textcolor{keyword}{struct }osmo\_fsm \{}
\DoxyCodeLine{60         \textcolor{keyword}{struct }llist\_head list;}
\DoxyCodeLine{62         \textcolor{keyword}{struct }llist\_head instances;}
\DoxyCodeLine{64         \textcolor{keyword}{const} \textcolor{keywordtype}{char} *name;}
\DoxyCodeLine{66         \textcolor{keyword}{const} \textcolor{keyword}{struct }osmo\_fsm\_state *states;}
\DoxyCodeLine{68         \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{int} num\_states;}
\DoxyCodeLine{70         uint32\_t allstate\_event\_mask;}
\DoxyCodeLine{72         void (*allstate\_action)(\textcolor{keyword}{struct }osmo\_fsm\_inst *fi, uint32\_t event, \textcolor{keywordtype}{void} *data);}
\DoxyCodeLine{74         void (*cleanup)(\textcolor{keyword}{struct }osmo\_fsm\_inst *fi, \textcolor{keyword}{enum} osmo\_fsm\_term\_cause cause);}
\DoxyCodeLine{77         int (*timer\_cb)(\textcolor{keyword}{struct }osmo\_fsm\_inst *fi);}
\DoxyCodeLine{79         \textcolor{keywordtype}{int} log\_subsys;}
\DoxyCodeLine{81         \textcolor{keyword}{const} \textcolor{keyword}{struct }value\_string *event\_names;}
\DoxyCodeLine{83         void (*pre\_term)(\textcolor{keyword}{struct }osmo\_fsm\_inst *fi, \textcolor{keyword}{enum} osmo\_fsm\_term\_cause cause);}
\DoxyCodeLine{84 \};}
\DoxyCodeLine{85 }
\DoxyCodeLine{87 \textcolor{keyword}{struct }osmo\_fsm\_inst \{}
\DoxyCodeLine{89         \textcolor{keyword}{struct }llist\_head list;}
\DoxyCodeLine{91         \textcolor{keyword}{struct }osmo\_fsm *fsm;}
\DoxyCodeLine{93         \textcolor{keyword}{const} \textcolor{keywordtype}{char} *id;}
\DoxyCodeLine{95         \textcolor{keyword}{const} \textcolor{keywordtype}{char} *name;}
\DoxyCodeLine{97         \textcolor{keywordtype}{void} *priv;}
\DoxyCodeLine{99         \textcolor{keywordtype}{int} log\_level;}
\DoxyCodeLine{101         uint32\_t state;}
\DoxyCodeLine{102 }
\DoxyCodeLine{104         \textcolor{keywordtype}{int} T;}
\DoxyCodeLine{106         \textcolor{keyword}{struct }osmo\_timer\_list timer;}
\DoxyCodeLine{107 }
\DoxyCodeLine{109         \textcolor{keyword}{struct }\{}
\DoxyCodeLine{111                 \textcolor{keyword}{struct }osmo\_fsm\_inst *parent;}
\DoxyCodeLine{113                 uint32\_t parent\_term\_event;}
\DoxyCodeLine{115                 \textcolor{keyword}{struct }llist\_head children;}
\DoxyCodeLine{117                 \textcolor{keyword}{struct }llist\_head child;}
\DoxyCodeLine{119                 \textcolor{keywordtype}{bool} terminating;}
\DoxyCodeLine{120         \} proc;}
\DoxyCodeLine{121 \};}
\DoxyCodeLine{122 }
\DoxyCodeLine{123 \textcolor{keywordtype}{void} osmo\_fsm\_log\_addr(\textcolor{keywordtype}{bool} log\_addr);}
\DoxyCodeLine{124 \textcolor{keywordtype}{void} osmo\_fsm\_log\_timeouts(\textcolor{keywordtype}{bool} log\_timeouts);}
\DoxyCodeLine{125 \textcolor{keywordtype}{void} osmo\_fsm\_term\_safely(\textcolor{keywordtype}{bool} term\_safely);}
\DoxyCodeLine{126 \textcolor{keywordtype}{void} osmo\_fsm\_set\_dealloc\_ctx(\textcolor{keywordtype}{void} *ctx);}
\DoxyCodeLine{127 }
\DoxyCodeLine{135 \textcolor{preprocessor}{\#define LOGPFSMSL(fi, subsys, level, fmt, args...) \(\backslash\)}}
\DoxyCodeLine{136 \textcolor{preprocessor}{                LOGPFSMSLSRC(fi, subsys, level, \_\_FILE\_\_, \_\_LINE\_\_, fmt, \#\# args)}}
\DoxyCodeLine{137 }
\DoxyCodeLine{148 \textcolor{preprocessor}{\#define LOGPFSMSLSRC(fi, subsys, level, caller\_file, caller\_line, fmt, args...) \(\backslash\)}}
\DoxyCodeLine{149 \textcolor{preprocessor}{                LOGPSRC(subsys, level, \(\backslash\)}}
\DoxyCodeLine{150 \textcolor{preprocessor}{                        caller\_file, caller\_line, \(\backslash\)}}
\DoxyCodeLine{151 \textcolor{preprocessor}{                        "{}\%s\{\%s\}: "{}} fmt, \(\backslash\)}
\DoxyCodeLine{152                         osmo\_fsm\_inst\_name(fi), \(\backslash\)}
\DoxyCodeLine{153                         (fi) ? osmo\_fsm\_state\_name((fi)-\/>fsm, (fi)-\/>state) : "{}fi=NULL"{}, \#\# args)}
\DoxyCodeLine{154 }
\DoxyCodeLine{155 }
\DoxyCodeLine{162 \textcolor{preprocessor}{\#define LOGPFSML(fi, level, fmt, args...) \(\backslash\)}}
\DoxyCodeLine{163 \textcolor{preprocessor}{                LOGPFSMLSRC(fi, level, \_\_FILE\_\_, \_\_LINE\_\_, fmt, \#\# args)}}
\DoxyCodeLine{164 }
\DoxyCodeLine{174 \textcolor{preprocessor}{\#define LOGPFSMLSRC(fi, level, caller\_file, caller\_line, fmt, args...) \(\backslash\)}}
\DoxyCodeLine{175 \textcolor{preprocessor}{                LOGPFSMSLSRC(fi, (fi) ? (fi)-\/>fsm-\/>log\_subsys : DLGLOBAL, level, \(\backslash\)}}
\DoxyCodeLine{176 \textcolor{preprocessor}{                             caller\_file, caller\_line, fmt, \#\# args)}}
\DoxyCodeLine{177 }
\DoxyCodeLine{185 \textcolor{preprocessor}{\#define LOGPFSM(fi, fmt, args...) \(\backslash\)}}
\DoxyCodeLine{186 \textcolor{preprocessor}{                LOGPFSML(fi, (fi) ? (fi)-\/>log\_level : LOGL\_ERROR, fmt, \#\# args)}}
\DoxyCodeLine{187 }
\DoxyCodeLine{197 \textcolor{preprocessor}{\#define LOGPFSMSRC(fi, caller\_file, caller\_line, fmt, args...) \(\backslash\)}}
\DoxyCodeLine{198 \textcolor{preprocessor}{                LOGPFSMLSRC(fi, (fi) ? (fi)-\/>log\_level : LOGL\_ERROR, \(\backslash\)}}
\DoxyCodeLine{199 \textcolor{preprocessor}{                            caller\_file, caller\_line, \(\backslash\)}}
\DoxyCodeLine{200 \textcolor{preprocessor}{                            fmt, \#\# args)}}
\DoxyCodeLine{201 }
\DoxyCodeLine{202 \textcolor{preprocessor}{\#define OSMO\_T\_FMT "{}\%c\%u"{}}}
\DoxyCodeLine{203 \textcolor{preprocessor}{\#define OSMO\_T\_FMT\_ARGS(T) ((T) >= 0 ? 'T' : 'X'), ((T) >= 0 ? (T) : -\/(T))}}
\DoxyCodeLine{204 }
\DoxyCodeLine{205 \textcolor{keywordtype}{int} osmo\_fsm\_register(\textcolor{keyword}{struct} osmo\_fsm *fsm);}
\DoxyCodeLine{206 \textcolor{keywordtype}{void} osmo\_fsm\_unregister(\textcolor{keyword}{struct} osmo\_fsm *fsm);}
\DoxyCodeLine{207 \textcolor{keyword}{struct }osmo\_fsm *osmo\_fsm\_find\_by\_name(\textcolor{keyword}{const} \textcolor{keywordtype}{char} *name);}
\DoxyCodeLine{208 \textcolor{keyword}{struct }osmo\_fsm\_inst *osmo\_fsm\_inst\_find\_by\_name(\textcolor{keyword}{const} \textcolor{keyword}{struct} osmo\_fsm *fsm,}
\DoxyCodeLine{209                                                  \textcolor{keyword}{const} \textcolor{keywordtype}{char} *name);}
\DoxyCodeLine{210 \textcolor{keyword}{struct }osmo\_fsm\_inst *osmo\_fsm\_inst\_find\_by\_id(\textcolor{keyword}{const} \textcolor{keyword}{struct} osmo\_fsm *fsm,}
\DoxyCodeLine{211                                                 \textcolor{keyword}{const} \textcolor{keywordtype}{char} *\textcolor{keywordtype}{id});}
\DoxyCodeLine{212 \textcolor{keyword}{struct }osmo\_fsm\_inst *osmo\_fsm\_inst\_alloc(\textcolor{keyword}{struct} osmo\_fsm *fsm, \textcolor{keywordtype}{void} *ctx, \textcolor{keywordtype}{void} *priv,}
\DoxyCodeLine{213                                           \textcolor{keywordtype}{int} log\_level, \textcolor{keyword}{const} \textcolor{keywordtype}{char} *\textcolor{keywordtype}{id});}
\DoxyCodeLine{214 \textcolor{keyword}{struct }osmo\_fsm\_inst *osmo\_fsm\_inst\_alloc\_child(\textcolor{keyword}{struct} osmo\_fsm *fsm,}
\DoxyCodeLine{215                                                 \textcolor{keyword}{struct} osmo\_fsm\_inst *parent,}
\DoxyCodeLine{216                                                 uint32\_t parent\_term\_event);}
\DoxyCodeLine{217 \textcolor{keywordtype}{void} osmo\_fsm\_inst\_unlink\_parent(\textcolor{keyword}{struct} osmo\_fsm\_inst *fi, \textcolor{keywordtype}{void} *ctx);}
\DoxyCodeLine{218 \textcolor{keywordtype}{void} osmo\_fsm\_inst\_change\_parent(\textcolor{keyword}{struct} osmo\_fsm\_inst *fi,}
\DoxyCodeLine{219                                  \textcolor{keyword}{struct} osmo\_fsm\_inst *new\_parent,}
\DoxyCodeLine{220                                  uint32\_t new\_parent\_term\_event);}
\DoxyCodeLine{221 \textcolor{keywordtype}{void} osmo\_fsm\_inst\_free(\textcolor{keyword}{struct} osmo\_fsm\_inst *fi);}
\DoxyCodeLine{222 }
\DoxyCodeLine{223 \textcolor{keywordtype}{int} osmo\_fsm\_inst\_update\_id(\textcolor{keyword}{struct} osmo\_fsm\_inst *fi, \textcolor{keyword}{const} \textcolor{keywordtype}{char} *\textcolor{keywordtype}{id});}
\DoxyCodeLine{224 \textcolor{keywordtype}{int} osmo\_fsm\_inst\_update\_id\_f(\textcolor{keyword}{struct} osmo\_fsm\_inst *fi, \textcolor{keyword}{const} \textcolor{keywordtype}{char} *fmt, ...);}
\DoxyCodeLine{225 \textcolor{keywordtype}{int} osmo\_fsm\_inst\_update\_id\_f\_sanitize(\textcolor{keyword}{struct} osmo\_fsm\_inst *fi, \textcolor{keywordtype}{char} replace\_with, \textcolor{keyword}{const} \textcolor{keywordtype}{char} *fmt, ...);}
\DoxyCodeLine{226 }
\DoxyCodeLine{227 \textcolor{keyword}{const} \textcolor{keywordtype}{char} *osmo\_fsm\_event\_name(\textcolor{keyword}{const} \textcolor{keyword}{struct} osmo\_fsm *fsm, uint32\_t event);}
\DoxyCodeLine{228 \textcolor{keyword}{const} \textcolor{keywordtype}{char} *osmo\_fsm\_inst\_name(\textcolor{keyword}{const} \textcolor{keyword}{struct} osmo\_fsm\_inst *fi);}
\DoxyCodeLine{229 \textcolor{keyword}{const} \textcolor{keywordtype}{char} *osmo\_fsm\_state\_name(\textcolor{keyword}{const} \textcolor{keyword}{struct} osmo\_fsm *fsm, uint32\_t state);}
\DoxyCodeLine{230 }
\DoxyCodeLine{232 \textcolor{keyword}{static} \textcolor{keyword}{inline} \textcolor{keyword}{const} \textcolor{keywordtype}{char} *osmo\_fsm\_inst\_state\_name(\textcolor{keyword}{struct} osmo\_fsm\_inst *fi)}
\DoxyCodeLine{233 \{ \textcolor{keywordflow}{return} fi ? osmo\_fsm\_state\_name(fi-\/>fsm, fi-\/>state) : \textcolor{stringliteral}{"{}NULL"{}}; \}}
\DoxyCodeLine{234 }
\DoxyCodeLine{241 \textcolor{preprocessor}{\#define osmo\_fsm\_inst\_state\_chg(fi, new\_state, timeout\_secs, T) \(\backslash\)}}
\DoxyCodeLine{242 \textcolor{preprocessor}{        \_osmo\_fsm\_inst\_state\_chg(fi, new\_state, timeout\_secs, T, \(\backslash\)}}
\DoxyCodeLine{243 \textcolor{preprocessor}{                                 \_\_FILE\_\_, \_\_LINE\_\_)}}
\DoxyCodeLine{244 \textcolor{keywordtype}{int} \_osmo\_fsm\_inst\_state\_chg(\textcolor{keyword}{struct} osmo\_fsm\_inst *fi, uint32\_t new\_state,}
\DoxyCodeLine{245                              \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{long} timeout\_secs, \textcolor{keywordtype}{int} T,}
\DoxyCodeLine{246                              \textcolor{keyword}{const} \textcolor{keywordtype}{char} *file, \textcolor{keywordtype}{int} line);}
\DoxyCodeLine{247 }
\DoxyCodeLine{248 \textcolor{preprocessor}{\#define osmo\_fsm\_inst\_state\_chg\_ms(fi, new\_state, timeout\_ms, T) \(\backslash\)}}
\DoxyCodeLine{249 \textcolor{preprocessor}{        \_osmo\_fsm\_inst\_state\_chg\_ms(fi, new\_state, timeout\_ms, T, \(\backslash\)}}
\DoxyCodeLine{250 \textcolor{preprocessor}{                                 \_\_FILE\_\_, \_\_LINE\_\_)}}
\DoxyCodeLine{251 \textcolor{keywordtype}{int} \_osmo\_fsm\_inst\_state\_chg\_ms(\textcolor{keyword}{struct} osmo\_fsm\_inst *fi, uint32\_t new\_state,}
\DoxyCodeLine{252                                 \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{long} timeout\_ms, \textcolor{keywordtype}{int} T,}
\DoxyCodeLine{253                                 \textcolor{keyword}{const} \textcolor{keywordtype}{char} *file, \textcolor{keywordtype}{int} line);}
\DoxyCodeLine{254 }
\DoxyCodeLine{264 \textcolor{preprocessor}{\#define osmo\_fsm\_inst\_state\_chg\_keep\_timer(fi, new\_state) \(\backslash\)}}
\DoxyCodeLine{265 \textcolor{preprocessor}{        \_osmo\_fsm\_inst\_state\_chg\_keep\_timer(fi, new\_state, \(\backslash\)}}
\DoxyCodeLine{266 \textcolor{preprocessor}{                                 \_\_FILE\_\_, \_\_LINE\_\_)}}
\DoxyCodeLine{267 \textcolor{keywordtype}{int} \_osmo\_fsm\_inst\_state\_chg\_keep\_timer(\textcolor{keyword}{struct} osmo\_fsm\_inst *fi, uint32\_t new\_state,}
\DoxyCodeLine{268                                         \textcolor{keyword}{const} \textcolor{keywordtype}{char} *file, \textcolor{keywordtype}{int} line);}
\DoxyCodeLine{269 }
\DoxyCodeLine{278 \textcolor{preprocessor}{\#define osmo\_fsm\_inst\_state\_chg\_keep\_or\_start\_timer(fi, new\_state, timeout\_secs, T) \(\backslash\)}}
\DoxyCodeLine{279 \textcolor{preprocessor}{        \_osmo\_fsm\_inst\_state\_chg\_keep\_or\_start\_timer(fi, new\_state, timeout\_secs, T, \(\backslash\)}}
\DoxyCodeLine{280 \textcolor{preprocessor}{                                                     \_\_FILE\_\_, \_\_LINE\_\_)}}
\DoxyCodeLine{281 \textcolor{keywordtype}{int} \_osmo\_fsm\_inst\_state\_chg\_keep\_or\_start\_timer(\textcolor{keyword}{struct} osmo\_fsm\_inst *fi, uint32\_t new\_state,}
\DoxyCodeLine{282                                                  \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{long} timeout\_secs, \textcolor{keywordtype}{int} T,}
\DoxyCodeLine{283                                                  \textcolor{keyword}{const} \textcolor{keywordtype}{char} *file, \textcolor{keywordtype}{int} line);}
\DoxyCodeLine{284 }
\DoxyCodeLine{285 \textcolor{preprocessor}{\#define osmo\_fsm\_inst\_state\_chg\_keep\_or\_start\_timer\_ms(fi, new\_state, timeout\_ms, T) \(\backslash\)}}
\DoxyCodeLine{286 \textcolor{preprocessor}{        \_osmo\_fsm\_inst\_state\_chg\_keep\_or\_start\_timer\_ms(fi, new\_state, timeout\_ms, T, \(\backslash\)}}
\DoxyCodeLine{287 \textcolor{preprocessor}{                                                     \_\_FILE\_\_, \_\_LINE\_\_)}}
\DoxyCodeLine{288 \textcolor{keywordtype}{int} \_osmo\_fsm\_inst\_state\_chg\_keep\_or\_start\_timer\_ms(\textcolor{keyword}{struct} osmo\_fsm\_inst *fi, uint32\_t new\_state,}
\DoxyCodeLine{289                                                    \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{long} timeout\_ms, \textcolor{keywordtype}{int} T,}
\DoxyCodeLine{290                                                    \textcolor{keyword}{const} \textcolor{keywordtype}{char} *file, \textcolor{keywordtype}{int} line);}
\DoxyCodeLine{291 }
\DoxyCodeLine{292 }
\DoxyCodeLine{299 \textcolor{preprocessor}{\#define osmo\_fsm\_inst\_dispatch(fi, event, data) \(\backslash\)}}
\DoxyCodeLine{300 \textcolor{preprocessor}{        \_osmo\_fsm\_inst\_dispatch(fi, event, data, \_\_FILE\_\_, \_\_LINE\_\_)}}
\DoxyCodeLine{301 \textcolor{keywordtype}{int} \_osmo\_fsm\_inst\_dispatch(\textcolor{keyword}{struct} osmo\_fsm\_inst *fi, uint32\_t event, \textcolor{keywordtype}{void} *data,}
\DoxyCodeLine{302                             \textcolor{keyword}{const} \textcolor{keywordtype}{char} *file, \textcolor{keywordtype}{int} line);}
\DoxyCodeLine{303 }
\DoxyCodeLine{310 \textcolor{preprocessor}{\#define osmo\_fsm\_inst\_term(fi, cause, data) \(\backslash\)}}
\DoxyCodeLine{311 \textcolor{preprocessor}{        \_osmo\_fsm\_inst\_term(fi, cause, data, \_\_FILE\_\_, \_\_LINE\_\_)}}
\DoxyCodeLine{312 \textcolor{keywordtype}{void} \_osmo\_fsm\_inst\_term(\textcolor{keyword}{struct} osmo\_fsm\_inst *fi,}
\DoxyCodeLine{313                          \textcolor{keyword}{enum} osmo\_fsm\_term\_cause cause, \textcolor{keywordtype}{void} *data,}
\DoxyCodeLine{314                          \textcolor{keyword}{const} \textcolor{keywordtype}{char} *file, \textcolor{keywordtype}{int} line);}
\DoxyCodeLine{315 }
\DoxyCodeLine{322 \textcolor{preprocessor}{\#define osmo\_fsm\_inst\_term\_children(fi, cause, data) \(\backslash\)}}
\DoxyCodeLine{323 \textcolor{preprocessor}{        \_osmo\_fsm\_inst\_term\_children(fi, cause, data, \_\_FILE\_\_, \_\_LINE\_\_)}}
\DoxyCodeLine{324 \textcolor{keywordtype}{void} \_osmo\_fsm\_inst\_term\_children(\textcolor{keyword}{struct} osmo\_fsm\_inst *fi,}
\DoxyCodeLine{325                                   \textcolor{keyword}{enum} osmo\_fsm\_term\_cause cause,}
\DoxyCodeLine{326                                   \textcolor{keywordtype}{void} *data,}
\DoxyCodeLine{327                                   \textcolor{keyword}{const} \textcolor{keywordtype}{char} *file, \textcolor{keywordtype}{int} line);}
\DoxyCodeLine{328 }
\DoxyCodeLine{335 \textcolor{preprocessor}{\#define osmo\_fsm\_inst\_broadcast\_children(fi, cause, data) \(\backslash\)}}
\DoxyCodeLine{336 \textcolor{preprocessor}{        \_osmo\_fsm\_inst\_broadcast\_children(fi, cause, data, \_\_FILE\_\_, \_\_LINE\_\_)}}
\DoxyCodeLine{337 \textcolor{keywordtype}{void} \_osmo\_fsm\_inst\_broadcast\_children(\textcolor{keyword}{struct} osmo\_fsm\_inst *fi, uint32\_t event,}
\DoxyCodeLine{338                                         \textcolor{keywordtype}{void} *data, \textcolor{keyword}{const} \textcolor{keywordtype}{char} *file, \textcolor{keywordtype}{int} line);}
\DoxyCodeLine{339 }

\end{DoxyCode}
