pluginlib: Support calling a function at exit time to clean up open files

or other similar work. This is not quite the same as atexit() on POSIX as
the function is *not* called if the plugin exits by returning from
plugin_start; only if exit() is called. No code overhead if it's not used.


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@24189 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Torne Wuff 2010-01-05 22:17:32 +00:00
parent 44fa025d8f
commit 9e16161832

View file

@ -29,17 +29,26 @@
#include <setjmp.h>
#endif
/* PLUGINLIB_EXIT_INIT needs to be placed as the first line in plugin_start */
#define PLUGINLIB_EXIT_INIT switch(setjmp(__exit_env)) \
{ \
case 1: \
return PLUGIN_OK; \
case 2: \
return PLUGIN_ERROR; \
case 0: \
default: \
break; \
}
#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; \
}
/* 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();)
extern jmp_buf __exit_env;
#define exit(status) longjmp(__exit_env, status != 0 ? 2 : 1)