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/.
neels gerrit-no-reply at lists.osmocom.orgneels has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/15661 Change subject: add osmo_fsm_inst_dispatch_and_watch() ...................................................................... add osmo_fsm_inst_dispatch_and_watch() The most common use case for osmo_fsm_inst_watch() is to dispatch an event and determine whether that caused deallocation. Add this convenience wrapper to simplify implementing this use case. This: void event_action() { struct osmo_fsm_inst_watcher watch_bar; osmo_fsm_inst_watch(&watch_bar, bar); osmo_fsm_inst_dispatch(foo, FOO_EVENT, NULL); osmo_fsm_inst_unwatch(&watch_bar); if (watch_bar.exists) osmo_fsm_inst_dispatch(bar, BAR_EVENT, NULL); } becomes: void event_action() { if (osmo_fsm_inst_dispatch_and_watch(foo, FOO_EVENT, NULL, bar, NULL)) osmo_fsm_inst_dispatch(bar, BAR_EVENT, NULL); } Change-Id: Ie9a77783d2052d4677fc5d0a7eb15f9e3b0fda8f --- M include/osmocom/core/fsm.h M src/fsm.c 2 files changed, 41 insertions(+), 0 deletions(-) git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/61/15661/1 diff --git a/include/osmocom/core/fsm.h b/include/osmocom/core/fsm.h index 2487124..8e9ed77 100644 --- a/include/osmocom/core/fsm.h +++ b/include/osmocom/core/fsm.h @@ -301,6 +301,20 @@ 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 FSM instance, while watching out for deallocation of this or another instance. + * + * This is a convenience wrapper for using osmo_fsm_inst_watch() and osmo_fsm_inst_dispatch(). + * + * This is a macro that calls _osmo_fsm_inst_dispatch_and_watch() 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_and_watch(fi, event, data, watch_fi, rc_p) \ + _osmo_fsm_inst_dispatch_and_watch(fi, event, data, watch_fi, rc_p, __FILE__, __LINE__) +bool _osmo_fsm_inst_dispatch_and_watch(struct osmo_fsm_inst *fi, uint32_t event, void *data, + struct osmo_fsm_inst *watch_fi, int *rc_p, + const char *file, int line); + /*! Terminate FSM instance with given cause * * This is a macro that calls _osmo_fsm_inst_term() with the given parameters diff --git a/src/fsm.c b/src/fsm.c index 03f22cb..526a7ad 100644 --- a/src/fsm.c +++ b/src/fsm.c @@ -836,6 +836,33 @@ return 0; } +/*! dispatch an event to an FSM instance, while watching out for deallocation of this or another instance. + * + * This is a convenience wrapper for using osmo_fsm_inst_watch() and osmo_fsm_inst_dispatch(). + * + * \param[in] fi FSM instance to dispatch event to. + * \param[in] event Event to dispatch. + * \param[in] data Data to pass along with the event. + * \param[in] watch_fi FSM instance to watch deallocation of (possibly but not necessarily identical to fi). + * \param[out] rc_p If not NULL, return the _osmo_fsm_inst_dispatch() return value in this int. + * \param[in] file Calling source file (from osmo_fsm_inst_dispatch macro) + * \param[in] line Calling source line (from osmo_fsm_inst_dispatch macro) + * \returns true if watch_fi still exists after dispatching the event, false if it was deallocated or was NULL. + */ +bool _osmo_fsm_inst_dispatch_and_watch(struct osmo_fsm_inst *fi, uint32_t event, void *data, + struct osmo_fsm_inst *watch_fi, int *rc_p, + const char *file, int line) +{ + int rc; + struct osmo_fsm_inst_watcher watcher; + osmo_fsm_inst_watch(&watcher, watch_fi); + rc = _osmo_fsm_inst_dispatch(fi, event, data, file, line); + osmo_fsm_inst_unwatch(&watcher); + if (rc_p) + *rc_p = rc; + return watcher.exists; +} + /*! Terminate FSM instance with given cause * * This safely terminates the given FSM instance by first iterating -- To view, visit https://gerrit.osmocom.org/c/libosmocore/+/15661 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: libosmocore Gerrit-Branch: master Gerrit-Change-Id: Ie9a77783d2052d4677fc5d0a7eb15f9e3b0fda8f Gerrit-Change-Number: 15661 Gerrit-PatchSet: 1 Gerrit-Owner: neels <nhofmeyr at sysmocom.de> Gerrit-MessageType: newchange -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20191002/5d1b50c2/attachment.htm>