linux/drivers/staging/speakup/thread.c
<<
>>
Prefs
   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                while (1) {
  25                        spin_lock_irqsave(&speakup_info.spinlock, flags);
  26                        our_sound = spk_unprocessed_sound;
  27                        spk_unprocessed_sound.active = 0;
  28                        prepare_to_wait(&speakup_event, &wait,
  29                                TASK_INTERRUPTIBLE);
  30                        should_break = kthread_should_stop() ||
  31                                our_sound.active ||
  32                                (synth && synth->catch_up && synth->alive &&
  33                                        (speakup_info.flushing ||
  34                                        !synth_buffer_empty()));
  35                        spin_unlock_irqrestore(&speakup_info.spinlock, flags);
  36                        if (should_break)
  37                                break;
  38                        mutex_unlock(&spk_mutex);
  39                        schedule();
  40                        mutex_lock(&spk_mutex);
  41                }
  42                finish_wait(&speakup_event, &wait);
  43                if (kthread_should_stop())
  44                        break;
  45
  46                if (our_sound.active)
  47                        kd_mksound(our_sound.freq, our_sound.jiffies);
  48                if (synth && synth->catch_up && synth->alive) {
  49                        /* It is up to the callee to take the lock, so that it
  50                         * can sleep whenever it likes */
  51                        synth->catch_up(synth);
  52                }
  53
  54                speakup_start_ttys();
  55        }
  56        mutex_unlock(&spk_mutex);
  57        return 0;
  58}
  59