[PATCH 1/7] Add generic poll infrastructure
Sascha Hauer
s.hauer at pengutronix.de
Sat Dec 18 10:28:18 EST 2010
Hi Marc (Kleine-Budde),
I took the version of this patch I had lying around, please let
me know if you have an updated version.
Sascha
On Sat, Dec 18, 2010 at 04:15:03PM +0100, Sascha Hauer wrote:
> From: Marc Kleine-Budde <mkl at pengutronix.de>
>
> Barebox does not have interrupt functionality. Nevertheless it's
> sometimes useful to periodically call functions, like for example
> a heartbeat LED or watchdog reset. Instead of cluttering the code
> with calls to these functions this patch adds a generic polling
> infrastructure. Code which might run for longer now can call
> poller_call() periodically which in turn will call all registered
> pollers.
> This patch adds a call to poller_call in two generic pathes. First
> of them is getc() which covers waiting for uart input. Second is
> ctrlc() which should be called anyway from code which might run
> for longer. So instead adding poller_call directly to your code,
> consider checking ctrlc instead which also gives additional
> convenience to the user.
> The poller code is safe against reentrancy which means that it's
> safe to call poller_call inside a poller.
>
> Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>
> Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
> ---
> common/Kconfig | 3 +++
> common/Makefile | 1 +
> common/console.c | 5 +++++
> common/poller.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
> include/poller.h | 31 +++++++++++++++++++++++++++++++
> 5 files changed, 85 insertions(+), 0 deletions(-)
> create mode 100644 common/poller.c
> create mode 100644 include/poller.h
>
> diff --git a/common/Kconfig b/common/Kconfig
> index 617f640..02bc67e 100644
> --- a/common/Kconfig
> +++ b/common/Kconfig
> @@ -414,6 +414,9 @@ config DEFAULT_ENVIRONMENT_PATH
> Relative pathes will be relative to the barebox Toplevel dir, but absolute
> pathes are fine aswell.
>
> +config POLLER
> + bool "generic polling infrastructure"
> +
> endmenu
>
> menu "Debugging "
> diff --git a/common/Makefile b/common/Makefile
> index 753455b..98c9d36 100644
> --- a/common/Makefile
> +++ b/common/Makefile
> @@ -5,6 +5,7 @@ obj-$(CONFIG_OF_FLAT_TREE) += ft_build.o
> obj-$(CONFIG_KALLSYMS) += kallsyms.o
> obj-$(CONFIG_ENV_HANDLING) += environment.o
> obj-$(CONFIG_AUTO_COMPLETE) += complete.o
> +obj-$(CONFIG_POLLER) += poller.o
>
> obj-y += dlmalloc.o
> obj-y += clock.o
> diff --git a/common/console.c b/common/console.c
> index 82786f2..39ead4b 100644
> --- a/common/console.c
> +++ b/common/console.c
> @@ -34,6 +34,7 @@
> #include <clock.h>
> #include <kfifo.h>
> #include <module.h>
> +#include <poller.h>
> #include <linux/list.h>
>
> LIST_HEAD(console_list);
> @@ -205,6 +206,8 @@ int getc(void)
> */
> start = get_time_ns();
> while (1) {
> + poller_call();
> +
> if (tstc()) {
> kfifo_putc(console_input_buffer, getc_raw());
>
> @@ -397,6 +400,8 @@ EXPORT_SYMBOL(vprintf);
> /* test if ctrl-c was pressed */
> int ctrlc (void)
> {
> + poller_call();
> +
> if (tstc() && getc() == 3)
> return 1;
> return 0;
> diff --git a/common/poller.c b/common/poller.c
> new file mode 100644
> index 0000000..0583a53
> --- /dev/null
> +++ b/common/poller.c
> @@ -0,0 +1,45 @@
> +/*
> + * Copyright (C) 2010 Marc Kleine-Budde <mkl at pengutronix.de>
> + *
> + * This file is released under the GPLv2
> + *
> + */
> +
> +#include <common.h>
> +#include <driver.h>
> +#include <malloc.h>
> +#include <module.h>
> +#include <param.h>
> +#include <poller.h>
> +
> +static LIST_HEAD(poller_list);
> +static int poller_active;
> +
> +int poller_register(struct poller_struct *poller)
> +{
> + list_add_tail(&poller->list, &poller_list);
> +
> + return 0;
> +}
> +
> +int poller_unregister(struct poller_struct *poller)
> +{
> + list_del(&poller->list);
> +
> + return 0;
> +}
> +
> +void poller_call(void)
> +{
> + struct poller_struct *poller, *tmp;
> +
> + if (poller_active)
> + return;
> +
> + poller_active = 1;
> +
> + list_for_each_entry_safe(poller, tmp, &poller_list, list)
> + poller->func(poller);
> +
> + poller_active = 0;
> +}
> diff --git a/include/poller.h b/include/poller.h
> new file mode 100644
> index 0000000..dc98155
> --- /dev/null
> +++ b/include/poller.h
> @@ -0,0 +1,31 @@
> +/*
> + * Copyright (C) 2010 Marc Kleine-Budde <mkl at pengutronix.de>
> + *
> + * This file is released under the GPLv2
> + *
> + */
> +
> +#ifndef POLLER_H
> +#define POLLER_H
> +
> +#include <linux/list.h>
> +
> +struct poller_struct {
> + void (*func)(struct poller_struct *poller);
> +
> + struct list_head list;
> +};
> +
> +int poller_register(struct poller_struct *poller);
> +int poller_unregister(struct poller_struct *poller);
> +
> +
> +#ifdef CONFIG_POLLER
> +void poller_call(void);
> +#else
> +static inline void poller_call(void)
> +{
> +}
> +#endif /* CONFIG_POLLER */
> +
> +#endif /* !POLLER_H */
> --
> 1.7.2.3
>
>
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
More information about the barebox
mailing list