1010#include < map>
1111#include < atomic>
1212#include < mutex>
13+ #include " Common/Cpp/Concurrency/SpinLock.h"
1314
1415// #include <iostream>
1516// using std::cout;
@@ -30,12 +31,14 @@ class ListenerSet{
3031 }
3132
3233 void add (ListenerType& listener){
33- std::lock_guard<std::mutex> lg (m_lock);
34+ WriteSpinLock lg (m_lock);
35+ // std::lock_guard<std::mutex> lg(m_lock);
3436 m_listeners[&listener]++;
3537 m_count.store (m_listeners.size (), std::memory_order_relaxed);
3638 }
3739 void remove (ListenerType& listener){
38- std::lock_guard<std::mutex> lg (m_lock);
40+ WriteSpinLock lg (m_lock);
41+ // std::lock_guard<std::mutex> lg(m_lock);
3942 auto iter = m_listeners.find (&listener);
4043 if (iter == m_listeners.end ()){
4144 return ;
@@ -51,7 +54,8 @@ class ListenerSet{
5154 if (empty ()){
5255 return ;
5356 }
54- std::lock_guard<std::mutex> lg (m_lock);
57+ ReadSpinLock lg (m_lock);
58+ // std::lock_guard<std::mutex> lg(m_lock);
5559 for (auto & item : m_listeners){
5660 lambda (*item.first );
5761 }
@@ -61,7 +65,8 @@ class ListenerSet{
6165 if (empty ()){
6266 return ;
6367 }
64- std::lock_guard<std::mutex> lg (m_lock);
68+ ReadSpinLock lg (m_lock);
69+ // std::lock_guard<std::mutex> lg(m_lock);
6570 for (auto & item : m_listeners){
6671 ListenerType& listener = *item.first ;
6772 size_t count = item.second ;
@@ -76,7 +81,8 @@ class ListenerSet{
7681 if (empty ()){
7782 return ;
7883 }
79- std::lock_guard<std::mutex> lg (m_lock);
84+ ReadSpinLock lg (m_lock);
85+ // std::lock_guard<std::mutex> lg(m_lock);
8086 for (auto & item : m_listeners){
8187 (item.first ->*function)(std::forward<Args>(args)...);
8288 }
@@ -86,7 +92,8 @@ class ListenerSet{
8692 if (empty ()){
8793 return ;
8894 }
89- std::lock_guard<std::mutex> lg (m_lock);
95+ ReadSpinLock lg (m_lock);
96+ // std::lock_guard<std::mutex> lg(m_lock);
9097 for (auto & item : m_listeners){
9198 ListenerType& listener = *item.first ;
9299 size_t count = item.second ;
@@ -101,7 +108,8 @@ class ListenerSet{
101108 // skip the lock when there are no listeners.
102109 std::atomic<size_t > m_count;
103110
104- mutable std::mutex m_lock;
111+ mutable SpinLock m_lock;
112+ // mutable std::mutex m_lock;
105113 std::map<ListenerType*, size_t > m_listeners;
106114};
107115
0 commit comments