menu: avoid starving other processes in menu_handle()
authorarighi <arighi@38d2e660-2303-0410-9eaa-f027e97ec537>
Fri, 8 Apr 2011 09:44:57 +0000 (09:44 +0000)
committerarighi <arighi@38d2e660-2303-0410-9eaa-f027e97ec537>
Fri, 8 Apr 2011 09:44:57 +0000 (09:44 +0000)
When CONFIG_MENU_SMOOTH is enabled the menu_handle() can run
indefinitely without explicitly releasing the CPU.

So, add a voluntary preemption point in menu_handle() to avoid
starvation of the other processes when the kernel preemption is not
enabled.

git-svn-id: https://src.develer.com/svnoss/bertos/trunk@4838 38d2e660-2303-0410-9eaa-f027e97ec537

bertos/gui/menu.c

index f0e1f407ae39811985a7eae602fbe2484defd138..432927895e28e03f63bf4243259378877cb50969 100644 (file)
@@ -49,6 +49,8 @@
 #include <gfx/font.h>
 #include <gfx/text.h>
 
+#include <cpu/power.h>
+
 #include <drv/kbd.h>
 
 #include <string.h> /* strcpy() */
@@ -464,6 +466,7 @@ iptr_t menu_handle(const struct Menu *menu)
 
                #if CONFIG_MENU_SMOOTH || (CONFIG_MENU_TIMEOUT != 0)
                        key = kbd_peek();
+                       cpu_relax();
                #else
                        key = kbd_get();
                #endif