brintos

brintos / linux-shallow public Read only

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