1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

ListenerList: Fix a bug where removing a listener during a callback in which it had also been added prevents other listeners from being called

This commit is contained in:
Anthony Nicholls 2024-06-25 09:36:05 +01:00
parent 43762c7575
commit 06fb8f4ea2
2 changed files with 46 additions and 11 deletions

View file

@ -135,7 +135,8 @@ public:
{
for (auto* it : *iterators)
{
--it->end;
if (index < it->end)
--it->end;
if (index <= it->index)
--it->index;

View file

@ -431,25 +431,59 @@ public:
ListenerList<Listener> listeners;
expect (listeners.size() == 0);
Listener listener;
listeners.add (&listener);
expect (listeners.size() == 1);
Listener listener1;
Listener listener2;
listeners.add (&listener1);
listeners.add (&listener2);
expect (listeners.size() == 2);
bool listenerCalled = false;
int numberOfCallbacks = 0;
listeners.call ([&] (auto& l)
{
listeners.remove (&l);
expect (listeners.size() == 0);
listeners.add (&l);
expect (listeners.size() == 1);
listenerCalled = true;
listeners.add (&l);
expect (listeners.size() == 2);
++numberOfCallbacks;
});
expect (listenerCalled);
expect (listeners.size() == 1);
expect (numberOfCallbacks == 2);
expect (listeners.size() == 2);
}
beginTest ("Add and remove a nested listener");
{
struct Listener{};
ListenerList<Listener> listeners;
expect (listeners.size() == 0);
Listener listener1;
Listener listener2;
listeners.add (&listener1);
listeners.add (&listener2);
expect (listeners.size() == 2);
int numberOfCallbacks = 0;
listeners.call ([&] (auto)
{
Listener nestedListener;
listeners.add (&nestedListener);
expect (listeners.size() == 3);
listeners.remove (&nestedListener);
expect (listeners.size() == 2);
++numberOfCallbacks;
});
expect (numberOfCallbacks == 2);
expect (listeners.size() == 2);
}
}