2 * Copyright (C) 2016-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
11 #include "EventStreamDetail.h"
12 #include "JobManager.h"
13 #include "threads/CriticalSection.h"
21 template<typename Event
>
27 void Subscribe(A
* owner
, void (A::*fn
)(const Event
&))
29 auto subscription
= std::make_shared
<detail::CSubscription
<Event
, A
>>(owner
, fn
);
30 std::unique_lock
<CCriticalSection
> lock(m_criticalSection
);
31 m_subscriptions
.emplace_back(std::move(subscription
));
35 void Unsubscribe(A
* obj
)
37 std::vector
<std::shared_ptr
<detail::ISubscription
<Event
>>> toCancel
;
39 std::unique_lock
<CCriticalSection
> lock(m_criticalSection
);
40 auto it
= m_subscriptions
.begin();
41 while (it
!= m_subscriptions
.end())
43 if ((*it
)->IsOwnedBy(obj
))
45 toCancel
.push_back(*it
);
46 it
= m_subscriptions
.erase(it
);
54 for (auto& subscription
: toCancel
)
55 subscription
->Cancel();
59 std::vector
<std::shared_ptr
<detail::ISubscription
<Event
>>> m_subscriptions
;
60 CCriticalSection m_criticalSection
;
64 template<typename Event
>
65 class CEventSource
: public CEventStream
<Event
>
68 explicit CEventSource() : m_queue(false, 1, CJob::PRIORITY_HIGH
) {}
73 std::unique_lock
<CCriticalSection
> lock(this->m_criticalSection
);
74 auto& subscriptions
= this->m_subscriptions
;
75 auto task
= [subscriptions
, event
](){
76 for (auto& s
: subscriptions
)
77 s
->HandleEvent(event
);
80 m_queue
.Submit(std::move(task
));
87 template<typename Event
>
88 class CBlockingEventSource
: public CEventStream
<Event
>
92 void HandleEvent(A event
)
94 std::unique_lock
<CCriticalSection
> lock(this->m_criticalSection
);
95 for (const auto& subscription
: this->m_subscriptions
)
97 subscription
->HandleEvent(event
);