提交 9a586c9c 编写于 作者: O openharmony_ci 提交者: Gitee

!88 fix: 进程退出静态问题

Merge pull request !88 from zhushengle/exit
#include <stdlib.h>
#include <stdint.h>
#include <signal.h>
#include <atomic.h>
#include "libc.h"
static void dummy()
{
}
/* atexit.c and __stdio_exit.c override these. the latter is linked
* as a consequence of linking either __toread.c or __towrite.c. */
weak_alias(dummy, __funcs_on_exit);
weak_alias(dummy, __stdio_exit);
weak_alias(dummy, _fini);
extern weak hidden void (*const __fini_array_start)(void), (*const __fini_array_end)(void);
static void libc_exit_fini(void)
{
uintptr_t a = (uintptr_t)&__fini_array_end;
for (; a>(uintptr_t)&__fini_array_start; a-=sizeof(void(*)()))
(*(void (**)())(a-sizeof(void(*)())))();
_fini();
}
weak_alias(libc_exit_fini, __libc_exit_fini);
_Noreturn void exit(int code)
{
sigset_t set;
if (a_cas(&libc.exit, 0, 1) != 0) {
return;
}
__block_app_sigs(&set);
__funcs_on_exit();
__libc_exit_fini();
__stdio_exit();
_Exit(code);
}
......@@ -27,6 +27,7 @@ struct __libc {
size_t tls_size, tls_align, tls_cnt;
size_t page_size;
struct __locale_struct global_locale;
int exit;
};
#ifndef PAGE_SIZE
......
......@@ -30,6 +30,7 @@ pid_t fork(void)
self->next = self->prev = self;
__thread_list_lock = 0;
libc.threads_minus_1 = 0;
libc.exit = 0;
signal(SIGSYS, arm_do_signal);
}
__restore_sigs(&set);
......
......@@ -2,6 +2,8 @@
#include <stdint.h>
#include <stdbool.h>
#include <debug.h>
#include <signal.h>
#include <atomic.h>
#include "libc.h"
extern bool g_enable_check;
......@@ -32,6 +34,11 @@ weak_alias(libc_exit_fini, __libc_exit_fini);
_Noreturn void exit(int code)
{
sigset_t set;
if (a_cas(&libc.exit, 0, 1) != 0) {
return;
}
__block_app_sigs(&set);
if (g_enable_check) {
check_leak();
check_heap_integrity();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册