[notifier] use Array to track external callbacks (#10907)

This commit simplifies `Notifier` by using `Array` to track
registered callbacks.
This commit is contained in:
Abtin Keshavarzian
2024-11-10 20:05:24 -08:00
committed by GitHub
parent 0fb1c22d24
commit 2dce461b25
3 changed files with 45 additions and 50 deletions
+10 -34
View File
@@ -43,51 +43,27 @@ Notifier::Notifier(Instance &aInstance)
: InstanceLocator(aInstance)
, mTask(aInstance)
{
for (ExternalCallback &callback : mExternalCallbacks)
{
callback.Clear();
}
}
Error Notifier::RegisterCallback(otStateChangedCallback aCallback, void *aContext)
Error Notifier::RegisterCallback(StateChangedCallback aCallback, void *aContext)
{
Error error = kErrorNone;
ExternalCallback *unusedCallback = nullptr;
Error error = kErrorNone;
ExternalCallback newCallback;
VerifyOrExit(aCallback != nullptr);
for (ExternalCallback &callback : mExternalCallbacks)
{
VerifyOrExit(!callback.Matches(aCallback, aContext), error = kErrorAlready);
if (!callback.IsSet() && (unusedCallback == nullptr))
{
unusedCallback = &callback;
}
}
VerifyOrExit(unusedCallback != nullptr, error = kErrorNoBufs);
unusedCallback->Set(aCallback, aContext);
newCallback.Set(aCallback, aContext);
VerifyOrExit(!mExternalCallbacks.Contains(newCallback), error = kErrorAlready);
error = mExternalCallbacks.PushBack(newCallback);
exit:
return error;
}
void Notifier::RemoveCallback(otStateChangedCallback aCallback, void *aContext)
void Notifier::RemoveCallback(StateChangedCallback aCallback, void *aContext)
{
VerifyOrExit(aCallback != nullptr);
ExternalCallback callbackToRemove;
for (ExternalCallback &callback : mExternalCallbacks)
{
if (callback.Matches(aCallback, aContext))
{
callback.Clear();
}
}
exit:
return;
callbackToRemove.Set(aCallback, aContext);
mExternalCallbacks.Remove(callbackToRemove);
}
void Notifier::Signal(Event aEvent)