diff --git a/common/Kconfig b/common/Kconfig index 617f640..02bc67e 100644 --- a/common/Kconfig +++ b/common/Kconfig @@ -414,6 +414,9 @@ 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_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 @@ */ start = get_time_ns(); while (1) { + poller_call(); + if (tstc()) { kfifo_putc(console_input_buffer, getc_raw()); @@ -397,6 +400,8 @@ /* 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 */