From 9f525644df99cb2f7f81a23ca23840f0a8f82275 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Tue, 8 Apr 2014 17:14:01 -0700 Subject: [PATCH] Implement _Exit(3). Change-Id: Ida6ac844cc87d38c9645b197dd8188bb73e27dbe --- libc/SYSCALLS.TXT | 2 +- libc/arch-arm/syscalls/_exit.S | 3 +++ libc/arch-arm64/syscalls/_exit.S | 3 +++ libc/arch-mips/syscalls/_exit.S | 3 +++ libc/arch-mips64/syscalls/_exit.S | 3 +++ libc/arch-x86/syscalls/_exit.S | 3 +++ libc/arch-x86_64/syscalls/_exit.S | 3 +++ libc/include/stdlib.h | 3 ++- tests/stdlib_test.cpp | 14 ++++++++++++++ tests/unistd_test.cpp | 14 ++++++++++++++ 10 files changed, 49 insertions(+), 2 deletions(-) diff --git a/libc/SYSCALLS.TXT b/libc/SYSCALLS.TXT index e597b2f52..220c7139b 100644 --- a/libc/SYSCALLS.TXT +++ b/libc/SYSCALLS.TXT @@ -308,7 +308,7 @@ int __epoll_pwait:epoll_pwait(int, struct epoll_event*, int, int, const sigset_t int eventfd:eventfd2(unsigned int, int) all -void _exit:exit_group(int) all +void _exit|_Exit:exit_group(int) all void __exit:exit(int) all int futex(void*, int, int, void*, void*, int) all diff --git a/libc/arch-arm/syscalls/_exit.S b/libc/arch-arm/syscalls/_exit.S index 1a6b35dcb..581b340e3 100644 --- a/libc/arch-arm/syscalls/_exit.S +++ b/libc/arch-arm/syscalls/_exit.S @@ -12,3 +12,6 @@ ENTRY(_exit) neg r0, r0 b __set_errno END(_exit) + + .globl _Exit + .equ _Exit, _exit diff --git a/libc/arch-arm64/syscalls/_exit.S b/libc/arch-arm64/syscalls/_exit.S index 24b7b17d0..40ada4863 100644 --- a/libc/arch-arm64/syscalls/_exit.S +++ b/libc/arch-arm64/syscalls/_exit.S @@ -19,3 +19,6 @@ ENTRY(_exit) ret END(_exit) + + .globl _Exit + .equ _Exit, _exit diff --git a/libc/arch-mips/syscalls/_exit.S b/libc/arch-mips/syscalls/_exit.S index 5a0877da3..f546b66f6 100644 --- a/libc/arch-mips/syscalls/_exit.S +++ b/libc/arch-mips/syscalls/_exit.S @@ -17,3 +17,6 @@ ENTRY(_exit) nop .set reorder END(_exit) + + .globl _Exit + .equ _Exit, _exit diff --git a/libc/arch-mips64/syscalls/_exit.S b/libc/arch-mips64/syscalls/_exit.S index 9b108a65b..eb84def8c 100644 --- a/libc/arch-mips64/syscalls/_exit.S +++ b/libc/arch-mips64/syscalls/_exit.S @@ -23,3 +23,6 @@ ENTRY(_exit) move ra, t0 .set pop END(_exit) + + .globl _Exit + .equ _Exit, _exit diff --git a/libc/arch-x86/syscalls/_exit.S b/libc/arch-x86/syscalls/_exit.S index 2ff5faf13..793c9d59c 100644 --- a/libc/arch-x86/syscalls/_exit.S +++ b/libc/arch-x86/syscalls/_exit.S @@ -20,3 +20,6 @@ ENTRY(_exit) popl %ebx ret END(_exit) + + .globl _Exit + .equ _Exit, _exit diff --git a/libc/arch-x86_64/syscalls/_exit.S b/libc/arch-x86_64/syscalls/_exit.S index f40cfe3f1..3c158976a 100644 --- a/libc/arch-x86_64/syscalls/_exit.S +++ b/libc/arch-x86_64/syscalls/_exit.S @@ -14,3 +14,6 @@ ENTRY(_exit) 1: ret END(_exit) + + .globl _Exit + .equ _Exit, _exit diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h index 5dbcb3d7d..2c797c593 100644 --- a/libc/include/stdlib.h +++ b/libc/include/stdlib.h @@ -41,8 +41,9 @@ __BEGIN_DECLS #define EXIT_FAILURE 1 #define EXIT_SUCCESS 0 -extern __noreturn void exit(int); extern __noreturn void abort(void); +extern __noreturn void exit(int); +extern __noreturn void _Exit(int); extern int atexit(void (*)(void)); extern char *getenv(const char *); diff --git a/tests/stdlib_test.cpp b/tests/stdlib_test.cpp index 3a3fe28ae..bb395f04f 100644 --- a/tests/stdlib_test.cpp +++ b/tests/stdlib_test.cpp @@ -202,3 +202,17 @@ TEST(stdlib, strtof) { TEST(stdlib, strtold) { ASSERT_DOUBLE_EQ(1.23, strtold("1.23", NULL)); } + +TEST(unistd, _Exit) { + int pid = fork(); + ASSERT_NE(-1, pid) << strerror(errno); + + if (pid == 0) { + _Exit(99); + } + + int status; + ASSERT_EQ(pid, waitpid(pid, &status, 0)); + ASSERT_TRUE(WIFEXITED(status)); + ASSERT_EQ(99, WEXITSTATUS(status)); +} diff --git a/tests/unistd_test.cpp b/tests/unistd_test.cpp index f50c102f6..da8fd4b7b 100644 --- a/tests/unistd_test.cpp +++ b/tests/unistd_test.cpp @@ -116,3 +116,17 @@ TEST(unistd, read_EBADF) { TEST(unistd, alarm) { ASSERT_EQ(0U, alarm(0)); } + +TEST(unistd, _exit) { + int pid = fork(); + ASSERT_NE(-1, pid) << strerror(errno); + + if (pid == 0) { + _exit(99); + } + + int status; + ASSERT_EQ(pid, waitpid(pid, &status, 0)); + ASSERT_TRUE(WIFEXITED(status)); + ASSERT_EQ(99, WEXITSTATUS(status)); +}