diff --git a/tv/tuner/1.0/default/Dvr.cpp b/tv/tuner/1.0/default/Dvr.cpp index c62b878891..40879f2041 100644 --- a/tv/tuner/1.0/default/Dvr.cpp +++ b/tv/tuner/1.0/default/Dvr.cpp @@ -37,7 +37,10 @@ Dvr::Dvr(DvrType type, uint32_t bufferSize, const sp& cb, sp Dvr::getQueueDesc(getQueueDesc_cb _hidl_cb) { ALOGV("%s", __FUNCTION__); @@ -112,8 +115,7 @@ Return Dvr::start() { } if (mType == DvrType::PLAYBACK) { - pthread_create(&mDvrThread, NULL, __threadLoopPlayback, this); - pthread_setname_np(mDvrThread, "playback_waiting_loop"); + mDvrThread = std::thread(&Dvr::playbackThreadLoop, this); } else if (mType == DvrType::RECORD) { mRecordStatus = RecordStatus::DATA_READY; mDemux->setIsRecording(mType == DvrType::RECORD); @@ -128,9 +130,11 @@ Return Dvr::stop() { ALOGV("%s", __FUNCTION__); mDvrThreadRunning = false; - - lock_guard lock(mDvrThreadLock); - + if (mDvrThread.joinable()) { + mDvrThread.join(); + } + // thread should always be joinable if it is running, + // so it should be safe to assume recording stopped. mDemux->setIsRecording(false); return Result::SUCCESS; @@ -146,7 +150,7 @@ Return Dvr::flush() { Return Dvr::close() { ALOGV("%s", __FUNCTION__); - + stop(); return Result::SUCCESS; } @@ -173,15 +177,8 @@ EventFlag* Dvr::getDvrEventFlag() { return mDvrEventFlag; } -void* Dvr::__threadLoopPlayback(void* user) { - Dvr* const self = static_cast(user); - self->playbackThreadLoop(); - return 0; -} - void Dvr::playbackThreadLoop() { ALOGD("[Dvr] playback threadLoop start."); - lock_guard lock(mDvrThreadLock); mDvrThreadRunning = true; while (mDvrThreadRunning) { diff --git a/tv/tuner/1.0/default/Dvr.h b/tv/tuner/1.0/default/Dvr.h index fc4cb21791..fd7fba2c0a 100644 --- a/tv/tuner/1.0/default/Dvr.h +++ b/tv/tuner/1.0/default/Dvr.h @@ -20,7 +20,9 @@ #include #include #include +#include #include +#include #include "Demux.h" #include "Frontend.h" #include "Tuner.h" @@ -119,10 +121,7 @@ class Dvr : public IDvr { * Each filter handler handles the data filtering/output writing/filterEvent updating. */ void startTpidFilter(vector data); - static void* __threadLoopPlayback(void* user); - static void* __threadLoopRecord(void* user); void playbackThreadLoop(); - void recordThreadLoop(); unique_ptr mDvrMQ; EventFlag* mDvrEventFlag; @@ -133,7 +132,7 @@ class Dvr : public IDvr { DvrSettings mDvrSettings; // Thread handlers - pthread_t mDvrThread; + std::thread mDvrThread; // FMQ status local records PlaybackStatus mPlaybackStatus; @@ -141,7 +140,7 @@ class Dvr : public IDvr { /** * If a specific filter's writing loop is still running */ - bool mDvrThreadRunning; + std::atomic mDvrThreadRunning; bool mKeepFetchingDataFromFrontend; /** * Lock to protect writes to the FMQs @@ -152,7 +151,6 @@ class Dvr : public IDvr { */ std::mutex mPlaybackStatusLock; std::mutex mRecordStatusLock; - std::mutex mDvrThreadLock; const bool DEBUG_DVR = false; }; diff --git a/tv/tuner/1.1/default/Dvr.cpp b/tv/tuner/1.1/default/Dvr.cpp index fd84d49946..fdb66c1fd4 100644 --- a/tv/tuner/1.1/default/Dvr.cpp +++ b/tv/tuner/1.1/default/Dvr.cpp @@ -38,8 +38,8 @@ Dvr::Dvr(DvrType type, uint32_t bufferSize, const sp& cb, sp lock(mDvrThreadLock); + // make sure thread has joined + close(); } Return Dvr::getQueueDesc(getQueueDesc_cb _hidl_cb) { @@ -134,8 +134,7 @@ Return Dvr::start() { if (mType == DvrType::PLAYBACK) { mDvrThreadRunning = true; - pthread_create(&mDvrThread, NULL, __threadLoopPlayback, this); - pthread_setname_np(mDvrThread, "playback_waiting_loop"); + mDvrThread = std::thread(&Dvr::playbackThreadLoop, this); } else if (mType == DvrType::RECORD) { mRecordStatus = RecordStatus::DATA_READY; mDemux->setIsRecording(mType == DvrType::RECORD); @@ -150,8 +149,11 @@ Return Dvr::stop() { ALOGV("%s", __FUNCTION__); mDvrThreadRunning = false; - lock_guard lock(mDvrThreadLock); - + if (mDvrThread.joinable()) { + mDvrThread.join(); + } + // thread should always be joinable if it is running, + // so it should be safe to assume recording stopped. mDemux->setIsRecording(false); return Result::SUCCESS; @@ -167,9 +169,7 @@ Return Dvr::flush() { Return Dvr::close() { ALOGV("%s", __FUNCTION__); - - mDvrThreadRunning = false; - lock_guard lock(mDvrThreadLock); + stop(); return Result::SUCCESS; } @@ -196,15 +196,8 @@ EventFlag* Dvr::getDvrEventFlag() { return mDvrEventFlag; } -void* Dvr::__threadLoopPlayback(void* user) { - Dvr* const self = static_cast(user); - self->playbackThreadLoop(); - return 0; -} - void Dvr::playbackThreadLoop() { ALOGD("[Dvr] playback threadLoop start."); - lock_guard lock(mDvrThreadLock); while (mDvrThreadRunning) { uint32_t efState = 0; diff --git a/tv/tuner/1.1/default/Dvr.h b/tv/tuner/1.1/default/Dvr.h index 9fabb49da5..1bbb55c45e 100644 --- a/tv/tuner/1.1/default/Dvr.h +++ b/tv/tuner/1.1/default/Dvr.h @@ -19,7 +19,9 @@ #include #include +#include #include +#include #include "Demux.h" #include "Frontend.h" #include "Tuner.h" @@ -115,10 +117,7 @@ class Dvr : public IDvr { * Each filter handler handles the data filtering/output writing/filterEvent updating. */ void startTpidFilter(vector data); - static void* __threadLoopPlayback(void* user); - static void* __threadLoopRecord(void* user); void playbackThreadLoop(); - void recordThreadLoop(); unique_ptr mDvrMQ; EventFlag* mDvrEventFlag; @@ -129,7 +128,7 @@ class Dvr : public IDvr { DvrSettings mDvrSettings; // Thread handlers - pthread_t mDvrThread; + std::thread mDvrThread; // FMQ status local records PlaybackStatus mPlaybackStatus; @@ -137,7 +136,7 @@ class Dvr : public IDvr { /** * If a specific filter's writing loop is still running */ - bool mDvrThreadRunning; + std::atomic mDvrThreadRunning; bool mKeepFetchingDataFromFrontend; /** * Lock to protect writes to the FMQs @@ -148,7 +147,6 @@ class Dvr : public IDvr { */ std::mutex mPlaybackStatusLock; std::mutex mRecordStatusLock; - std::mutex mDvrThreadLock; const bool DEBUG_DVR = false; };