Skip to content

Commit d1ce6fe

Browse files
committed
add remove/add during commit tests
1 parent 1cae7db commit d1ce6fe

File tree

4 files changed

+34
-15
lines changed

4 files changed

+34
-15
lines changed

include/lars/event.h

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <memory>
55
#include <vector>
66
#include <utility>
7+
#include <mutex>
78

89
namespace lars{
910

@@ -53,18 +54,19 @@ namespace lars{
5354

5455
mutable HandlerID IDCounter = 0;
5556
mutable HandlerList observers;
57+
mutable std::mutex observerMutex;
5658
EventPointer self;
5759

5860
HandlerID addHandler(Handler h)const{
61+
std::lock_guard<std::mutex> lock(observerMutex);
5962
observers.emplace_back(StoredHandler{IDCounter,h});
6063
return IDCounter++;
6164
}
6265

6366
void eraseHandler(const HandlerID &id)const{
67+
std::lock_guard<std::mutex> lock(observerMutex);
6468
auto it = std::find_if(observers.begin(), observers.end(), [&](auto &o){ return o.id == id; });
65-
if (it != observers.end()) {
66-
observers.erase(it);
67-
}
69+
if (it != observers.end()) { observers.erase(it); }
6870
}
6971

7072
public:
@@ -118,12 +120,11 @@ namespace lars{
118120
}
119121

120122
void emit(Args ... args) const {
121-
for(auto it = observers.begin();it != observers.end();){
122-
auto &f = *it;
123-
auto next = it;
124-
++next;
125-
f.callback(args...);
126-
it = next;
123+
observerMutex.lock();
124+
auto tmpObservers = observers;
125+
observerMutex.unlock();
126+
for(auto &observer: tmpObservers){
127+
observer.callback(args...);
127128
}
128129
}
129130

@@ -136,10 +137,12 @@ namespace lars{
136137
}
137138

138139
void clearObservers(){
140+
std::lock_guard<std::mutex> lock(observerMutex);
139141
observers.clear();
140142
}
141143

142144
size_t observerCount() const {
145+
std::lock_guard<std::mutex> lock(observerMutex);
143146
return observers.size();
144147
}
145148

include/lars/observable_value.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
#include <type_traits>
66
#include <utility>
77

8-
#include <iostream>
9-
108
namespace lars {
119

1210
template <class T> class ObservableValue {
@@ -54,7 +52,7 @@ namespace lars {
5452
const ObservableValue<D> & ... deps
5553
):
5654
ObservableValue<T>(handler(deps.get()...)),
57-
observers(std::make_tuple(deps.onChange.createObserver([&,this](const auto &v){
55+
observers(std::make_tuple(deps.onChange.createObserver([&,this](const auto &){
5856
this->set(handler(deps.get()...));
5957
})...))
6058
{

tests/CMakeLists.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@ if (${ENABLE_TEST_COVERAGE})
4848

4949
if(NOT extra-cmake-modules_POPULATED)
5050
FetchContent_Populate(extra-cmake-modules)
51-
message("test 1: ${extra-cmake-modules_SOURCE_DIR}")
52-
message("test 2: ${extra-cmake-modules_POPULATED}")
5351
include(${extra-cmake-modules_SOURCE_DIR}/CodeCoverage.cmake)
5452
endif()
5553

tests/event.cpp

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,27 @@ TEST_CASE("Event"){
5555
}
5656
}
5757

58-
SECTION("scoped event"){
58+
SECTION("removing observer during emit"){
59+
lars::Event<> event;
60+
lars::Event<>::Observer observer;
61+
unsigned count = 0;
62+
observer = event.createObserver([&](){ observer.reset(); count++; });
63+
event.emit();
64+
REQUIRE(count == 1);
65+
event.emit();
66+
REQUIRE(count == 1);
67+
}
68+
69+
SECTION("adding observers during emit"){
70+
lars::Event<> event;
71+
std::function<void()> callback;
72+
callback = [&](){ event.connect(callback); };
73+
event.connect(callback);
74+
REQUIRE(event.observerCount() == 1);
75+
event.emit();
76+
REQUIRE(event.observerCount() == 2);
77+
event.emit();
78+
REQUIRE(event.observerCount() == 4);
5979
}
6080

6181
SECTION("emit data"){

0 commit comments

Comments
 (0)