Mesen-S/Core/NotificationManager.cpp
2019-02-15 21:33:13 -05:00

51 lines
1.2 KiB
C++

#include "stdafx.h"
#include <algorithm>
#include "NotificationManager.h"
void NotificationManager::RegisterNotificationListener(shared_ptr<INotificationListener> notificationListener)
{
auto lock = _lock.AcquireSafe();
for(weak_ptr<INotificationListener> listener : _listeners) {
if(listener.lock() == notificationListener) {
//This listener is already registered, do nothing
return;
}
}
_listeners.push_back(notificationListener);
}
void NotificationManager::CleanupNotificationListeners()
{
auto lock = _lock.AcquireSafe();
//Remove expired listeners
_listeners.erase(
std::remove_if(
_listeners.begin(),
_listeners.end(),
[](weak_ptr<INotificationListener> ptr) { return ptr.expired(); }
),
_listeners.end()
);
}
void NotificationManager::SendNotification(ConsoleNotificationType type, void* parameter)
{
vector<weak_ptr<INotificationListener>> listeners;
{
auto lock = _lock.AcquireSafe();
CleanupNotificationListeners();
listeners = _listeners;
}
//Iterate on a copy without using a lock
for(weak_ptr<INotificationListener> notificationListener : listeners) {
shared_ptr<INotificationListener> listener = notificationListener.lock();
if(listener) {
listener->ProcessNotification(type, parameter);
}
}
}