From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from fmmailgate02.web.de ([217.72.192.227]) by canuck.infradead.org with esmtp (Exim 4.72 #1 (Red Hat Linux)) id 1PTyii-0001IU-Pe for barebox@lists.infradead.org; Sat, 18 Dec 2010 15:29:18 +0000 Date: Sat, 18 Dec 2010 16:28:18 +0100 From: Sascha Hauer Message-ID: <20101218152818.GI6017@pengutronix.de> References: <1292685309-32326-1-git-send-email-s.hauer@pengutronix.de> <1292685309-32326-2-git-send-email-s.hauer@pengutronix.de> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <1292685309-32326-2-git-send-email-s.hauer@pengutronix.de> List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: barebox-bounces@lists.infradead.org Errors-To: barebox-bounces+u.kleine-koenig=pengutronix.de@lists.infradead.org Subject: Re: [PATCH 1/7] Add generic poll infrastructure To: barebox@lists.infradead.org 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 > > 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 > Signed-off-by: Sascha Hauer > --- > 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 > #include > #include > +#include > #include > > 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 > + * > + * This file is released under the GPLv2 > + * > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > + > +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 > + * > + * This file is released under the GPLv2 > + * > + */ > + > +#ifndef POLLER_H > +#define POLLER_H > + > +#include > + > +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 | _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox