close adaptive plugin blocked when buffering_status is buffering_lessthanmin
In PlaylistManager::Run(), there is no cancel point if b_buffering is true and i_return is AbstractStream::buffering_lessthanmin.
setBufferingRunState() will also block if b_buffering is true and i_return is AbstractStream::buffering_lessthanmin.
void PlaylistManager::Run()
{
vlc_mutex_lock(&lock);
const unsigned i_min_buffering = playlist->getMinBuffering();
const unsigned i_extra_buffering = playlist->getMaxBuffering() - i_min_buffering;
while(1)
{
mutex_cleanup_push(&lock);
while(!b_buffering)
vlc_cond_wait(&waitcond, &lock);
vlc_cleanup_pop();
if(needsUpdate())
{
if(updatePlaylist())
scheduleNextUpdate();
else
failedupdates++;
}
vlc_mutex_lock(&demux.lock);
mtime_t i_nzpcr = demux.i_nzpcr;
vlc_mutex_unlock(&demux.lock);
int canc = vlc_savecancel();
AbstractStream::buffering_status i_return = bufferize(i_nzpcr, i_min_buffering, i_extra_buffering);
vlc_restorecancel( canc );
if(i_return != AbstractStream::buffering_lessthanmin)
{
mtime_t i_deadline = mdate();
if (i_return == AbstractStream::buffering_ongoing)
i_deadline += (CLOCK_FREQ / 20);
if (i_return == AbstractStream::buffering_full)
i_deadline += (CLOCK_FREQ / 10);
else if(i_return == AbstractStream::buffering_end)
i_deadline += (CLOCK_FREQ);
else /*if(i_return == AbstractStream::buffering_suspended)*/
i_deadline += (CLOCK_FREQ / 4);
vlc_mutex_lock(&demux.lock);
vlc_cond_signal(&demux.cond);
vlc_mutex_unlock(&demux.lock);
mutex_cleanup_push(&lock);
while(vlc_cond_timedwait(&waitcond, &lock, i_deadline) == 0
&& i_deadline < mdate());
vlc_cleanup_pop();
}
}
vlc_mutex_unlock(&lock);
}