• D
    V4L/DVB (11785): dvb_frontend: fix race condition resulting in dropped tuning commands · 57594a58
    Devin Heitmueller 提交于
    A race condition was detected in the case that putting the tuner to sleep takes
    an unusually long period of time, combined with applications that quickly
    close/open the dvb frontend.
    
    The kaffeine channel scanner closes and reopens the dvb frontend between each
    tuning attempt.  If it takes an unusually longer period of time to put the
    tuner to sleep (for example, the Pinnacle 801e takes 660 ms), the dvb_frontend
    thread will still be in a running state (and hence fepriv->thread is still set)
    but the fepriv->exit field will still be zero.  As a result, if a
    dvb_frontend_start() call arrives while the frontend thread is in the process
    of terminating, the call will return 0 without actually starting a new thread.
    This results in the tuning request being dropped.
    
    To address this, mark fepriv->exit as soon as we know the thread is going to
    be terminated, so that dvb_frontend_start() knows to start a new instance.
    
    Problem encountered with Kaffeine 0.8.7 doing ATSC scanning against the
    Pinnacle 801e tuner, in conjunction with new code to power down the xc5000
    when not in use.
    Signed-off-by: NDevin Heitmueller <dheitmueller@kernellabs.com>
    Signed-off-by: NMauro Carvalho Chehab <mchehab@redhat.com>
    57594a58
dvb_frontend.c 53.4 KB