diff options
author | Thomas Martitz <kugel@rockbox.org> | 2010-08-23 16:56:49 +0000 |
---|---|---|
committer | Thomas Martitz <kugel@rockbox.org> | 2010-08-23 16:56:49 +0000 |
commit | abdc5935beb7dc3fa63bffeec584921ad2a4c8bd (patch) | |
tree | 3eb3ca86063d0fff58ca8ed2c49dbb0af0792570 /apps/plugins/lib | |
parent | 8106c9dc646bbb26131896eb12d23edb26cba476 (diff) | |
download | rockbox-abdc5935beb7dc3fa63bffeec584921ad2a4c8bd.tar.gz rockbox-abdc5935beb7dc3fa63bffeec584921ad2a4c8bd.zip |
Introduce plugin_crt0.c that every plugin links.
It handles exit() properly, calling the handler also when the plugin returns
normally (also it makes 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 it 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@27862 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/lib')
-rw-r--r-- | apps/plugins/lib/SOURCES | 1 | ||||
-rw-r--r-- | apps/plugins/lib/pluginlib_exit.c | 25 | ||||
-rw-r--r-- | apps/plugins/lib/pluginlib_exit.h | 52 |
3 files changed, 25 insertions, 53 deletions
diff --git a/apps/plugins/lib/SOURCES b/apps/plugins/lib/SOURCES index fa12f94730..9b8b2146cc 100644 --- a/apps/plugins/lib/SOURCES +++ b/apps/plugins/lib/SOURCES | |||
@@ -2,7 +2,6 @@ gcc-support.c | |||
2 | pluginlib_actions.c | 2 | pluginlib_actions.c |
3 | helper.c | 3 | helper.c |
4 | md5.c | 4 | md5.c |
5 | pluginlib_exit.c | ||
6 | jhash.c | 5 | jhash.c |
7 | configfile.c | 6 | configfile.c |
8 | fixedpoint.c | 7 | 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 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2009 by Maurus Cuelenaere | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or | ||
13 | * modify it under the terms of the GNU General Public License | ||
14 | * as published by the Free Software Foundation; either version 2 | ||
15 | * of the License, or (at your option) any later version. | ||
16 | * | ||
17 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
18 | * KIND, either express or implied. | ||
19 | * | ||
20 | ****************************************************************************/ | ||
21 | |||
22 | #include "pluginlib_exit.h" | ||
23 | |||
24 | jmp_buf __exit_env DATA_ATTR; | ||
25 | |||
diff --git a/apps/plugins/lib/pluginlib_exit.h b/apps/plugins/lib/pluginlib_exit.h index 00cbc8dc7f..411d0751d1 100644 --- a/apps/plugins/lib/pluginlib_exit.h +++ b/apps/plugins/lib/pluginlib_exit.h | |||
@@ -22,35 +22,33 @@ | |||
22 | #ifndef __PLUGINLIB_EXIT_H__ | 22 | #ifndef __PLUGINLIB_EXIT_H__ |
23 | #define __PLUGINLIB_EXIT_H__ | 23 | #define __PLUGINLIB_EXIT_H__ |
24 | 24 | ||
25 | #include "config.h" | 25 | /* make sure we are in sync with the real definitions, especially on |
26 | #if (CONFIG_PLATFORM & PLATFORM_NATIVE) | 26 | * hosted systems */ |
27 | #include "../../codecs/lib/setjmp.h" | 27 | #include <stdlib.h> |
28 | #else | 28 | #include "gcc_extensions.h" |
29 | #include <setjmp.h> | ||
30 | #endif | ||
31 | 29 | ||
32 | #define _PLUGINLIB_EXIT_INIT(atexit) switch(setjmp(__exit_env)) \ | 30 | /* these are actually implemented in plugin_crt0.c which all plugins link */ |
33 | { \ | 31 | extern int atexit(void (*func)(void)); |
34 | case 1: \ | 32 | extern void exit(int status) NORETURN_ATTR; |
35 | atexit \ | 33 | /* these don't call the exit handlers */ |
36 | return PLUGIN_OK; \ | 34 | extern void _exit(int status) NORETURN_ATTR; |
37 | case 2: \ | 35 | /* C99 version */ |
38 | atexit \ | 36 | #define _Exit _exit |
39 | return PLUGIN_ERROR; \ | ||
40 | case 0: \ | ||
41 | default: \ | ||
42 | break; \ | ||
43 | } | ||
44 | 37 | ||
45 | /* Either PLUGINLIB_EXIT_INIT or PLUGINLIB_EXIT_INIT_ATEXIT needs to be placed | 38 | #ifndef EXIT_SUCCESS |
46 | * as the first line in plugin_start. The _ATEXIT version will call the named | 39 | #define EXIT_SUCCESS 0 |
47 | * no-argument function when exit() is called before exiting the plugin, to | 40 | #define EXIT_FAILURE 1 |
48 | * allow for cleanup. | 41 | #endif |
49 | */ | ||
50 | #define PLUGINLIB_EXIT_INIT _PLUGINLIB_EXIT_INIT() | ||
51 | #define PLUGINLIB_EXIT_INIT_ATEXIT(atexit) _PLUGINLIB_EXIT_INIT(atexit();) | ||
52 | 42 | ||
53 | extern jmp_buf __exit_env; | 43 | /** |
54 | #define exit(status) longjmp(__exit_env, status != 0 ? 2 : 1) | 44 | * helper function to handle USB connected events coming from |
45 | * button_get() | ||
46 | * | ||
47 | * it will exit the plugin if usb is detected, but it will call the atexit func | ||
48 | * before actually showing the usb screen | ||
49 | * | ||
50 | * it additionally handles power off as well, with the same behavior | ||
51 | */ | ||
52 | extern void exit_on_usb(int button); | ||
55 | 53 | ||
56 | #endif /* __PLUGINLIB_EXIT_H__ */ | 54 | #endif /* __PLUGINLIB_EXIT_H__ */ |