From 6ce13a764fac568dcd179025c2a6eff551f2f085 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Tue, 11 Sep 2007 16:53:53 +0000 Subject: [PATCH] fix a possible dead lock in the fonera-mp3 driver, that can happen, when the buffer runs dry SVN-Revision: 8753 --- package/fonera-mp3-drv/src/mp3_drv.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/package/fonera-mp3-drv/src/mp3_drv.c b/package/fonera-mp3-drv/src/mp3_drv.c index 9609444181..a2d8c79ae6 100644 --- a/package/fonera-mp3-drv/src/mp3_drv.c +++ b/package/fonera-mp3-drv/src/mp3_drv.c @@ -101,11 +101,12 @@ static DECLARE_COMPLETION(mp3_exit); static int mp3_playback_thread(void *data){ int j; unsigned long timeout; + unsigned char empty = 0; printk("started kthread\n"); daemonize("kmp3"); while(mp3_buffering_status != MP3_PLAY_FINISHED){ if((mp3_buffering_status == MP3_PLAYING) || (mp3_buffering_status == MP3_BUFFER_FINISHED)){ - while(VS1011_NEEDS_DATA){ + while((VS1011_NEEDS_DATA) && (!empty)){ if(mp3_buffer_offset_read == MP3_BUFFER_SIZE){ mp3_buffer_offset_read = 0; } @@ -115,6 +116,7 @@ static int mp3_playback_thread(void *data){ printk("mp3_drv.ko : finished playing\n"); mp3_buffering_status = MP3_PLAY_FINISHED; } else { + empty = 1; printk("mp3_drv.ko : buffer empty ?\n"); if(mp3_buffering_status != MP3_PLAY_FINISHED){ } @@ -128,8 +130,9 @@ static int mp3_playback_thread(void *data){ } } } + empty = 0; timeout = 1; - timeout = wait_event_interruptible_timeout(wq, (timeout==0), timeout); + timeout = wait_event_interruptible_timeout(wq, (timeout==0), timeout); } complete_and_exit(&mp3_exit, 0); }