summaryrefslogtreecommitdiffstats
path: root/include/osmocom
diff options
context:
space:
mode:
Diffstat (limited to 'include/osmocom')
-rw-r--r--include/osmocom/core/fsm.h41
-rw-r--r--include/osmocom/core/logging.h27
2 files changed, 58 insertions, 10 deletions
diff --git a/include/osmocom/core/fsm.h b/include/osmocom/core/fsm.h
index 026ed01a..77072ef8 100644
--- a/include/osmocom/core/fsm.h
+++ b/include/osmocom/core/fsm.h
@@ -131,11 +131,40 @@ 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);
-int osmo_fsm_inst_state_chg(struct osmo_fsm_inst *fi, uint32_t new_state,
- unsigned long timeout_secs, int T);
-int osmo_fsm_inst_dispatch(struct osmo_fsm_inst *fi, uint32_t event, void *data);
-
-void osmo_fsm_inst_term(struct osmo_fsm_inst *fi,
- enum osmo_fsm_term_cause cause, void *data);
+/*! \brief perform a state change of the given FSM instance
+ *
+ * This is a macro that calls _osmo_fsm_inst_state_chg() with the given
+ * parameters as well as the caller's source file and line number for logging
+ * purposes. See there for documentation.
+ */
+#define osmo_fsm_inst_state_chg(fi, new_state, timeout_secs, T) \
+ _osmo_fsm_inst_state_chg(fi, new_state, timeout_secs, T, \
+ __BASE_FILE__, __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);
+
+/*! \brief dispatch an event to an osmocom finite state machine instance
+ *
+ * This is a macro that calls _osmo_fsm_inst_dispatch() with the given
+ * parameters as well as the caller's source file and line number for logging
+ * purposes. See there for documentation.
+ */
+#define osmo_fsm_inst_dispatch(fi, event, data) \
+ _osmo_fsm_inst_dispatch(fi, event, data, __BASE_FILE__, __LINE__)
+int _osmo_fsm_inst_dispatch(struct osmo_fsm_inst *fi, uint32_t event, void *data,
+ const char *file, int line);
+
+/*! \brief Terminate FSM instance with given cause
+ *
+ * This is a macro that calls _osmo_fsm_inst_term() with the given parameters
+ * as well as the caller's source file and line number for logging purposes.
+ * See there for documentation.
+ */
+#define osmo_fsm_inst_term(fi, cause, data) \
+ _osmo_fsm_inst_term(fi, cause, data, __BASE_FILE__, __LINE__)
+void _osmo_fsm_inst_term(struct osmo_fsm_inst *fi,
+ enum osmo_fsm_term_cause cause, void *data,
+ const char *file, int line);
/*! @} */
diff --git a/include/osmocom/core/logging.h b/include/osmocom/core/logging.h
index 1ca348a2..fe9ae93f 100644
--- a/include/osmocom/core/logging.h
+++ b/include/osmocom/core/logging.h
@@ -55,10 +55,7 @@ void logp(int subsys, const char *file, int line, int cont, const char *format,
* \param[in] args variable argument list
*/
#define LOGP(ss, level, fmt, args...) \
- do { \
- if (log_check_level(ss, level)) \
- logp2(ss, level, __BASE_FILE__, __LINE__, 0, fmt, ##args); \
- } while(0)
+ LOGPSRC(ss, level, NULL, 0, fmt, ## args)
/*! \brief Continue a log message through the Osmocom logging framework
* \param[in] ss logging subsystem (e.g. \ref DLGLOBAL)
@@ -72,6 +69,28 @@ void logp(int subsys, const char *file, int line, int cont, const char *format,
logp2(ss, level, __BASE_FILE__, __LINE__, 1, fmt, ##args); \
} while(0)
+/*! \brief Log through the Osmocom logging framework with explicit source.
+ * If caller_file is passed as NULL, __BASE_FILE__ and __LINE__ are used
+ * instead of caller_file and caller_line (so that this macro here defines
+ * both cases in the same place, and to catch cases where callers fail to pass
+ * a non-null filename string).
+ * \param[in] ss logging subsystem (e.g. \ref DLGLOBAL)
+ * \param[in] level logging level (e.g. \ref LOGL_NOTICE)
+ * \param[in] caller_file caller's source file string (e.g. __BASE_FILE__)
+ * \param[in] caller_line caller's source line nr (e.g. __LINE__)
+ * \param[in] fmt format string
+ * \param[in] args variable argument list
+ */
+#define LOGPSRC(ss, level, caller_file, caller_line, fmt, args...) \
+ do { \
+ if (log_check_level(ss, level)) {\
+ if (caller_file) \
+ logp2(ss, level, caller_file, caller_line, 0, fmt, ##args); \
+ else \
+ logp2(ss, level, __BASE_FILE__, __LINE__, 0, fmt, ##args); \
+ }\
+ } while(0)
+
/*! \brief different log levels */
#define LOGL_DEBUG 1 /*!< \brief debugging information */
#define LOGL_INFO 3 /*!< \brief general information */