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)
6664void 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}
7269void 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}
7874size_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){
119114void 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}
127119void 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}
135124void 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