diff options
author | Elliott Hughes <enh@google.com> | 2015-12-04 18:03:12 -0800 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2015-12-05 07:30:59 -0800 |
commit | bb46afd6c44a847efe96e30d72708fd2d0906e8c (patch) | |
tree | 9223b0b3f481341e36fc054e7209de3ec088a579 /libc/stdlib | |
parent | 0d89913e74981cd51532e66a2e2f138392be4de1 (diff) |
Revert "Revert "Remove __sinit and __sdidinit.""
This reverts commit c8bae05f3ff9f1c736f7be70fa17d02795d748bb.
We were breaking init (ueventd) because we initialize system properties
before we initialize stdio. The new system property implementation uses
stdio to read from /property_contexts, so we end up touching stdio data
structures before they've been initialized.
This second attempt takes things further by removing the stdio initialization
function altogether. The data structures for stdin/stdout/stderr can be
statically initialized as data, and -- since we already had to give the
atexit implementation a backdoor for stdio -- we can just admit that we
need to clean up stdio, and that we always do so last.
This patch also removes the 17 statically pre-allocated file structures,
so the first fopen will now allocate a block of 10 (the usual overflow
behavior). I did this just to make my life simpler, but it's not actually
necessary to remove it if we want it back.
Change-Id: I936b2eb5e88e4ebaf5516121872b71fc88e5609c
Diffstat (limited to 'libc/stdlib')
-rw-r--r-- | libc/stdlib/atexit.c | 45 |
1 files changed, 3 insertions, 42 deletions
diff --git a/libc/stdlib/atexit.c b/libc/stdlib/atexit.c index 34a4db15b..c817b631c 100644 --- a/libc/stdlib/atexit.c +++ b/libc/stdlib/atexit.c @@ -185,51 +185,12 @@ restart: } _ATEXIT_UNLOCK(); + extern void __libc_stdio_cleanup(void); + __libc_stdio_cleanup(); + /* BEGIN android-changed: call __unregister_atfork if dso is not null */ if (dso != NULL) { __unregister_atfork(dso); } /* END android-changed */ } - -/* - * Register the cleanup function - */ -void -__atexit_register_cleanup(void (*func)(void)) -{ - struct atexit *p; - size_t pgsize = getpagesize(); - - if (pgsize < sizeof(*p)) - return; - _ATEXIT_LOCK(); - p = __atexit; - while (p != NULL && p->next != NULL) - p = p->next; - if (p == NULL) { - p = mmap(NULL, pgsize, PROT_READ | PROT_WRITE, - MAP_ANON | MAP_PRIVATE, -1, 0); - if (p == MAP_FAILED) - goto unlock; -/* BEGIN android-changed */ - prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, p, pgsize, - "atexit handlers"); -/* END android-changed */ - p->ind = 1; - p->max = (pgsize - ((char *)&p->fns[0] - (char *)p)) / - sizeof(p->fns[0]); - p->next = NULL; - __atexit = p; - } else { - if (mprotect(p, pgsize, PROT_READ | PROT_WRITE)) - goto unlock; - } - p->fns[0].fn_ptr = (void (*)(void *))func; - p->fns[0].fn_arg = NULL; - p->fns[0].fn_dso = NULL; - mprotect(p, pgsize, PROT_READ); - restartloop = 1; -unlock: - _ATEXIT_UNLOCK(); -} |