From e106aae9b88725afa0db5ee20a8a12616489a2b0 Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Sat, 24 Jan 2015 13:07:10 +0000 Subject: [PATCH] proc: Add need_resched() Use this to make the tty code behave better --- Kernel/include/kernel.h | 2 ++ Kernel/tty.c | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Kernel/include/kernel.h b/Kernel/include/kernel.h index eb1eb784..86c3b5f0 100644 --- a/Kernel/include/kernel.h +++ b/Kernel/include/kernel.h @@ -701,6 +701,8 @@ CODE2 void timer_interrupt(void); CODE2 void doexit (int16_t val, int16_t val2); CODE2 void panic(char *deathcry); CODE2 void exec_or_die(void); +#define need_resched() (nready != 1 && runticks >= udata.u_ptab->p_priority) + /* select.c */ CODE2 extern void seladdwait(struct selmap *s); diff --git a/Kernel/tty.c b/Kernel/tty.c index 00b9cf60..97624981 100644 --- a/Kernel/tty.c +++ b/Kernel/tty.c @@ -379,9 +379,13 @@ void tty_putc_wait(uint8_t minor, unsigned char c) ptty_putc_wait(minor, c); else #endif + /* For slower platforms it's not worth the task switching and return + costs versus waiting a bit. A box with tx interrupts and sufficient + performance can buffer or sleep in in tty_putc instead. */ if (!udata.u_ininterrupt) { while (!tty_writeready(minor)) - psleep(&ttydata[minor]); + if (need_resched()) + psleep(&ttydata[minor]); } tty_putc(minor, c); } -- 2.34.1