altos: Eliminate stdio looping when system has a single stdio source
authorKeith Packard <keithp@keithp.com>
Tue, 23 Apr 2013 01:27:52 +0000 (20:27 -0500)
committerKeith Packard <keithp@keithp.com>
Wed, 8 May 2013 03:16:53 +0000 (20:16 -0700)
No need to loop if there's only one

Signed-off-by: Keith Packard <keithp@keithp.com>
src/avr/ao_avr_stdio.c
src/core/ao_stdio.c

index 2765853aa92237bc3f7c505efcacdec4c777959c..f9c0f88c7e33474f666e4bd04984d3368371bce2 100644 (file)
 int
 stdio_put(char c, FILE *stream)
 {
-       if (ao_cur_task && ao_num_stdios)
-               putchar(c);
-       else
-       {
-               if (c == '\n')
-                       stdio_put('\r', stream);
-               loop_until_bit_is_set(UCSR1A, UDRE1);
-               UDR1 = c;
-       }
-
+       putchar(c);
        return 0;
 }
 
index 977d74b1800bdafc2cc24be64bcc99331f608ed1..cd144d6b45899861d1640478ab1bed393f5f98c6 100644 (file)
 #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
 }