From b8f714021584cd8138054b7f289272ad547bfb39 Mon Sep 17 00:00:00 2001 From: Jacek Jendrzej Date: Thu, 1 Aug 2019 15:43:58 +0200 Subject: [PATCH] try to fix segfault on open/close Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/c1c2a5fc2cdbc06259e4cb2eb5bd870927b688a8 Author: Jacek Jendrzej Date: 2019-08-01 (Thu, 01 Aug 2019) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- libarmbox/playback_libeplayer3.cpp | 39 +++++++++++++++++++++--------- libarmbox/playback_libeplayer3.h | 2 ++ 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/libarmbox/playback_libeplayer3.cpp b/libarmbox/playback_libeplayer3.cpp index efd5d96..190b9c3 100644 --- a/libarmbox/playback_libeplayer3.cpp +++ b/libarmbox/playback_libeplayer3.cpp @@ -24,6 +24,7 @@ static Context_t *player = NULL; extern cAudio *audioDecoder; extern cVideo *videoDecoder; +OpenThreads::Mutex cPlayback::mutex; //Used by Fileplay bool cPlayback::Open(playmode_t PlayMode) @@ -50,9 +51,13 @@ bool cPlayback::Open(playmode_t PlayMode) nPlaybackSpeed = 0; init_jump = -1; + mutex.lock(); if (player) + { free(player); - player = NULL; + player = NULL; + } + mutex.unlock(); player = (Context_t *) malloc(sizeof(Context_t)); @@ -82,8 +87,10 @@ void cPlayback::Close(void) hal_info("%s\n", __func__); //Dagobert: movieplayer does not call stop, it calls close ;) + mutex.lock(); if(playing) Stop(); + mutex.unlock(); if (decoders_closed) { @@ -765,27 +772,37 @@ cPlayback::~cPlayback() { hal_info("%s\n", __func__); + mutex.lock(); if (player) + { free(player); - player = NULL; + player = NULL; + } + mutex.unlock(); } void cPlayback::RequestAbort() { - if (player && player->playback && player->playback->isPlaying) + if (player && player->playback) { hal_info("%s\n", __func__); - Stop(); - //player->playback->abortRequested = 1;//why ? + mutex.lock(); + + if (player && player->playback && player->playback->isPlaying) + { + Stop(); + player->playback->abortRequested = 1; + } + else if(player->playback->isHttp && !player->playback->isPlaying &&!player->playback->abortRequested) + { + player->playback->abortRequested = 1; + } + + mutex.unlock(); + while (player->playback->isPlaying) usleep(100000); } - else if(player->playback->isHttp && !player->playback->isPlaying &&!player->playback->abortRequested) - { - hal_info("%s\n", __func__); - player->playback->abortRequested = 1; - } - } bool cPlayback::IsPlaying() diff --git a/libarmbox/playback_libeplayer3.h b/libarmbox/playback_libeplayer3.h index 3d5cb2e..8297a15 100644 --- a/libarmbox/playback_libeplayer3.h +++ b/libarmbox/playback_libeplayer3.h @@ -3,6 +3,7 @@ #include #include +#include typedef enum { @@ -17,6 +18,7 @@ class cPlayback friend class CStreamInfo2; private: + static OpenThreads::Mutex mutex; bool enabled; bool playing, first; bool no_probe;