summaryrefslogtreecommitdiff
path: root/apps/plugins/lib
diff options
context:
space:
mode:
authorThomas Martitz <kugel@rockbox.org>2010-08-23 16:56:49 +0000
committerThomas Martitz <kugel@rockbox.org>2010-08-23 16:56:49 +0000
commitabdc5935beb7dc3fa63bffeec584921ad2a4c8bd (patch)
tree3eb3ca86063d0fff58ca8ed2c49dbb0af0792570 /apps/plugins/lib
parent8106c9dc646bbb26131896eb12d23edb26cba476 (diff)
downloadrockbox-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/SOURCES1
-rw-r--r--apps/plugins/lib/pluginlib_exit.c25
-rw-r--r--apps/plugins/lib/pluginlib_exit.h52
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
2pluginlib_actions.c 2pluginlib_actions.c
3helper.c 3helper.c
4md5.c 4md5.c
5pluginlib_exit.c
6jhash.c 5jhash.c
7configfile.c 6configfile.c
8fixedpoint.c 7fixedpoint.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
24jmp_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 { \ 31extern int atexit(void (*func)(void));
34 case 1: \ 32extern void exit(int status) NORETURN_ATTR;
35 atexit \ 33/* these don't call the exit handlers */
36 return PLUGIN_OK; \ 34extern 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
53extern 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 */
52extern void exit_on_usb(int button);
55 53
56#endif /* __PLUGINLIB_EXIT_H__ */ 54#endif /* __PLUGINLIB_EXIT_H__ */