diff options
author | Keith Packard <keithp@keithp.com> | 2013-04-22 20:27:52 -0500 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2013-05-07 20:16:53 -0700 |
commit | 8d0f4bc23eae4f1e085bfb853c995f1fb6b8b594 (patch) | |
tree | 11576a81b918dea9849e461a0771e74699903c4f /src/core/ao_stdio.c | |
parent | 6f3bbb11880f45284f1f094990ffa32a66bf4560 (diff) |
altos: Eliminate stdio looping when system has a single stdio source
No need to loop if there's only one
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/core/ao_stdio.c')
-rw-r--r-- | src/core/ao_stdio.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/core/ao_stdio.c b/src/core/ao_stdio.c index 977d74b1..cd144d6b 100644 --- a/src/core/ao_stdio.c +++ b/src/core/ao_stdio.c @@ -66,8 +66,15 @@ #define AO_NUM_STDIOS (HAS_USB + PACKET_HAS_SLAVE + USE_SERIAL_STDIN) __xdata struct ao_stdio ao_stdios[AO_NUM_STDIOS]; + +#if AO_NUM_STDIOS > 1 __pdata int8_t ao_cur_stdio; __pdata int8_t ao_num_stdios; +#else +__pdata int8_t ao_cur_stdio; +#define ao_cur_stdio 0 +#define ao_num_stdios 0 +#endif void putchar(char c) @@ -107,12 +114,16 @@ getchar(void) __reentrant c = ao_stdios[stdio]._pollchar(); if (c != AO_READ_AGAIN) break; +#if AO_NUM_STDIOS > 1 if (++stdio == ao_num_stdios) stdio = 0; if (stdio == ao_cur_stdio) +#endif ao_sleep(&ao_stdin_ready); } +#if AO_NUM_STDIOS > 1 ao_cur_stdio = stdio; +#endif ao_arch_release_interrupts(); return c; } @@ -128,11 +139,17 @@ ao_add_stdio(int (*_pollchar)(void), void (*putchar)(char), void (*flush)(void)) __reentrant { +#if AO_NUM_STDIOS > 1 if (ao_num_stdios == AO_NUM_STDIOS) ao_panic(AO_PANIC_STDIO); +#endif ao_stdios[ao_num_stdios]._pollchar = _pollchar; ao_stdios[ao_num_stdios].putchar = putchar; ao_stdios[ao_num_stdios].flush = flush; ao_stdios[ao_num_stdios].echo = 1; +#if AO_NUM_STDIOS > 1 return ao_num_stdios++; +#else + return 0; +#endif } |