Message ID | 1346453055-30888-4-git-send-email-marex@denx.de |
---|---|
State | Superseded |
Delegated to: | Marek Vasut |
Headers | show |
Dear Marek Vasut, > Use stdio_get_fd() and stdio_set_fd() instead of direct access > to the array. This allows making stdio_devices[] local to stdio.c > > Signed-off-by: Marek Vasut <marex@denx.de> > Cc: Wolfgang Denk <wd@denx.de> [...] > @@ -622,6 +635,7 @@ int console_init_r(void) > { > char *stdinname, *stdoutname, *stderrname; > struct stdio_dev *inputdev = NULL, *outputdev = NULL, *errdev = NULL; > + struct stdio_dev *sio; Self-review: NAK! This generates a warning. Self-reply: V2 on the way. > #ifdef CONFIG_SYS_CONSOLE_ENV_OVERWRITE > int i; > #endif /* CONFIG_SYS_CONSOLE_ENV_OVERWRITE */ > @@ -690,7 +704,9 @@ done: > #ifdef CONFIG_SYS_CONSOLE_ENV_OVERWRITE > /* set the environment variables (will overwrite previous env settings) > */ for (i = 0; i < 3; i++) { > - setenv(stdio_names[i], stdio_devices[i]->name); > + sio = stdio_get_fd(i); > + if (sio) > + setenv(stdio_names[i], sio->name); > } > #endif /* CONFIG_SYS_CONSOLE_ENV_OVERWRITE */ > [...] Best regards,
Dear Marek Vasut, On 01.09.12 00:44, Marek Vasut wrote: > Use stdio_get_fd() and stdio_set_fd() instead of direct access > to the array. This allows making stdio_devices[] local to stdio.c > > Signed-off-by: Marek Vasut <marex@denx.de> > Cc: Wolfgang Denk <wd@denx.de> > --- > common/cmd_console.c | 8 +++---- > common/cmd_terminal.c | 9 ++++++-- > common/console.c | 60 ++++++++++++++++++++++++++++++++----------------- > common/fdt_support.c | 8 ++++++- > common/stdio.c | 2 +- > include/stdio_dev.h | 1 - > 6 files changed, 58 insertions(+), 30 deletions(-) > > diff --git a/common/cmd_console.c b/common/cmd_console.c > index d8cad6b..343bc28 100644 > --- a/common/cmd_console.c > +++ b/common/cmd_console.c > @@ -34,7 +34,7 @@ int do_coninfo (cmd_tbl_t * cmd, int flag, int argc, char * const argv[]) > int l; > struct list_head *list = stdio_get_list(); > struct list_head *pos; > - struct stdio_dev *dev; > + struct stdio_dev *dev, *sio; > > /* Scan for valid output and input devices */ > > @@ -51,9 +51,9 @@ int do_coninfo (cmd_tbl_t * cmd, int flag, int argc, char * const argv[]) > (dev->flags & DEV_FLAGS_OUTPUT) ? 'O' : '.'); > > for (l = 0; l < MAX_FILES; l++) { > - if (stdio_devices[l] == dev) { > - printf ("%s ", stdio_names[l]); > - } > + sio = stdio_get_fd(l); > + if (sio == dev) > + printf("%s ", stdio_names[l]); > } > putc ('\n'); > } > diff --git a/common/cmd_terminal.c b/common/cmd_terminal.c > index 7cc1a6c..ba34033 100644 > --- a/common/cmd_terminal.c > +++ b/common/cmd_terminal.c > @@ -33,6 +33,7 @@ int do_terminal(cmd_tbl_t * cmd, int flag, int argc, char * const argv[]) > { > int last_tilde = 0; > struct stdio_dev *dev = NULL; > + struct stdio_dev *sio; > > if (argc < 1) > return -1; > @@ -46,12 +47,16 @@ int do_terminal(cmd_tbl_t * cmd, int flag, int argc, char * const argv[]) > printf("Entering terminal mode for port %s\n", dev->name); > puts("Use '~.' to leave the terminal and get back to u-boot\n"); > > + sio = stdio_get_dev(stdin); > + if (!sio) > + return -1; > + > while (1) { > int c; > > /* read from console and display on serial port */ > - if (stdio_devices[0]->tstc()) { > - c = stdio_devices[0]->getc(); > + if (sio->tstc()) { > + c = sio->getc(); > if (last_tilde == 1) { > if (c == '.') { > putc(c); > diff --git a/common/console.c b/common/console.c > index df03cef..4a1938a 100644 > --- a/common/console.c > +++ b/common/console.c > @@ -64,7 +64,7 @@ static int console_setfile(int file, struct stdio_dev * dev) > } > > /* Assign the new device (leaving the existing one started) */ > - stdio_devices[file] = dev; > + stdio_set_fd(file, dev); > > /* > * Update monitor functions > @@ -170,27 +170,39 @@ static inline void console_doenv(int file, struct stdio_dev *dev) > #else > static inline int console_getc(int file) > { > - return stdio_devices[file]->getc(); > + struct stdio_dev *dev = stdio_get_fd(file); > + if (dev) > + return dev->getc(); > + return 0; > } > > static inline int console_tstc(int file) > { > - return stdio_devices[file]->tstc(); > + struct stdio_dev *dev = stdio_get_fd(file); > + if (dev) > + return dev->tstc(); > + return 0; > } > > static inline void console_putc(int file, const char c) > { > - stdio_devices[file]->putc(c); > + struct stdio_dev *dev = stdio_get_fd(file); > + if (dev) > + return dev->putc(c); return is not required here .. > } > > static inline void console_puts(int file, const char *s) > { > - stdio_devices[file]->puts(s); > + struct stdio_dev *dev = stdio_get_fd(file); > + if (dev) > + return dev->puts(s); .. and here > } > > static inline void console_printdevs(int file) > { > - printf("%s\n", stdio_devices[file]->name); > + struct stdio_dev *dev = stdio_get_fd(file); > + if (dev) > + printf("%s\n", dev->name); > } > > static inline void console_doenv(int file, struct stdio_dev *dev) > @@ -592,27 +604,28 @@ int console_init_f(void) > void stdio_print_current_devices(void) > { > #ifndef CONFIG_SYS_CONSOLE_INFO_QUIET > + struct stdio_dev *sio; > /* Print information */ > puts("In: "); > - if (stdio_devices[stdin] == NULL) { > + sio = stdio_get_fd(stdin); > + if (sio == NULL) > puts("No input devices available!\n"); > - } else { > - printf ("%s\n", stdio_devices[stdin]->name); > - } > + else > + printf("%s\n", sio->name); > > puts("Out: "); > - if (stdio_devices[stdout] == NULL) { > + sio = stdio_get_fd(stdout); Isn't sio still set properly here ... > + if (sio == NULL) > puts("No output devices available!\n"); > - } else { > - printf ("%s\n", stdio_devices[stdout]->name); > - } > + else > + printf("%s\n", sio->name); > > puts("Err: "); > - if (stdio_devices[stderr] == NULL) { > + sio = stdio_get_fd(stderr); .. and here? > + if (sio == NULL) Side note: in your newly introduced checks you use just if (sio) { ... Why check explicitly for NULL here? I personally favor 'if (!sio)'. > puts("No error devices available!\n"); > - } else { > - printf ("%s\n", stdio_devices[stderr]->name); > - } > + else > + printf("%s\n", sio->name); > #endif /* CONFIG_SYS_CONSOLE_INFO_QUIET */ > } > > @@ -622,6 +635,7 @@ int console_init_r(void) > { > char *stdinname, *stdoutname, *stderrname; > struct stdio_dev *inputdev = NULL, *outputdev = NULL, *errdev = NULL; > + struct stdio_dev *sio; > #ifdef CONFIG_SYS_CONSOLE_ENV_OVERWRITE > int i; > #endif /* CONFIG_SYS_CONSOLE_ENV_OVERWRITE */ > @@ -690,7 +704,9 @@ done: > #ifdef CONFIG_SYS_CONSOLE_ENV_OVERWRITE > /* set the environment variables (will overwrite previous env settings) */ > for (i = 0; i < 3; i++) { > - setenv(stdio_names[i], stdio_devices[i]->name); > + sio = stdio_get_fd(i); > + if (sio) > + setenv(stdio_names[i], sio->name); > } > #endif /* CONFIG_SYS_CONSOLE_ENV_OVERWRITE */ > > @@ -706,7 +722,7 @@ int console_init_r(void) > int i; > struct list_head *list = stdio_get_list(); > struct list_head *pos; > - struct stdio_dev *dev; > + struct stdio_dev *dev, *sio; > > #ifdef CONFIG_SPLASH_SCREEN > /* > @@ -759,7 +775,9 @@ int console_init_r(void) > > /* Setting environment variables */ > for (i = 0; i < 3; i++) { > - setenv(stdio_names[i], stdio_devices[i]->name); > + sio = stdio_get_fd(i); > + if (sio) > + setenv(stdio_names[i], sio->name); > } > > return 0; > diff --git a/common/fdt_support.c b/common/fdt_support.c > index 593f16c..7727359 100644 > --- a/common/fdt_support.c > +++ b/common/fdt_support.c > @@ -97,7 +97,13 @@ int fdt_find_and_setprop(void *fdt, const char *node, const char *prop, > #ifdef CONFIG_SERIAL_MULTI > static void fdt_fill_multisername(char *sername, size_t maxlen) > { > - const char *outname = stdio_devices[stdout]->name; > + struct stdio_dev *sio = stdio_get_fd(stdout); > + const char *outname; > + > + if (!sio) > + return; > + > + outname = sio->name; > > if (strcmp(outname, "serial") > 0) > strncpy(sername, outname, maxlen); > diff --git a/common/stdio.c b/common/stdio.c > index 6c8ac73..ba5e2fc 100644 > --- a/common/stdio.c > +++ b/common/stdio.c > @@ -38,7 +38,7 @@ > DECLARE_GLOBAL_DATA_PTR; > > static struct stdio_dev devs; > -struct stdio_dev *stdio_devices[] = { NULL, NULL, NULL }; > +static struct stdio_dev *stdio_devices[] = { NULL, NULL, NULL }; > char *stdio_names[MAX_FILES] = { "stdin", "stdout", "stderr" }; > > #if defined(CONFIG_SPLASH_SCREEN) && !defined(CONFIG_SYS_DEVICE_NULLDEV) > diff --git a/include/stdio_dev.h b/include/stdio_dev.h > index 86b2a4f..554708a 100644 > --- a/include/stdio_dev.h > +++ b/include/stdio_dev.h > @@ -83,7 +83,6 @@ typedef struct { > /* > * VARIABLES > */ > -extern struct stdio_dev *stdio_devices[]; > extern char *stdio_names[MAX_FILES]; > > /* > Best regards Andreas Bießmann
Dear Andreas Bießmann, > Dear Marek Vasut, Heh, this Dear $recipient became really popular :-) [...] > return is not required here .. > > > } > > > > static inline void console_puts(int file, const char *s) > > { > > > > - stdio_devices[file]->puts(s); > > + struct stdio_dev *dev = stdio_get_fd(file); > > + if (dev) > > + return dev->puts(s); > > .. and here Thanks! > > } > > > > static inline void console_printdevs(int file) > > { > > > > - printf("%s\n", stdio_devices[file]->name); > > + struct stdio_dev *dev = stdio_get_fd(file); > > + if (dev) > > + printf("%s\n", dev->name); > > > > } > > > > static inline void console_doenv(int file, struct stdio_dev *dev) > > > > @@ -592,27 +604,28 @@ int console_init_f(void) > > > > void stdio_print_current_devices(void) > > { > > #ifndef CONFIG_SYS_CONSOLE_INFO_QUIET > > > > + struct stdio_dev *sio; > > > > /* Print information */ > > puts("In: "); > > > > - if (stdio_devices[stdin] == NULL) { > > + sio = stdio_get_fd(stdin); > > + if (sio == NULL) > > > > puts("No input devices available!\n"); > > > > - } else { > > - printf ("%s\n", stdio_devices[stdin]->name); > > - } > > + else > > + printf("%s\n", sio->name); > > > > puts("Out: "); > > > > - if (stdio_devices[stdout] == NULL) { > > + sio = stdio_get_fd(stdout); > > Isn't sio still set properly here ... It is, but it still can be NULL. Also notice the argument differs, first it's stdin, then stdout and lastly stderr > > + if (sio == NULL) > > > > puts("No output devices available!\n"); > > > > - } else { > > - printf ("%s\n", stdio_devices[stdout]->name); > > - } > > + else > > + printf("%s\n", sio->name); > > > > puts("Err: "); > > > > - if (stdio_devices[stderr] == NULL) { > > + sio = stdio_get_fd(stderr); > > .. and here? > > > + if (sio == NULL) > > Side note: in your newly introduced checks you use just > > if (sio) { > ... > > Why check explicitly for NULL here? I personally favor 'if (!sio)'. Compat reason really ... I didn't wanted to introduce more change than necessary ... incremental patching can be done indeed ;-) > > puts("No error devices available!\n"); > > > > - } else { > > - printf ("%s\n", stdio_devices[stderr]->name); > > - } > > + else > > + printf("%s\n", sio->name); Thanks for the review :) > Best regards > > Andreas Bießmann
Dear Marek Vasut, In message <201209020202.51744.marex@denx.de> you wrote: > Dear Andreas Bießmann, > > > Dear Marek Vasut, > > Heh, this Dear $recipient became really popular :-) If somebody can recommend a more clever rule than "%(friendly {from})" for my nmh replcomps file I would be all too happy! [I've been looking for a way to insert some mapping from some address list here, but failed so far...] Best regards, Wolfgang Denk
diff --git a/common/cmd_console.c b/common/cmd_console.c index d8cad6b..343bc28 100644 --- a/common/cmd_console.c +++ b/common/cmd_console.c @@ -34,7 +34,7 @@ int do_coninfo (cmd_tbl_t * cmd, int flag, int argc, char * const argv[]) int l; struct list_head *list = stdio_get_list(); struct list_head *pos; - struct stdio_dev *dev; + struct stdio_dev *dev, *sio; /* Scan for valid output and input devices */ @@ -51,9 +51,9 @@ int do_coninfo (cmd_tbl_t * cmd, int flag, int argc, char * const argv[]) (dev->flags & DEV_FLAGS_OUTPUT) ? 'O' : '.'); for (l = 0; l < MAX_FILES; l++) { - if (stdio_devices[l] == dev) { - printf ("%s ", stdio_names[l]); - } + sio = stdio_get_fd(l); + if (sio == dev) + printf("%s ", stdio_names[l]); } putc ('\n'); } diff --git a/common/cmd_terminal.c b/common/cmd_terminal.c index 7cc1a6c..ba34033 100644 --- a/common/cmd_terminal.c +++ b/common/cmd_terminal.c @@ -33,6 +33,7 @@ int do_terminal(cmd_tbl_t * cmd, int flag, int argc, char * const argv[]) { int last_tilde = 0; struct stdio_dev *dev = NULL; + struct stdio_dev *sio; if (argc < 1) return -1; @@ -46,12 +47,16 @@ int do_terminal(cmd_tbl_t * cmd, int flag, int argc, char * const argv[]) printf("Entering terminal mode for port %s\n", dev->name); puts("Use '~.' to leave the terminal and get back to u-boot\n"); + sio = stdio_get_dev(stdin); + if (!sio) + return -1; + while (1) { int c; /* read from console and display on serial port */ - if (stdio_devices[0]->tstc()) { - c = stdio_devices[0]->getc(); + if (sio->tstc()) { + c = sio->getc(); if (last_tilde == 1) { if (c == '.') { putc(c); diff --git a/common/console.c b/common/console.c index df03cef..4a1938a 100644 --- a/common/console.c +++ b/common/console.c @@ -64,7 +64,7 @@ static int console_setfile(int file, struct stdio_dev * dev) } /* Assign the new device (leaving the existing one started) */ - stdio_devices[file] = dev; + stdio_set_fd(file, dev); /* * Update monitor functions @@ -170,27 +170,39 @@ static inline void console_doenv(int file, struct stdio_dev *dev) #else static inline int console_getc(int file) { - return stdio_devices[file]->getc(); + struct stdio_dev *dev = stdio_get_fd(file); + if (dev) + return dev->getc(); + return 0; } static inline int console_tstc(int file) { - return stdio_devices[file]->tstc(); + struct stdio_dev *dev = stdio_get_fd(file); + if (dev) + return dev->tstc(); + return 0; } static inline void console_putc(int file, const char c) { - stdio_devices[file]->putc(c); + struct stdio_dev *dev = stdio_get_fd(file); + if (dev) + return dev->putc(c); } static inline void console_puts(int file, const char *s) { - stdio_devices[file]->puts(s); + struct stdio_dev *dev = stdio_get_fd(file); + if (dev) + return dev->puts(s); } static inline void console_printdevs(int file) { - printf("%s\n", stdio_devices[file]->name); + struct stdio_dev *dev = stdio_get_fd(file); + if (dev) + printf("%s\n", dev->name); } static inline void console_doenv(int file, struct stdio_dev *dev) @@ -592,27 +604,28 @@ int console_init_f(void) void stdio_print_current_devices(void) { #ifndef CONFIG_SYS_CONSOLE_INFO_QUIET + struct stdio_dev *sio; /* Print information */ puts("In: "); - if (stdio_devices[stdin] == NULL) { + sio = stdio_get_fd(stdin); + if (sio == NULL) puts("No input devices available!\n"); - } else { - printf ("%s\n", stdio_devices[stdin]->name); - } + else + printf("%s\n", sio->name); puts("Out: "); - if (stdio_devices[stdout] == NULL) { + sio = stdio_get_fd(stdout); + if (sio == NULL) puts("No output devices available!\n"); - } else { - printf ("%s\n", stdio_devices[stdout]->name); - } + else + printf("%s\n", sio->name); puts("Err: "); - if (stdio_devices[stderr] == NULL) { + sio = stdio_get_fd(stderr); + if (sio == NULL) puts("No error devices available!\n"); - } else { - printf ("%s\n", stdio_devices[stderr]->name); - } + else + printf("%s\n", sio->name); #endif /* CONFIG_SYS_CONSOLE_INFO_QUIET */ } @@ -622,6 +635,7 @@ int console_init_r(void) { char *stdinname, *stdoutname, *stderrname; struct stdio_dev *inputdev = NULL, *outputdev = NULL, *errdev = NULL; + struct stdio_dev *sio; #ifdef CONFIG_SYS_CONSOLE_ENV_OVERWRITE int i; #endif /* CONFIG_SYS_CONSOLE_ENV_OVERWRITE */ @@ -690,7 +704,9 @@ done: #ifdef CONFIG_SYS_CONSOLE_ENV_OVERWRITE /* set the environment variables (will overwrite previous env settings) */ for (i = 0; i < 3; i++) { - setenv(stdio_names[i], stdio_devices[i]->name); + sio = stdio_get_fd(i); + if (sio) + setenv(stdio_names[i], sio->name); } #endif /* CONFIG_SYS_CONSOLE_ENV_OVERWRITE */ @@ -706,7 +722,7 @@ int console_init_r(void) int i; struct list_head *list = stdio_get_list(); struct list_head *pos; - struct stdio_dev *dev; + struct stdio_dev *dev, *sio; #ifdef CONFIG_SPLASH_SCREEN /* @@ -759,7 +775,9 @@ int console_init_r(void) /* Setting environment variables */ for (i = 0; i < 3; i++) { - setenv(stdio_names[i], stdio_devices[i]->name); + sio = stdio_get_fd(i); + if (sio) + setenv(stdio_names[i], sio->name); } return 0; diff --git a/common/fdt_support.c b/common/fdt_support.c index 593f16c..7727359 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -97,7 +97,13 @@ int fdt_find_and_setprop(void *fdt, const char *node, const char *prop, #ifdef CONFIG_SERIAL_MULTI static void fdt_fill_multisername(char *sername, size_t maxlen) { - const char *outname = stdio_devices[stdout]->name; + struct stdio_dev *sio = stdio_get_fd(stdout); + const char *outname; + + if (!sio) + return; + + outname = sio->name; if (strcmp(outname, "serial") > 0) strncpy(sername, outname, maxlen); diff --git a/common/stdio.c b/common/stdio.c index 6c8ac73..ba5e2fc 100644 --- a/common/stdio.c +++ b/common/stdio.c @@ -38,7 +38,7 @@ DECLARE_GLOBAL_DATA_PTR; static struct stdio_dev devs; -struct stdio_dev *stdio_devices[] = { NULL, NULL, NULL }; +static struct stdio_dev *stdio_devices[] = { NULL, NULL, NULL }; char *stdio_names[MAX_FILES] = { "stdin", "stdout", "stderr" }; #if defined(CONFIG_SPLASH_SCREEN) && !defined(CONFIG_SYS_DEVICE_NULLDEV) diff --git a/include/stdio_dev.h b/include/stdio_dev.h index 86b2a4f..554708a 100644 --- a/include/stdio_dev.h +++ b/include/stdio_dev.h @@ -83,7 +83,6 @@ typedef struct { /* * VARIABLES */ -extern struct stdio_dev *stdio_devices[]; extern char *stdio_names[MAX_FILES]; /*
Use stdio_get_fd() and stdio_set_fd() instead of direct access to the array. This allows making stdio_devices[] local to stdio.c Signed-off-by: Marek Vasut <marex@denx.de> Cc: Wolfgang Denk <wd@denx.de> --- common/cmd_console.c | 8 +++---- common/cmd_terminal.c | 9 ++++++-- common/console.c | 60 ++++++++++++++++++++++++++++++++----------------- common/fdt_support.c | 8 ++++++- common/stdio.c | 2 +- include/stdio_dev.h | 1 - 6 files changed, 58 insertions(+), 30 deletions(-)