Skip to content

Commit 32f7fa3

Browse files
committed
Migrate ConfigOption to ListenerSet.
1 parent fb5dc6d commit 32f7fa3

File tree

2 files changed

+12
-23
lines changed

2 files changed

+12
-23
lines changed

Common/Cpp/ListenerSet.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ namespace PokemonAutomation{
1717
template <typename ListenerType>
1818
class ListenerSet{
1919
public:
20+
bool empty() const{
21+
std::lock_guard<std::mutex> lg(m_lock);
22+
return m_listeners.empty();
23+
}
2024
size_t count_unique() const{
2125
std::lock_guard<std::mutex> lg(m_lock);
2226
return m_listeners.size();

Common/Cpp/Options/ConfigOption.cpp

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,9 @@
44
*
55
*/
66

7-
#include <set>
7+
#include "Common/Cpp/ListenerSet.h"
88
#include "Common/Cpp/Containers/Pimpl.tpp"
99
#include "Common/Cpp/Json/JsonValue.h"
10-
#include "Common/Cpp/Concurrency/SpinLock.h"
1110
#include "ConfigOption.h"
1211

1312
//#include <iostream>
@@ -21,8 +20,7 @@ struct ConfigOption::Data{
2120
const LockMode lock_mode;
2221
std::atomic<ConfigOptionState> visibility;
2322

24-
mutable SpinLock listener_lock;
25-
std::set<Listener*> listeners;
23+
ListenerSet<Listener> listeners;
2624

2725
Data(LockMode p_lock_mode, ConfigOptionState p_visibility)
2826
: lock_mode(p_lock_mode)
@@ -66,20 +64,17 @@ ConfigOption::ConfigOption(ConfigOptionState visibility)
6664
void ConfigOption::add_listener(Listener& listener){
6765
m_lifetime_sanitizer.check_usage();
6866
Data& data = *m_data;
69-
WriteSpinLock lg(data.listener_lock);
70-
data.listeners.insert(&listener);
67+
data.listeners.add(listener);
7168
}
7269
void ConfigOption::remove_listener(Listener& listener){
7370
m_lifetime_sanitizer.check_usage();
7471
Data& data = *m_data;
75-
WriteSpinLock lg(data.listener_lock);
76-
data.listeners.erase(&listener);
72+
data.listeners.remove(listener);
7773
}
7874
size_t ConfigOption::total_listeners() const{
7975
m_lifetime_sanitizer.check_usage();
8076
const Data& data = *m_data;
81-
ReadSpinLock lg(data.listener_lock);
82-
return data.listeners.size();
77+
return data.listeners.count_unique();
8378
}
8479

8580

@@ -119,27 +114,17 @@ void ConfigOption::set_visibility(ConfigOptionState visibility){
119114
void ConfigOption::report_visibility_changed(){
120115
m_lifetime_sanitizer.check_usage();
121116
Data& data = *m_data;
122-
ReadSpinLock lg(data.listener_lock);
123-
for (Listener* listener : data.listeners){
124-
listener->visibility_changed();
125-
}
117+
data.listeners.run_method_unique(&Listener::visibility_changed);
126118
}
127119
void ConfigOption::report_program_state(bool program_is_running){
128120
m_lifetime_sanitizer.check_usage();
129121
Data& data = *m_data;
130-
ReadSpinLock lg(data.listener_lock);
131-
for (Listener* listener : data.listeners){
132-
listener->program_state_changed(program_is_running);
133-
}
122+
data.listeners.run_method_unique(&Listener::program_state_changed, program_is_running);
134123
}
135124
void ConfigOption::report_value_changed(void* object){
136125
m_lifetime_sanitizer.check_usage();
137126
Data& data = *m_data;
138-
ReadSpinLock lg(data.listener_lock);
139-
// cout << "listeners = " << data.listeners.size() << endl;
140-
for (Listener* listener : data.listeners){
141-
listener->value_changed(object);
142-
}
127+
data.listeners.run_method_unique(&Listener::value_changed, object);
143128
}
144129

145130

0 commit comments

Comments
 (0)