summaryrefslogtreecommitdiffstats
path: root/src/Event.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/Event.cpp43
1 files changed, 23 insertions, 20 deletions
diff --git a/src/Event.cpp b/src/Event.cpp
index ea09af3..1ca933f 100644
--- a/src/Event.cpp
+++ b/src/Event.cpp
@@ -17,7 +17,7 @@ EventListener::~EventListener() {
void EventListener::HandleEvent() {
OPTICK_EVENT();
- if (!NotEmpty())
+ if (Empty())
return;
std::lock_guard<std::recursive_mutex> eventsLock (eventsMutex);
@@ -31,11 +31,14 @@ void EventListener::HandleEvent() {
void EventListener::HandleAllEvents() {
OPTICK_EVENT();
- if (!NotEmpty())
- return;
+ //This mutexes will locked in PollEvents
std::lock_guard<std::recursive_mutex> eventsLock (eventsMutex);
- std::lock_guard<std::recursive_mutex> handlersLock (handlersMutex);
+ std::lock_guard<std::recursive_mutex> handlersLock (handlersMutex);
+
+ if (Empty())
+ return;
+
while (!events.empty()) {
Event event = events.front();
events.pop();
@@ -45,11 +48,10 @@ void EventListener::HandleAllEvents() {
}
}
-bool EventListener::NotEmpty() {
- PollEvents();
+bool EventListener::Empty() {
std::lock_guard<std::recursive_mutex> eventsLock (eventsMutex);
- bool ret = !events.empty();
- return ret;
+ PollEvents();
+ return events.empty();
}
void EventListener::RegisterHandler(size_t eventId, const EventListener::HandlerType &data) {
@@ -59,16 +61,17 @@ void EventListener::RegisterHandler(size_t eventId, const EventListener::Handler
void EventListener::PollEvents() {
OPTICK_EVENT();
- std::lock_guard<std::recursive_mutex> rawLock (rawEventsMutex);
- if (rawEvents.empty())
- return;
-
- std::lock_guard<std::recursive_mutex> eventsLock (eventsMutex);
- std::lock_guard<std::recursive_mutex> handlersLock (handlersMutex);
- while (!rawEvents.empty()) {
- Event event = rawEvents.front();
- rawEvents.pop();
- if (handlers[event.id])
- events.push(event);
- }
+ std::lock_guard<std::recursive_mutex> eventsLock (eventsMutex);
+ std::lock_guard<std::recursive_mutex> handlersLock (handlersMutex);//To prevent inverse lock order
+
+ std::lock_guard<std::recursive_mutex> rawLock (rawEventsMutex);
+ if (rawEvents.empty())
+ return;
+
+ while (!rawEvents.empty()) {
+ Event event = rawEvents.front();
+ rawEvents.pop();
+ if (handlers[event.id])
+ events.push(event);
+ }
}