Skip to content
This repository was archived by the owner on Oct 23, 2024. It is now read-only.

Commit c467f51

Browse files
authored
Refine JobTimer and add SharedJobTimer (#606)
1 parent 80250e0 commit c467f51

File tree

6 files changed

+79
-8
lines changed

6 files changed

+79
-8
lines changed

source/core/common/JobTimer.cpp

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#include <boost/thread.hpp>
88
#include <mutex>
9+
#include <unordered_map>
910

1011
namespace {
1112

@@ -89,9 +90,9 @@ void JobTimer::onTimeout(const boost::system::error_code& ec)
8990
{
9091
if (!ec) {
9192
if (!m_isClosing) {
92-
handleJob();
9393
m_timer->expires_from_now(boost::posix_time::milliseconds(m_interval));
9494
m_timer->async_wait(boost::bind(&JobTimer::onTimeout, this, boost::asio::placeholders::error));
95+
handleJob();
9596
}
9697
}
9798
}
@@ -101,3 +102,53 @@ void JobTimer::handleJob()
101102
if (m_listener)
102103
m_listener->onTimeout();
103104
}
105+
106+
SharedJobTimer::SharedJobTimer(unsigned int frequency)
107+
: m_jobTimer(frequency, this)
108+
{
109+
m_jobTimer.start();
110+
}
111+
112+
SharedJobTimer::~SharedJobTimer()
113+
{
114+
m_jobTimer.stop();
115+
}
116+
117+
void SharedJobTimer::addListener(JobTimerListener* listener)
118+
{
119+
if (listener) {
120+
boost::mutex::scoped_lock lock(m_mutex);
121+
m_listeners.insert(listener);
122+
}
123+
}
124+
125+
void SharedJobTimer::removeListener(JobTimerListener* listener)
126+
{
127+
if (listener) {
128+
boost::mutex::scoped_lock lock(m_mutex);
129+
m_listeners.erase(listener);
130+
}
131+
}
132+
133+
void SharedJobTimer::onTimeout()
134+
{
135+
boost::mutex::scoped_lock lock(m_mutex);
136+
for (JobTimerListener* listener : m_listeners) {
137+
listener->onTimeout();
138+
}
139+
}
140+
141+
std::shared_ptr<SharedJobTimer> SharedJobTimer::GetSharedFrequencyTimer(unsigned int frequency)
142+
{
143+
static boost::mutex timersMutex;
144+
static std::unordered_map<unsigned int, std::shared_ptr<SharedJobTimer>> sharedTimers;
145+
146+
boost::mutex::scoped_lock lock(timersMutex);
147+
if (sharedTimers.count(frequency) > 0) {
148+
return sharedTimers[frequency];
149+
} else {
150+
auto sharedTimer = std::make_shared<SharedJobTimer>(frequency);
151+
sharedTimers.emplace(frequency, sharedTimer);
152+
return sharedTimer;
153+
}
154+
}

source/core/common/JobTimer.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,21 @@ class JobTimer {
3636
boost::scoped_ptr<boost::asio::deadline_timer> m_timer;
3737
};
3838

39+
class SharedJobTimer : public JobTimerListener {
40+
public:
41+
SharedJobTimer(unsigned int frequency);
42+
~SharedJobTimer();
43+
44+
static std::shared_ptr<SharedJobTimer> GetSharedFrequencyTimer(unsigned int frequency);
45+
void addListener(JobTimerListener* listener);
46+
void removeListener(JobTimerListener* listener);
47+
48+
virtual void onTimeout() override;
49+
50+
private:
51+
JobTimer m_jobTimer;
52+
boost::mutex m_mutex;
53+
std::set<JobTimerListener*> m_listeners;
54+
};
55+
3956
#endif

source/core/owt_base/MediaFrameMulticaster.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,13 @@ namespace owt_base {
99
MediaFrameMulticaster::MediaFrameMulticaster()
1010
: m_pendingKeyFrameRequests(0)
1111
{
12-
m_feedbackTimer.reset(new JobTimer(1, this));
12+
m_feedbackTimer = SharedJobTimer::GetSharedFrequencyTimer(1);
13+
m_feedbackTimer->addListener(this);
1314
}
1415

1516
MediaFrameMulticaster::~MediaFrameMulticaster()
1617
{
17-
m_feedbackTimer->stop();
18+
m_feedbackTimer->removeListener(this);
1819
}
1920

2021
void MediaFrameMulticaster::onFeedback(const FeedbackMsg& msg)

source/core/owt_base/MediaFrameMulticaster.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class MediaFrameMulticaster : public FrameSource, public FrameDestination, publi
2525
void onTimeout();
2626

2727
private:
28-
boost::scoped_ptr<JobTimer> m_feedbackTimer;
28+
std::shared_ptr<SharedJobTimer> m_feedbackTimer;
2929
uint32_t m_pendingKeyFrameRequests;
3030
};
3131

source/core/owt_base/VideoFrameConstructor.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ VideoFrameConstructor::VideoFrameConstructor(VideoInfoListener* vil, uint32_t tr
2424
, m_videoReceive(nullptr)
2525
{
2626
m_config.transport_cc = transportccExtId;
27-
m_feedbackTimer.reset(new JobTimer(1, this));
27+
m_feedbackTimer = SharedJobTimer::GetSharedFrequencyTimer(1);
28+
m_feedbackTimer->addListener(this);
2829
}
2930

3031
VideoFrameConstructor::VideoFrameConstructor(
@@ -39,13 +40,14 @@ VideoFrameConstructor::VideoFrameConstructor(
3940
{
4041
m_config.transport_cc = transportccExtId;
4142
assert(base);
42-
m_feedbackTimer.reset(new JobTimer(1, this));
43+
m_feedbackTimer = SharedJobTimer::GetSharedFrequencyTimer(1);
44+
m_feedbackTimer->addListener(this);
4345
m_rtcAdapter = base->m_rtcAdapter;
4446
}
4547

4648
VideoFrameConstructor::~VideoFrameConstructor()
4749
{
48-
m_feedbackTimer->stop();
50+
m_feedbackTimer->removeListener(this);
4951
unbindTransport();
5052
if (m_videoReceive) {
5153
m_rtcAdapter->destoryVideoReceiver(m_videoReceive);

source/core/owt_base/VideoFrameConstructor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ class VideoFrameConstructor : public erizo::MediaSink,
8383

8484
erizo::MediaSource* m_transport;
8585
boost::shared_mutex m_transportMutex;
86-
boost::scoped_ptr<JobTimer> m_feedbackTimer;
86+
std::shared_ptr<SharedJobTimer> m_feedbackTimer;
8787
uint32_t m_pendingKeyFrameRequests;
8888

8989
VideoInfoListener* m_videoInfoListener;

0 commit comments

Comments
 (0)