[vlc-commits] demux: adaptive: add locks to command queue
Francois Cartegnie
git at videolan.org
Sat Jul 9 18:42:42 CEST 2016
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Mon Jun 13 18:03:22 2016 +0200| [4d6bca9a609119f343d6d3f9f066d7e2c532c1b4] | committer: Francois Cartegnie
demux: adaptive: add locks to command queue
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=4d6bca9a609119f343d6d3f9f066d7e2c532c1b4
---
modules/demux/adaptive/plumbing/CommandsQueue.cpp | 35 ++++++++++++++++++---
modules/demux/adaptive/plumbing/CommandsQueue.hpp | 2 ++
2 files changed, 33 insertions(+), 4 deletions(-)
diff --git a/modules/demux/adaptive/plumbing/CommandsQueue.cpp b/modules/demux/adaptive/plumbing/CommandsQueue.cpp
index e9c92c2..d67e33d 100644
--- a/modules/demux/adaptive/plumbing/CommandsQueue.cpp
+++ b/modules/demux/adaptive/plumbing/CommandsQueue.cpp
@@ -197,11 +197,13 @@ CommandsQueue::CommandsQueue()
{
bufferinglevel = VLC_TS_INVALID;
b_drop = false;
+ vlc_mutex_init(&lock);
}
CommandsQueue::~CommandsQueue()
{
Abort( false );
+ vlc_mutex_destroy(&lock);
}
static bool compareCommands( AbstractCommand *a, AbstractCommand *b )
@@ -211,6 +213,7 @@ static bool compareCommands( AbstractCommand *a, AbstractCommand *b )
void CommandsQueue::Schedule( AbstractCommand *command )
{
+ vlc_mutex_lock(&lock);
if( b_drop )
{
delete command;
@@ -218,13 +221,14 @@ void CommandsQueue::Schedule( AbstractCommand *command )
else if( command->getType() == ES_OUT_SET_GROUP_PCR )
{
bufferinglevel = command->getTime();
- Commit();
+ LockedCommit();
commands.push_back( command );
}
else
{
incoming.push_back( command );
}
+ vlc_mutex_unlock(&lock);
}
mtime_t CommandsQueue::Process( es_out_t *out, mtime_t barrier )
@@ -232,6 +236,7 @@ mtime_t CommandsQueue::Process( es_out_t *out, mtime_t barrier )
mtime_t lastdts = barrier;
bool b_datasent = false;
+ vlc_mutex_lock(&lock);
while( !commands.empty() && commands.front()->getTime() <= barrier )
{
AbstractCommand *command = commands.front();
@@ -253,18 +258,28 @@ mtime_t CommandsQueue::Process( es_out_t *out, mtime_t barrier )
command->Execute( out );
delete command;
}
+ vlc_mutex_unlock(&lock);
+
return lastdts;
}
-void CommandsQueue::Commit()
+void CommandsQueue::LockedCommit()
{
/* reorder all blocks by time between 2 PCR and merge with main list */
incoming.sort( compareCommands );
commands.splice( commands.end(), incoming );
}
+void CommandsQueue::Commit()
+{
+ vlc_mutex_lock(&lock);
+ LockedCommit();
+ vlc_mutex_unlock(&lock);
+}
+
void CommandsQueue::Abort( bool b_reset )
{
+ vlc_mutex_lock(&lock);
commands.splice( commands.end(), incoming );
while( !commands.empty() )
{
@@ -274,27 +289,38 @@ void CommandsQueue::Abort( bool b_reset )
if( b_reset )
bufferinglevel = VLC_TS_INVALID;
+ vlc_mutex_unlock(&lock);
}
bool CommandsQueue::isEmpty() const
{
- return commands.empty() && incoming.empty();
+ vlc_mutex_lock(const_cast<vlc_mutex_t *>(&lock));
+ bool b_empty = commands.empty() && incoming.empty();
+ vlc_mutex_unlock(const_cast<vlc_mutex_t *>(&lock));
+ return b_empty;
}
void CommandsQueue::setDrop( bool b )
{
+ vlc_mutex_lock(&lock);
b_drop = b;
+ vlc_mutex_unlock(&lock);
}
mtime_t CommandsQueue::getBufferingLevel() const
{
- return bufferinglevel;
+ mtime_t i_buffer;
+ vlc_mutex_lock(const_cast<vlc_mutex_t *>(&lock));
+ i_buffer = bufferinglevel;
+ vlc_mutex_unlock(const_cast<vlc_mutex_t *>(&lock));
+ return i_buffer;
}
mtime_t CommandsQueue::getFirstDTS() const
{
mtime_t i_dts = VLC_TS_INVALID;
std::list<AbstractCommand *>::const_iterator it;
+ vlc_mutex_lock(const_cast<vlc_mutex_t *>(&lock));
for( it = commands.begin(); it != commands.end(); ++it )
{
if( (*it)->getTime() > VLC_TS_INVALID )
@@ -303,5 +329,6 @@ mtime_t CommandsQueue::getFirstDTS() const
break;
}
}
+ vlc_mutex_unlock(const_cast<vlc_mutex_t *>(&lock));
return i_dts;
}
diff --git a/modules/demux/adaptive/plumbing/CommandsQueue.hpp b/modules/demux/adaptive/plumbing/CommandsQueue.hpp
index d2f40a7..911c31c 100644
--- a/modules/demux/adaptive/plumbing/CommandsQueue.hpp
+++ b/modules/demux/adaptive/plumbing/CommandsQueue.hpp
@@ -148,6 +148,8 @@ namespace adaptive
mtime_t getFirstDTS() const;
private:
+ vlc_mutex_t lock;
+ void LockedCommit();
std::list<AbstractCommand *> incoming;
std::list<AbstractCommand *> commands;
mtime_t bufferinglevel;
More information about the vlc-commits
mailing list