Merge pull request #222 from fjtrujy/improveExitFlow

Improve `exit` flow
This commit is contained in:
Francisco Javier Trujillo Mata
2024-07-22 18:35:50 +02:00
committed by GitHub
4 changed files with 51 additions and 44 deletions

View File

@@ -37,8 +37,6 @@ INIT_OBJS = \
__libcglue_init.o \
__gprof_cleanup.o \
__libcglue_deinit.o \
_exit.o \
abort.o \
exit.o
LOCK_OBJS = \

View File

@@ -29,8 +29,6 @@ void __deinit_mutex();
void __locks_init();
void __locks_deinit();
extern int sce_newlib_nocreate_thread_in_start __attribute__((weak));
#ifdef F___gprof_cleanup
/* Note: This function is being called from _exit and it is overrided when compiling with -pg */
__attribute__((weak))
@@ -91,6 +89,7 @@ void __libcglue_init(int argc, char *argv[])
__attribute__((weak))
void __libcglue_deinit()
{
__gprof_cleanup();
__psp_free_heap();
__deinit_mutex();
__locks_deinit();
@@ -99,34 +98,6 @@ void __libcglue_deinit()
void __libcglue_deinit();
#endif
#ifdef F__exit
__attribute__((__noreturn__))
void _exit (int __status)
{
__gprof_cleanup();
__libcglue_deinit();
if (&sce_newlib_nocreate_thread_in_start != NULL) {
sceKernelSelfStopUnloadModule(1, 0, NULL);
} else {
sceKernelExitGame();
}
while (1); // Avoid warning
}
#else
__attribute__((__noreturn__))
void _exit (int __status);
#endif
#ifdef F_abort
__attribute__((weak))
void abort()
{
_exit(1);
}
#endif
#ifdef F_exit
__attribute__((weak))
void exit(int retval)

View File

@@ -9,11 +9,14 @@
*
*/
#include <stdlib.h>
#include <string.h>
#include <pspkerneltypes.h>
#include <pspmoduleinfo.h>
#include <pspthreadman.h>
#include <stdlib.h>
#include <string.h>
#include <psploadexec.h>
#include <pspmodulemgr.h>
/* The maximum number of arguments that can be passed to main(). */
#define ARG_MAX 19
@@ -39,6 +42,7 @@ extern SceModuleInfo module_info __attribute__((weak));
/* Allow to provide a libc init hook to be called before main */
extern void __libcglue_init(int argc, char *argv[]);
extern void __libcglue_deinit();
extern void _init(void);
extern void _fini(void);
extern int main(int argc, char *argv[]);
@@ -78,16 +82,31 @@ void _main(SceSize args, void *argp)
/* Init can contain C++ constructors that require working threading */
_init();
/* Make sure _fini() is called when the program ends. */
atexit((void *) _fini);
/* Call main(). */
int res = main(argc, argv);
/* Return control to the operating system. */
/* Return control to the operating system. This will end calling `_exit`*/
exit(res);
}
__attribute__((__noreturn__))
void _exit(int status)
{
/* call global destructors*/
_fini();
// uninitialize libcglue
__libcglue_deinit();
if (&sce_newlib_nocreate_thread_in_start != NULL) {
sceKernelSelfStopUnloadModule(1, 0, NULL);
} else {
sceKernelExitGame();
}
while (1); // Avoid warning
}
/**
* Startup thread
*

View File

@@ -9,11 +9,14 @@
*
*/
#include <stdlib.h>
#include <string.h>
#include <pspkerneltypes.h>
#include <pspmoduleinfo.h>
#include <pspthreadman.h>
#include <stdlib.h>
#include <string.h>
#include <psploadexec.h>
#include <pspmodulemgr.h>
/* The maximum number of arguments that can be passed to main(). */
#define ARG_MAX 19
@@ -39,6 +42,7 @@ extern SceModuleInfo module_info __attribute__((weak));
/* Allow to provide a libc init hook to be called before main */
extern void __libcglue_init(int argc, char *argv[]);
extern void __libcglue_deinit();
extern void _init(void);
extern void _fini(void);
extern int main(int argc, char *argv[]);
@@ -78,16 +82,31 @@ void _main(SceSize args, void *argp)
/* Init can contain C++ constructors that require working threading */
_init();
/* Make sure _fini() is called when the program ends. */
atexit((void *) _fini);
/* Call main(). */
int res = main(argc, argv);
/* Return control to the operating system. */
/* Return control to the operating system. This will end calling `_exit`*/
exit(res);
}
__attribute__((__noreturn__))
void _exit(int status)
{
/* call global destructors*/
_fini();
// uninitialize libcglue
__libcglue_deinit();
if (&sce_newlib_nocreate_thread_in_start != NULL) {
sceKernelSelfStopUnloadModule(1, 0, NULL);
} else {
sceKernelExitGame();
}
while (1); // Avoid warning
}
int module_start(SceSize args, void *argp) __attribute__((alias("_start")));
/**