Skip to content

Commit 9d055a8

Browse files
committed
Simplify the ListenerSet API.
1 parent 11f9dea commit 9d055a8

23 files changed

+87
-153
lines changed

Common/Cpp/CancellableScope.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ bool Cancellable::cancel(std::exception_ptr exception) noexcept{
7575
// if (data.cancelled.exchange(true, std::memory_order_relaxed)){
7676
// return true;
7777
// }
78-
m_impl->m_listeners.run_method_with_duplicates(&CancelListener::on_cancellable_cancel);
78+
m_impl->m_listeners.run_method(&CancelListener::on_cancellable_cancel);
7979
return false;
8080
}
8181
void Cancellable::throw_if_cancelled() const{

Common/Cpp/ListenerSet.h

Lines changed: 2 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,8 @@ class ListenerSet{
3939
bool try_add(ListenerType& listener);
4040
bool try_remove(ListenerType& listener);
4141

42-
template <typename Lambda>
43-
void run_lambda_unique(Lambda&& lambda);
44-
template <typename Lambda>
45-
void run_lambda_with_duplicates(Lambda&& lambda);
46-
47-
template <typename Function, class... Args>
48-
void run_method_unique(Function function, Args&&... args);
4942
template <typename Function, class... Args>
50-
void run_method_with_duplicates(Function function, Args&&... args);
43+
void run_method(Function function, Args&&... args);
5144

5245
private:
5346
// Optimization. Keep an atomic version of the count. This will let us
@@ -133,47 +126,9 @@ bool ListenerSet<ListenerType>::try_remove(ListenerType& listener){
133126

134127

135128

136-
template <typename ListenerType>
137-
template <typename Lambda>
138-
void ListenerSet<ListenerType>::run_lambda_unique(Lambda&& lambda){
139-
#ifdef PA_DEBUG_ListenerSet
140-
auto scope = m_sanitizer.check_scope();
141-
#endif
142-
if (empty()){
143-
return;
144-
}
145-
ReadSpinLock lg(m_lock);
146-
for (auto& item : m_listeners){
147-
lambda(*item.first);
148-
}
149-
}
150-
151-
152-
153-
template <typename ListenerType>
154-
template <typename Lambda>
155-
void ListenerSet<ListenerType>::run_lambda_with_duplicates(Lambda&& lambda){
156-
#ifdef PA_DEBUG_ListenerSet
157-
auto scope = m_sanitizer.check_scope();
158-
#endif
159-
if (empty()){
160-
return;
161-
}
162-
ReadSpinLock lg(m_lock);
163-
for (auto& item : m_listeners){
164-
ListenerType& listener = *item.first;
165-
size_t count = item.second;
166-
do{
167-
lambda(listener);
168-
}while (--count);
169-
}
170-
}
171-
172-
173-
174129
template <typename ListenerType>
175130
template <typename Function, class... Args>
176-
void ListenerSet<ListenerType>::run_method_unique(Function function, Args&&... args){
131+
void ListenerSet<ListenerType>::run_method(Function function, Args&&... args){
177132
#ifdef PA_DEBUG_ListenerSet
178133
auto scope = m_sanitizer.check_scope();
179134
#endif
@@ -188,27 +143,6 @@ void ListenerSet<ListenerType>::run_method_unique(Function function, Args&&... a
188143

189144

190145

191-
template <typename ListenerType>
192-
template <typename Function, class... Args>
193-
void ListenerSet<ListenerType>::run_method_with_duplicates(Function function, Args&&... args){
194-
#ifdef PA_DEBUG_ListenerSet
195-
auto scope = m_sanitizer.check_scope();
196-
#endif
197-
if (empty()){
198-
return;
199-
}
200-
ReadSpinLock lg(m_lock);
201-
for (auto& item : m_listeners){
202-
ListenerType& listener = *item.first;
203-
size_t count = item.second;
204-
do{
205-
(listener.*function)(std::forward<Args>(args)...);
206-
}while (--count);
207-
}
208-
}
209-
210-
211-
212146

213147

214148

Common/Cpp/Options/ConfigOption.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,17 +115,17 @@ void ConfigOption::set_visibility(ConfigOptionState visibility){
115115
void ConfigOption::report_visibility_changed(){
116116
auto scope = m_lifetime_sanitizer.check_scope();
117117
Data& data = *m_data;
118-
data.listeners.run_method_unique(&Listener::on_config_visibility_changed);
118+
data.listeners.run_method(&Listener::on_config_visibility_changed);
119119
}
120120
void ConfigOption::report_program_state(bool program_is_running){
121121
auto scope = m_lifetime_sanitizer.check_scope();
122122
Data& data = *m_data;
123-
data.listeners.run_method_unique(&Listener::on_program_state_changed, program_is_running);
123+
data.listeners.run_method(&Listener::on_program_state_changed, program_is_running);
124124
}
125125
void ConfigOption::report_value_changed(void* object){
126126
auto scope = m_lifetime_sanitizer.check_scope();
127127
Data& data = *m_data;
128-
data.listeners.run_method_unique(&Listener::on_config_value_changed, object);
128+
data.listeners.run_method(&Listener::on_config_value_changed, object);
129129
}
130130

131131

Common/Cpp/Sockets/ClientSocket_POSIX.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ class ClientSocket_POSIX final : public AbstractClientSocket{
120120
}
121121

122122
void thread_loop_internal(const std::string& address, uint16_t port){
123-
m_listeners.run_method_unique(&Listener::on_thread_start);
123+
m_listeners.run_method(&Listener::on_thread_start);
124124

125125
{
126126
std::unique_lock<std::mutex> lg(m_lock);
@@ -155,13 +155,13 @@ class ClientSocket_POSIX final : public AbstractClientSocket{
155155
m_state.store(State::NOT_RUNNING, std::memory_order_relaxed);
156156
m_error = "Connection timed out.";
157157
m_lock.unlock();
158-
m_listeners.run_method_unique(&Listener::on_connect_finished, m_error);
158+
m_listeners.run_method(&Listener::on_connect_finished, m_error);
159159
return;
160160
default:
161161
m_state.store(State::NOT_RUNNING, std::memory_order_relaxed);
162162
m_error = "WSA Error Code: " + std::to_string(error);
163163
m_lock.unlock();
164-
m_listeners.run_method_unique(&Listener::on_connect_finished, m_error);
164+
m_listeners.run_method(&Listener::on_connect_finished, m_error);
165165
return;
166166
}
167167

@@ -173,7 +173,7 @@ class ClientSocket_POSIX final : public AbstractClientSocket{
173173
m_state.store(State::CONNECTED, std::memory_order_relaxed);
174174
}
175175

176-
m_listeners.run_method_unique(&Listener::on_connect_finished, "");
176+
m_listeners.run_method(&Listener::on_connect_finished, "");
177177

178178

179179
constexpr size_t BUFFER_SIZE = 4096;
@@ -195,7 +195,7 @@ class ClientSocket_POSIX final : public AbstractClientSocket{
195195
}
196196

197197
if (bytes > 0){
198-
m_listeners.run_method_unique(&Listener::on_receive_data, buffer, bytes);
198+
m_listeners.run_method(&Listener::on_receive_data, buffer, bytes);
199199
continue;
200200
}
201201

Common/Cpp/Sockets/ClientSocket_Qt.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ class ClientSocket_Qt final : public QThread, public AbstractClientSocket{
9999
&socket, [this]{
100100
// cout << "connected()" << endl;
101101
m_state.store(State::CONNECTED, std::memory_order_release);
102-
m_listeners.run_method_unique(&Listener::on_connect_finished, "");
102+
m_listeners.run_method(&Listener::on_connect_finished, "");
103103
}
104104
);
105105
QThread::connect(
@@ -127,7 +127,7 @@ class ClientSocket_Qt final : public QThread, public AbstractClientSocket{
127127
qint64 bytes = m_socket->read(buffer, BUFFER_SIZE);
128128
if (bytes > 0){
129129
// cout << "Received: " << std::string(buffer, bytes) << endl;
130-
m_listeners.run_method_unique(&Listener::on_receive_data, buffer, bytes);
130+
m_listeners.run_method(&Listener::on_receive_data, buffer, bytes);
131131
}
132132
}
133133
);

Common/Cpp/Sockets/ClientSocket_WinSocket.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ class ClientSocket_WinSocket final : public AbstractClientSocket{
132132
}
133133

134134
void thread_loop_internal(const std::string& address, uint16_t port){
135-
m_listeners.run_method_unique(&Listener::on_thread_start);
135+
m_listeners.run_method(&Listener::on_thread_start);
136136

137137
{
138138
std::unique_lock<std::mutex> lg(m_lock);
@@ -166,13 +166,13 @@ class ClientSocket_WinSocket final : public AbstractClientSocket{
166166
m_state.store(State::NOT_RUNNING, std::memory_order_relaxed);
167167
m_error = "Connection timed out.";
168168
m_lock.unlock();
169-
m_listeners.run_method_unique(&Listener::on_connect_finished, m_error);
169+
m_listeners.run_method(&Listener::on_connect_finished, m_error);
170170
return;
171171
default:
172172
m_state.store(State::NOT_RUNNING, std::memory_order_relaxed);
173173
m_error = "WSA Error Code: " + std::to_string(error);
174174
m_lock.unlock();
175-
m_listeners.run_method_unique(&Listener::on_connect_finished, m_error);
175+
m_listeners.run_method(&Listener::on_connect_finished, m_error);
176176
return;
177177
}
178178

@@ -184,7 +184,7 @@ class ClientSocket_WinSocket final : public AbstractClientSocket{
184184
m_state.store(State::CONNECTED, std::memory_order_relaxed);
185185
}
186186

187-
m_listeners.run_method_unique(&Listener::on_connect_finished, "");
187+
m_listeners.run_method(&Listener::on_connect_finished, "");
188188

189189

190190
constexpr size_t BUFFER_SIZE = 4096;
@@ -205,7 +205,7 @@ class ClientSocket_WinSocket final : public AbstractClientSocket{
205205
}
206206

207207
if (bytes > 0){
208-
m_listeners.run_method_unique(&Listener::on_receive_data, buffer, bytes);
208+
m_listeners.run_method(&Listener::on_receive_data, buffer, bytes);
209209
continue;
210210
}
211211

SerialPrograms/Source/CommonFramework/AudioPipeline/AudioSession.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,8 @@ void AudioSession::set(const AudioOption& option){
9797

9898
signal_post_input_change();
9999
signal_post_output_change();
100-
m_listeners.run_method_unique(&StateListener::post_volume_change, m_option.volume());
101-
m_listeners.run_method_unique(&StateListener::post_display_change, m_option.m_display_type);
100+
m_listeners.run_method(&StateListener::post_volume_change, m_option.volume());
101+
m_listeners.run_method(&StateListener::post_display_change, m_option.m_display_type);
102102
}
103103
std::pair<std::string, AudioDeviceInfo> AudioSession::input_device() const{
104104
std::lock_guard<std::mutex> lg(m_lock);
@@ -199,7 +199,7 @@ void AudioSession::set_volume(double volume){
199199
m_devices->set_sink_volume(volume);
200200
m_option.m_volume = volume;
201201
}
202-
m_listeners.run_method_unique(&StateListener::post_volume_change, m_option.volume());
202+
m_listeners.run_method(&StateListener::post_volume_change, m_option.volume());
203203
}
204204
void AudioSession::set_display(AudioOption::AudioDisplayType display){
205205
{
@@ -209,7 +209,7 @@ void AudioSession::set_display(AudioOption::AudioDisplayType display){
209209
}
210210
m_option.m_display_type = display;
211211
}
212-
m_listeners.run_method_unique(&StateListener::post_display_change, m_option.m_display_type);
212+
m_listeners.run_method(&StateListener::post_display_change, m_option.m_display_type);
213213
}
214214

215215
bool AudioSession::sanitize_format(){
@@ -241,18 +241,18 @@ bool AudioSession::sanitize_format(){
241241
return true;
242242
}
243243
void AudioSession::signal_pre_input_change(){
244-
m_listeners.run_method_unique(&StateListener::pre_input_change);
244+
m_listeners.run_method(&StateListener::pre_input_change);
245245
}
246246
void AudioSession::signal_post_input_change(){
247-
m_listeners.run_method_unique(
247+
m_listeners.run_method(
248248
&StateListener::post_input_change,
249249
m_option.input_file(),
250250
m_option.input_device(),
251251
m_option.input_format()
252252
);
253253
}
254254
void AudioSession::signal_post_output_change(){
255-
m_listeners.run_method_unique(&StateListener::post_output_change, m_option.output_device());
255+
m_listeners.run_method(&StateListener::post_output_change, m_option.output_device());
256256
}
257257

258258

SerialPrograms/Source/CommonFramework/AudioPipeline/AudioStream.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ void AudioFloatToStream::on_samples(const float* data, size_t frames){
171171
return;
172172
}
173173
if (m_format == AudioSampleFormat::FLOAT32){
174-
m_listeners.run_method_unique(
174+
m_listeners.run_method(
175175
&StreamListener::on_objects,
176176
data, frames
177177
);
@@ -196,7 +196,7 @@ void AudioFloatToStream::on_samples(const float* data, size_t frames){
196196
default:
197197
return;
198198
}
199-
m_listeners.run_method_unique(
199+
m_listeners.run_method(
200200
&StreamListener::on_objects,
201201
m_buffer.data(), block
202202
);

SerialPrograms/Source/CommonFramework/AudioPipeline/Backends/AudioPassthroughPairQt.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class AudioPassthroughPairQt::SampleListener final : public AudioFloatStreamList
6969
parent.m_fft_runner->on_samples(data, frames);
7070
}
7171
}
72-
m_parent.m_stream_listeners.run_method_unique(
72+
m_parent.m_stream_listeners.run_method(
7373
&AudioFloatStreamListener::on_samples,
7474
data, frames
7575
);
@@ -90,7 +90,7 @@ class AudioPassthroughPairQt::InternalFFTListener final : public FFTListener{
9090
m_parent.m_fft_runner->remove_listener(*this);
9191
}
9292
virtual void on_fft(size_t sample_rate, std::shared_ptr<const AlignedVector<float>> fft_output) override{
93-
m_parent.m_fft_listeners.run_method_unique(
93+
m_parent.m_fft_listeners.run_method(
9494
&FFTListener::on_fft,
9595
sample_rate, fft_output
9696
);

SerialPrograms/Source/CommonFramework/AudioPipeline/IO/AudioSource.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ class AudioSource::InternalListener : public AudioFloatStreamListener{
108108
private:
109109
virtual void on_samples(const float* data, size_t objects) override{
110110
// cout << "objects = " << objects << endl;
111-
m_parent.m_listeners.run_method_unique(
111+
m_parent.m_listeners.run_method(
112112
&AudioFloatStreamListener::on_samples,
113113
data, objects
114114
);

0 commit comments

Comments
 (0)