Something went wrong. Try again.
Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
Something went wrong. Try again.
1.4 kB · 62 lines
C
at master
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263// SPDX-License-Identifier: GPL-2.0#include <linux/kthread.h>#include <linux/wait.h>
#include "spk_types.h"#include "speakup.h"#include "spk_priv.h"
DECLARE_WAIT_QUEUE_HEAD(speakup_event);EXPORT_SYMBOL_GPL(speakup_event);
int speakup_thread(void *data){ unsigned long flags; int should_break; struct bleep our_sound;
our_sound.active = 0; our_sound.freq = 0; our_sound.jiffies = 0;
mutex_lock(&spk_mutex); while (1) { DEFINE_WAIT(wait);
while (1) { spin_lock_irqsave(&speakup_info.spinlock, flags); our_sound = spk_unprocessed_sound; spk_unprocessed_sound.active = 0; prepare_to_wait(&speakup_event, &wait, TASK_INTERRUPTIBLE); should_break = kthread_should_stop() || our_sound.active || (synth && synth->catch_up && synth->alive && (speakup_info.flushing || !synth_buffer_empty())); spin_unlock_irqrestore(&speakup_info.spinlock, flags); if (should_break) break; mutex_unlock(&spk_mutex); schedule(); mutex_lock(&spk_mutex); } finish_wait(&speakup_event, &wait); if (kthread_should_stop()) break;
if (our_sound.active) kd_mksound(our_sound.freq, our_sound.jiffies); if (synth && synth->catch_up && synth->alive) { /* * It is up to the callee to take the lock, so that it * can sleep whenever it likes */ synth->catch_up(synth); }
speakup_start_ttys(); } mutex_unlock(&spk_mutex); return 0;}