diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 58fd49fa0..25fca5312 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -22,6 +22,9 @@ set( CMAKE_CXX_STANDARD 17 ) set( CMAKE_CXX_STANDARD_REQUIRED ON ) include( CheckCXXCompilerFlag ) +find_package( PkgConfig REQUIRED ) +pkg_check_modules( GStreamerApp REQUIRED IMPORTED_TARGET gstreamer-app-1.0 gstreamer-pbutils-1.0 gstreamer-audio-1.0) + add_subdirectory(public) add_library( @@ -49,6 +52,7 @@ target_include_directories( PRIVATE include + ${GStreamerApp_INCLUDE_DIRS} ) target_link_libraries ( @@ -56,4 +60,5 @@ target_link_libraries ( PRIVATE RialtoLogging + ${GStreamerApp_LIBRARIES} ) diff --git a/common/include/Timer.h b/common/include/Timer.h index 7393c9a61..2d010e3a4 100644 --- a/common/include/Timer.h +++ b/common/include/Timer.h @@ -23,9 +23,8 @@ #include "ITimer.h" #include -#include +#include #include -#include #include namespace firebolt::rialto::common @@ -60,12 +59,7 @@ class Timer : public ITimer bool isActive() const override; private: - std::atomic m_active; - std::chrono::milliseconds m_timeout; - std::function m_callback; - mutable std::mutex m_mutex; - std::thread m_thread; - std::condition_variable m_cv; + std::atomic m_timerId{0}; }; } // namespace firebolt::rialto::common diff --git a/common/source/Timer.cpp b/common/source/Timer.cpp index 8469a4737..0735ed2ae 100644 --- a/common/source/Timer.cpp +++ b/common/source/Timer.cpp @@ -19,6 +19,63 @@ #include "Timer.h" #include "RialtoCommonLogging.h" +#include +#include +#include + +namespace +{ +class CommonTimerLoop +{ +public: + static CommonTimerLoop &instance() + { + static CommonTimerLoop instance; + return instance; + } + + void storeTimerCallback(const firebolt::rialto::common::Timer *timer, const std::function &callback) + { + std::lock_guard lock(m_mutex); + m_activeTimers[timer] = callback; + } + + void removeTimerCallback(const firebolt::rialto::common::Timer *timer) + { + std::lock_guard lock(m_mutex); + m_activeTimers.erase(timer); + } + + std::function getTimerCallback(const firebolt::rialto::common::Timer *timer) + { + std::lock_guard lock(m_mutex); + auto it = m_activeTimers.find(timer); + return it != m_activeTimers.end() ? it->second : nullptr; + } + +private: + CommonTimerLoop() + { + m_loop = g_main_loop_new(nullptr, FALSE); + m_thread = std::thread([this]() { g_main_loop_run(m_loop); }); + } + + ~CommonTimerLoop() + { + g_main_loop_quit(m_loop); + if (m_thread.joinable()) + { + m_thread.join(); + } + g_main_loop_unref(m_loop); + } + + GMainLoop *m_loop; + std::thread m_thread; + std::mutex m_mutex; + std::unordered_map> m_activeTimers; +}; +} // namespace namespace firebolt::rialto::common { @@ -52,32 +109,39 @@ std::unique_ptr TimerFactory::createTimer(const std::chrono::millisecond } Timer::Timer(const std::chrono::milliseconds &timeout, const std::function &callback, TimerType timerType) - : m_active{true}, m_timeout{timeout}, m_callback{callback} { - m_thread = std::thread( - [this, timerType]() - { - do + CommonTimerLoop::instance().storeTimerCallback(this, callback); + if (timerType == TimerType::PERIODIC) + { + m_timerId = g_timeout_add( + static_cast(timeout.count()), + [](gpointer data) -> gboolean { - bool shouldExecuteCallback = false; + auto callback = CommonTimerLoop::instance().getTimerCallback(static_cast(data)); + if (callback) { - std::unique_lock lock{m_mutex}; - if (!m_cv.wait_for(lock, m_timeout, [this]() { return !m_active; })) - { - if (m_active && m_callback) - { - shouldExecuteCallback = true; - } - } + callback(); + return CommonTimerLoop::instance().getTimerCallback(static_cast(data)) ? TRUE : FALSE; } - - if (shouldExecuteCallback) + return FALSE; + }, + this); + } + else + { + m_timerId = g_timeout_add_once( + static_cast(timeout.count()), + [](gpointer data) + { + auto callback = CommonTimerLoop::instance().getTimerCallback(static_cast(data)); + if (callback) { - m_callback(); + callback(); + CommonTimerLoop::instance().removeTimerCallback(static_cast(data)); } - } while (timerType == TimerType::PERIODIC && m_active); - m_active = false; - }); + }, + this); + } } Timer::~Timer() @@ -87,26 +151,16 @@ Timer::~Timer() void Timer::cancel() { - m_active = false; - m_cv.notify_one(); - - if (std::this_thread::get_id() == m_thread.get_id()) - { - if (m_thread.joinable()) - { - m_thread.detach(); - } - return; - } - - if (m_thread.joinable()) + CommonTimerLoop::instance().removeTimerCallback(this); + if (m_timerId != 0) { - m_thread.join(); + g_source_remove(m_timerId); + m_timerId = 0; } } bool Timer::isActive() const { - return m_active; + return CommonTimerLoop::instance().getTimerCallback(this) != nullptr; } } // namespace firebolt::rialto::common diff --git a/media/server/main/source/SharedMemoryBuffer.cpp b/media/server/main/source/SharedMemoryBuffer.cpp index 93983796c..ee67d11ab 100644 --- a/media/server/main/source/SharedMemoryBuffer.cpp +++ b/media/server/main/source/SharedMemoryBuffer.cpp @@ -226,6 +226,13 @@ bool SharedMemoryBuffer::unmapPartition(MediaPlaybackType playbackType, int id) RIALTO_SERVER_LOG_WARN("Failed to unmap Shm partition for id: %d. - partition could not be found", id); return false; } + std::uint8_t *partitionDataPtr = nullptr; + if (getDataPtrForPartition(playbackType, id, &partitionDataPtr)) + { + const std::uint32_t kLength{partition->dataBufferVideoLen + partition->dataBufferAudioLen + + partition->dataBufferSubtitleLen}; + madvise(partitionDataPtr, kLength, MADV_DONTNEED); + } partition->id = kNoIdAssigned; return true; }