summaryrefslogtreecommitdiff
path: root/apps/plugins/lib
diff options
context:
space:
mode:
authorThomas Martitz <kugel@rockbox.org>2010-08-24 14:30:46 +0000
committerThomas Martitz <kugel@rockbox.org>2010-08-24 14:30:46 +0000
commitcae4ae2c71ae10ff67d39a78a705136e740dc07e (patch)
treeb5bb5e1879493f67d7c7ad977fba90eb49b743d7 /apps/plugins/lib
parent3478bc5d6dc0a081c3aeb4f501c8b4cb4f53a78d (diff)
Second try: Introduce plugin_crt0.c that every plugin links.
It handles exit() properly, calling the handler also when the plugin returns normally (also make exit() more standard compliant while at it). It also holds PLUGIN_HEADER, so that it doesn't need to be in each plugin anymore. To work better together with callbacks passed to rb->default_event_handler_ex() introduce exit_on_usb() which will call the exit handler before showing the usb screen and exit() after it. In most cases rb->default_event_handler_ex() was passed a callback which was manually called at all other return points. This can now be done via atexit(). In future plugin_crt0.c could also handle clearing bss, initializing iram and more. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27873 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/lib')
-rw-r--r--apps/plugins/lib/SOURCES1
-rw-r--r--apps/plugins/lib/pluginlib_exit.c25
-rw-r--r--apps/plugins/lib/pluginlib_exit.h48
3 files changed, 25 insertions, 49 deletions
diff --git a/apps/plugins/lib/SOURCES b/apps/plugins/lib/SOURCES
index 1db9896065..6f17c70b90 100644
--- a/apps/plugins/lib/SOURCES
+++ b/apps/plugins/lib/SOURCES
@@ -2,7 +2,6 @@ gcc-support.c
pluginlib_actions.c
helper.c
md5.c
-pluginlib_exit.c
jhash.c
configfile.c
fixedpoint.c
diff --git a/apps/plugins/lib/pluginlib_exit.c b/apps/plugins/lib/pluginlib_exit.c
deleted file mode 100644
index 82ae11aca0..0000000000
--- a/apps/plugins/lib/pluginlib_exit.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/***************************************************************************
-* __________ __ ___.
-* Open \______ \ ____ ____ | | _\_ |__ _______ ___
-* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
-* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
-* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
-* \/ \/ \/ \/ \/
-* $Id$
-*
-* Copyright (C) 2009 by Maurus Cuelenaere
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* of the License, or (at your option) any later version.
-*
-* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-* KIND, either express or implied.
-*
-****************************************************************************/
-
-#include "pluginlib_exit.h"
-
-jmp_buf __exit_env DATA_ATTR;
-
diff --git a/apps/plugins/lib/pluginlib_exit.h b/apps/plugins/lib/pluginlib_exit.h
index 8c7f0c437f..411d0751d1 100644
--- a/apps/plugins/lib/pluginlib_exit.h
+++ b/apps/plugins/lib/pluginlib_exit.h
@@ -22,31 +22,33 @@
#ifndef __PLUGINLIB_EXIT_H__
#define __PLUGINLIB_EXIT_H__
-#include "config.h"
-#include <setjmp.h>
+/* make sure we are in sync with the real definitions, especially on
+ * hosted systems */
+#include <stdlib.h>
+#include "gcc_extensions.h"
-#define _PLUGINLIB_EXIT_INIT(atexit) switch(setjmp(__exit_env)) \
- { \
- case 1: \
- atexit \
- return PLUGIN_OK; \
- case 2: \
- atexit \
- return PLUGIN_ERROR; \
- case 0: \
- default: \
- break; \
- }
+/* these are actually implemented in plugin_crt0.c which all plugins link */
+extern int atexit(void (*func)(void));
+extern void exit(int status) NORETURN_ATTR;
+/* these don't call the exit handlers */
+extern void _exit(int status) NORETURN_ATTR;
+/* C99 version */
+#define _Exit _exit
-/* Either PLUGINLIB_EXIT_INIT or PLUGINLIB_EXIT_INIT_ATEXIT needs to be placed
- * as the first line in plugin_start. The _ATEXIT version will call the named
- * no-argument function when exit() is called before exiting the plugin, to
- * allow for cleanup.
- */
-#define PLUGINLIB_EXIT_INIT _PLUGINLIB_EXIT_INIT()
-#define PLUGINLIB_EXIT_INIT_ATEXIT(atexit) _PLUGINLIB_EXIT_INIT(atexit();)
+#ifndef EXIT_SUCCESS
+#define EXIT_SUCCESS 0
+#define EXIT_FAILURE 1
+#endif
-extern jmp_buf __exit_env;
-#define exit(status) longjmp(__exit_env, status != 0 ? 2 : 1)
+/**
+ * helper function to handle USB connected events coming from
+ * button_get()
+ *
+ * it will exit the plugin if usb is detected, but it will call the atexit func
+ * before actually showing the usb screen
+ *
+ * it additionally handles power off as well, with the same behavior
+ */
+extern void exit_on_usb(int button);
#endif /* __PLUGINLIB_EXIT_H__ */