1#include <linux/kthread.h> 2#include <linux/wait.h> 3 4#include "spk_types.h" 5#include "speakup.h" 6#include "spk_priv.h" 7 8DECLARE_WAIT_QUEUE_HEAD(speakup_event); 9EXPORT_SYMBOL_GPL(speakup_event); 10 11int speakup_thread(void *data) 12{ 13 unsigned long flags; 14 int should_break; 15 struct bleep our_sound; 16 17 our_sound.active = 0; 18 our_sound.freq = 0; 19 our_sound.jiffies = 0; 20 21 mutex_lock(&spk_mutex); 22 while (1) { 23 DEFINE_WAIT(wait); 24 25 while (1) { 26 spin_lock_irqsave(&speakup_info.spinlock, flags); 27 our_sound = spk_unprocessed_sound; 28 spk_unprocessed_sound.active = 0; 29 prepare_to_wait(&speakup_event, &wait, 30 TASK_INTERRUPTIBLE); 31 should_break = kthread_should_stop() || 32 our_sound.active || 33 (synth && synth->catch_up && synth->alive && 34 (speakup_info.flushing || 35 !synth_buffer_empty())); 36 spin_unlock_irqrestore(&speakup_info.spinlock, flags); 37 if (should_break) 38 break; 39 mutex_unlock(&spk_mutex); 40 schedule(); 41 mutex_lock(&spk_mutex); 42 } 43 finish_wait(&speakup_event, &wait); 44 if (kthread_should_stop()) 45 break; 46 47 if (our_sound.active) 48 kd_mksound(our_sound.freq, our_sound.jiffies); 49 if (synth && synth->catch_up && synth->alive) { 50 /* It is up to the callee to take the lock, so that it 51 * can sleep whenever it likes */ 52 synth->catch_up(synth); 53 } 54 55 speakup_start_ttys(); 56 } 57 mutex_unlock(&spk_mutex); 58 return 0; 59} 60