diff options
Diffstat (limited to 'linux/drivers')
-rw-r--r-- | linux/drivers/media/video/pvrusb2/pvrusb2-dvb.c | 10 | ||||
-rw-r--r-- | linux/drivers/media/video/pvrusb2/pvrusb2-dvb.h | 1 |
2 files changed, 9 insertions, 2 deletions
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-dvb.c b/linux/drivers/media/video/pvrusb2/pvrusb2-dvb.c index f94c22fed..090ebbef9 100644 --- a/linux/drivers/media/video/pvrusb2/pvrusb2-dvb.c +++ b/linux/drivers/media/video/pvrusb2/pvrusb2-dvb.c @@ -46,6 +46,7 @@ static int pvr2_dvb_feed_func(struct pvr2_dvb_adapter *adap) stream = adap->channel.stream->stream; for (;;) { + if (adap->feed_thread_stop) break; if (kthread_should_stop()) break; /* Not sure about this... */ @@ -75,10 +76,12 @@ static int pvr2_dvb_feed_func(struct pvr2_dvb_adapter *adap) } - /* Wait until more buffers become available. */ + /* Wait until more buffers become available or we're + told not to wait any longer. */ ret = wait_event_interruptible( adap->buffer_wait_data, - pvr2_stream_get_ready_count(stream) > 0); + (pvr2_stream_get_ready_count(stream) > 0) || + adap->feed_thread_stop); if (ret < 0) break; } @@ -112,6 +115,8 @@ static void pvr2_dvb_stream_end(struct pvr2_dvb_adapter *adap) struct pvr2_stream *stream; if (adap->thread) { + adap->feed_thread_stop = !0; + pvr2_dvb_notify(adap); kthread_stop(adap->thread); adap->thread = NULL; } @@ -182,6 +187,7 @@ static int pvr2_dvb_stream_do_start(struct pvr2_dvb_adapter *adap) if (ret < 0) return ret; } + adap->feed_thread_stop = 0; adap->thread = kthread_run(pvr2_dvb_feed_thread, adap, "pvrusb2-dvb"); if (IS_ERR(adap->thread)) { diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-dvb.h b/linux/drivers/media/video/pvrusb2/pvrusb2-dvb.h index 04209db87..a45fa5abd 100644 --- a/linux/drivers/media/video/pvrusb2/pvrusb2-dvb.h +++ b/linux/drivers/media/video/pvrusb2/pvrusb2-dvb.h @@ -32,6 +32,7 @@ struct pvr2_dvb_adapter { unsigned int stream_run:1; wait_queue_head_t buffer_wait_data; + int feed_thread_stop; char *buffer_storage[PVR2_DVB_BUFFER_COUNT]; }; |