From e7493499ee943ec0f8e14b46dc69fd06b6c07362 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Tue, 3 Jan 2023 20:42:37 -0800 Subject: [PATCH] [notifier] update to use `Callback` (#8611) This commit updates `Notifier` class to use the recently added `Callback` for the external callbacks. --- src/core/common/callback.hpp | 15 +++++++++++++++ src/core/common/notifier.cpp | 29 +++++++++-------------------- src/core/common/notifier.hpp | 7 ++----- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/core/common/callback.hpp b/src/core/common/callback.hpp index 949a190f7..02e4cf33f 100644 --- a/src/core/common/callback.hpp +++ b/src/core/common/callback.hpp @@ -105,6 +105,21 @@ public: */ void *GetContext(void) const { return mContext; } + /** + * This method indicates whether the callback matches a given handler function pointer and context. + * + * @param[in] aHandler The handler function pointer to compare with. + * @param[in] aContext The context associated with handler. + * + * @retval TRUE The callback matches @p aHandler and @p aContext. + * @retval FALSE The callback does not match @p aHandler and @p aContext. + * + */ + bool Matches(HandlerType aHandler, void *aContext) const + { + return (mHandler == aHandler) && (mContext == aContext); + } + protected: CallbackBase(void) : mHandler(nullptr) diff --git a/src/core/common/notifier.cpp b/src/core/common/notifier.cpp index 688c440af..8a60c664b 100644 --- a/src/core/common/notifier.cpp +++ b/src/core/common/notifier.cpp @@ -50,8 +50,7 @@ Notifier::Notifier(Instance &aInstance) { for (ExternalCallback &callback : mExternalCallbacks) { - callback.mHandler = nullptr; - callback.mContext = nullptr; + callback.Clear(); } } @@ -64,23 +63,17 @@ Error Notifier::RegisterCallback(otStateChangedCallback aCallback, void *aContex for (ExternalCallback &callback : mExternalCallbacks) { - if (callback.mHandler == nullptr) + VerifyOrExit(!callback.Matches(aCallback, aContext), error = kErrorAlready); + + if (!callback.IsSet() && (unusedCallback == nullptr)) { - if (unusedCallback == nullptr) - { - unusedCallback = &callback; - } - - continue; + unusedCallback = &callback; } - - VerifyOrExit((callback.mHandler != aCallback) || (callback.mContext != aContext), error = kErrorAlready); } VerifyOrExit(unusedCallback != nullptr, error = kErrorNoBufs); - unusedCallback->mHandler = aCallback; - unusedCallback->mContext = aContext; + unusedCallback->Set(aCallback, aContext); exit: return error; @@ -92,10 +85,9 @@ void Notifier::RemoveCallback(otStateChangedCallback aCallback, void *aContext) for (ExternalCallback &callback : mExternalCallbacks) { - if ((callback.mHandler == aCallback) && (callback.mContext == aContext)) + if (callback.Matches(aCallback, aContext)) { - callback.mHandler = nullptr; - callback.mContext = nullptr; + callback.Clear(); } } @@ -199,10 +191,7 @@ void Notifier::EmitEvents(void) for (ExternalCallback &callback : mExternalCallbacks) { - if (callback.mHandler != nullptr) - { - callback.mHandler(events.GetAsFlags(), callback.mContext); - } + callback.InvokeIfSet(events.GetAsFlags()); } exit: diff --git a/src/core/common/notifier.hpp b/src/core/common/notifier.hpp index b3e4b56b4..cd05f2dc5 100644 --- a/src/core/common/notifier.hpp +++ b/src/core/common/notifier.hpp @@ -42,6 +42,7 @@ #include #include +#include "common/callback.hpp" #include "common/error.hpp" #include "common/locator.hpp" #include "common/non_copyable.hpp" @@ -308,11 +309,7 @@ private: static constexpr uint16_t kFlagsStringBufferSize = kFlagsStringLineLimit + kMaxFlagNameLength; - struct ExternalCallback - { - otStateChangedCallback mHandler; - void *mContext; - }; + typedef Callback ExternalCallback; void EmitEvents(void);