working on it
This commit is contained in:
parent
56a6e78765
commit
35a88970c2
1094 changed files with 51093 additions and 51 deletions
9
05/musl-final/src/exit/_Exit.c
Normal file
9
05/musl-final/src/exit/_Exit.c
Normal file
|
@ -0,0 +1,9 @@
|
|||
#include <stdlib.h>
|
||||
#define SYSCALL_NORETURN
|
||||
#include "syscall.h"
|
||||
|
||||
void _Exit(int ec)
|
||||
{
|
||||
syscall1(__NR_exit_group, ec);
|
||||
syscall1(__NR_exit, ec);
|
||||
}
|
8
05/musl-final/src/exit/abort.c
Normal file
8
05/musl-final/src/exit/abort.c
Normal file
|
@ -0,0 +1,8 @@
|
|||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
|
||||
void abort(void)
|
||||
{
|
||||
raise(SIGABRT);
|
||||
for (;;);
|
||||
}
|
9
05/musl-final/src/exit/assert.c
Normal file
9
05/musl-final/src/exit/assert.c
Normal file
|
@ -0,0 +1,9 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
void __assert_fail(const char *expr, const char *file, int line, const char *func)
|
||||
{
|
||||
fprintf(stderr, "Assertion failed: %s (%s: %s: %d)\n", expr, file, func, line);
|
||||
fflush(NULL);
|
||||
abort();
|
||||
}
|
57
05/musl-final/src/exit/atexit.c
Normal file
57
05/musl-final/src/exit/atexit.c
Normal file
|
@ -0,0 +1,57 @@
|
|||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <limits.h>
|
||||
#include "libc.h"
|
||||
|
||||
/* Ensure that at least 32 atexit handlers can be registered without malloc */
|
||||
#define COUNT 32
|
||||
|
||||
static struct fl
|
||||
{
|
||||
struct fl *next;
|
||||
void (*f[COUNT])(void);
|
||||
} builtin, *head;
|
||||
|
||||
static int run_atexit_functions(void)
|
||||
{
|
||||
int i;
|
||||
for (; head; head=head->next) {
|
||||
for (i=COUNT-1; i>=0 && !head->f[i]; i--);
|
||||
for (; i>=0; i--) head->f[i]();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int (*const __funcs_on_exit)(void) = run_atexit_functions;
|
||||
|
||||
int atexit(void (*func)(void))
|
||||
{
|
||||
static int lock;
|
||||
int i;
|
||||
|
||||
/* Hook for atexit extensions */
|
||||
if (libc.atexit) return libc.atexit(func);
|
||||
|
||||
LOCK(&lock);
|
||||
|
||||
/* Defer initialization of head so it can be in BSS */
|
||||
if (!head) head = &builtin;
|
||||
|
||||
/* If the current function list is full, add a new one */
|
||||
if (head->f[COUNT-1]) {
|
||||
struct fl *new_fl = calloc(sizeof(struct fl), 1);
|
||||
if (!new_fl) {
|
||||
UNLOCK(&lock);
|
||||
return -1;
|
||||
}
|
||||
new_fl->next = head;
|
||||
head = new_fl;
|
||||
}
|
||||
|
||||
/* Append function to the list. */
|
||||
for (i=0; i<COUNT && head->f[i]; i++);
|
||||
head->f[i] = func;
|
||||
|
||||
UNLOCK(&lock);
|
||||
return 0;
|
||||
}
|
33
05/musl-final/src/exit/exit.c
Normal file
33
05/musl-final/src/exit/exit.c
Normal file
|
@ -0,0 +1,33 @@
|
|||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include "libc.h"
|
||||
|
||||
#if 0
|
||||
/* __overflow.c and atexit.c override these */
|
||||
static int (*const dummy)() = 0;
|
||||
weak_alias(dummy, __funcs_on_exit);
|
||||
weak_alias(dummy, __fflush_on_exit);
|
||||
#else
|
||||
extern int (*const __funcs_on_exit)(void);
|
||||
extern int (*const __fflush_on_exit)(FILE *);
|
||||
#endif
|
||||
|
||||
void exit(int code)
|
||||
{
|
||||
static int lock;
|
||||
|
||||
/* If more than one thread calls exit, hang until _Exit ends it all */
|
||||
LOCK(&lock);
|
||||
|
||||
/* Only do atexit & stdio flush if they were actually used */
|
||||
if (__funcs_on_exit) __funcs_on_exit();
|
||||
if (__fflush_on_exit) __fflush_on_exit(0);
|
||||
|
||||
/* Destructor s**t is kept separate from atexit to avoid bloat */
|
||||
if (libc.fini) libc.fini();
|
||||
if (libc.ldso_fini) libc.ldso_fini();
|
||||
|
||||
_Exit(code);
|
||||
for(;;);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue