static int pvr2_dvb_feed_func(struct pvr2_dvb_adapter *adap) { int ret; unsigned int count; struct pvr2_buffer *bp; struct pvr2_stream *stream; pvr2_trace(PVR2_TRACE_DVB_FEED, "dvb feed thread started"); set_freezable(); stream = adap->channel.stream->stream; for (;;) { if (kthread_should_stop()) break; /* Not sure about this... */ try_to_freeze(); bp = pvr2_stream_get_ready_buffer(stream); if (bp != NULL) { count = pvr2_buffer_get_count(bp); if (count) { dvb_dmx_swfilter( &adap->demux, adap->buffer_storage[ pvr2_buffer_get_id(bp)], count); } else { ret = pvr2_buffer_get_status(bp); if (ret < 0) break; } ret = pvr2_buffer_queue(bp); if (ret < 0) break; /* Since we know we did something to a buffer, just go back and try again. No point in blocking unless we really ran out of buffers to process. */ continue; } /* 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) || kthread_should_stop()); if (ret < 0) break; } /* If we get here and ret is < 0, then an error has occurred. Probably would be a good idea to communicate that to DVB core... */ pvr2_trace(PVR2_TRACE_DVB_FEED, "dvb feed thread stopped"); return 0; }
static int pvr2_dvb_feed_func(struct pvr2_dvb_adapter *adap) { int ret; unsigned int count; struct pvr2_buffer *bp; struct pvr2_stream *stream; pvr2_trace(PVR2_TRACE_DVB_FEED, "dvb feed thread started"); set_freezable(); stream = adap->channel.stream->stream; for (;;) { if (kthread_should_stop()) break; try_to_freeze(); bp = pvr2_stream_get_ready_buffer(stream); if (bp != NULL) { count = pvr2_buffer_get_count(bp); if (count) { dvb_dmx_swfilter( &adap->demux, adap->buffer_storage[ pvr2_buffer_get_id(bp)], count); } else { ret = pvr2_buffer_get_status(bp); if (ret < 0) break; } ret = pvr2_buffer_queue(bp); if (ret < 0) break; continue; } ret = wait_event_interruptible( adap->buffer_wait_data, (pvr2_stream_get_ready_count(stream) > 0) || kthread_should_stop()); if (ret < 0) break; } pvr2_trace(PVR2_TRACE_DVB_FEED, "dvb feed thread stopped"); return 0; }