diff options
author | John Crispin <john@openwrt.org> | 2007-09-11 16:53:53 +0000 |
---|---|---|
committer | John Crispin <john@openwrt.org> | 2007-09-11 16:53:53 +0000 |
commit | 6ce13a764fac568dcd179025c2a6eff551f2f085 (patch) | |
tree | 04ffb0cbf3d1ba680d9783eb5eb23a65832e72f5 | |
parent | 2ef23a0fd9fc7a95fa12e2d22b0658c8443831c6 (diff) | |
download | upstream-6ce13a764fac568dcd179025c2a6eff551f2f085.tar.gz upstream-6ce13a764fac568dcd179025c2a6eff551f2f085.tar.bz2 upstream-6ce13a764fac568dcd179025c2a6eff551f2f085.zip |
fix a possible dead lock in the fonera-mp3 driver, that can happen, when the buffer runs dry
SVN-Revision: 8753
-rw-r--r-- | package/fonera-mp3-drv/src/mp3_drv.c | 7 |
1 files 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); } |