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/stdio/findfp.c | |
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/stdio/findfp.c')
-rw-r--r-- | libc/stdio/findfp.c | 70 |
1 files changed, 12 insertions, 58 deletions
diff --git a/libc/stdio/findfp.c b/libc/stdio/findfp.c index 2696cfd25..35de07235 100644 --- a/libc/stdio/findfp.c +++ b/libc/stdio/findfp.c @@ -44,37 +44,35 @@ #define ALIGNBYTES (sizeof(uintptr_t) - 1) #define ALIGN(p) (((uintptr_t)(p) + ALIGNBYTES) &~ ALIGNBYTES) -int __sdidinit; - #define NDYNAMIC 10 /* add ten more whenever necessary */ #define std(flags, file) \ {0,0,0,flags,file,{0,0},0,__sF+file,__sclose,__sread,__sseek,__swrite, \ {(unsigned char *)(__sFext+file), 0},NULL,0,{0},{0},{0,0},0,0} - /* the usual - (stdin + stdout + stderr) */ -static FILE usual[FOPEN_MAX - 3]; -static struct __sfileext usualext[FOPEN_MAX - 3]; -static struct glue uglue = { 0, FOPEN_MAX - 3, usual }; -static struct glue *lastglue = &uglue; _THREAD_PRIVATE_MUTEX(__sfp_mutex); -static struct __sfileext __sFext[3]; +static struct __sfileext __sFext[3] = { + { { NULL, 0 }, {}, PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP, false }, + { { NULL, 0 }, {}, PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP, false }, + { { NULL, 0 }, {}, PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP, false }, +}; // __sF is exported for backwards compatibility. Until M, we didn't have symbols // for stdin/stdout/stderr; they were macros accessing __sF. FILE __sF[3] = { - std(__SRD, STDIN_FILENO), /* stdin */ - std(__SWR, STDOUT_FILENO), /* stdout */ - std(__SWR|__SNBF, STDERR_FILENO) /* stderr */ + std(__SRD, STDIN_FILENO), + std(__SWR, STDOUT_FILENO), + std(__SWR|__SNBF, STDERR_FILENO), }; -struct glue __sglue = { &uglue, 3, __sF }; - FILE* stdin = &__sF[0]; FILE* stdout = &__sF[1]; FILE* stderr = &__sF[2]; +struct glue __sglue = { NULL, 3, __sF }; +static struct glue* lastglue = &__sglue; + static struct glue * moreglue(int n) { @@ -114,9 +112,6 @@ __sfp(void) int n; struct glue *g; - if (!__sdidinit) - __sinit(); - _THREAD_PRIVATE_MUTEX_LOCK(__sfp_mutex); for (g = &__sglue; g != NULL; g = g->next) { for (fp = g->iobs, n = g->niobs; --n >= 0; fp++) @@ -149,48 +144,7 @@ found: return (fp); } -/* - * exit() and abort() call _cleanup() through the callback registered - * with __atexit_register_cleanup(), set whenever we open or buffer a - * file. This chicanery is done so that programs that do not use stdio - * need not link it all in. - * - * The name `_cleanup' is, alas, fairly well known outside stdio. - */ -void -_cleanup(void) -{ +__LIBC_HIDDEN__ void __libc_stdio_cleanup(void) { /* (void) _fwalk(fclose); */ (void) _fwalk(__sflush); /* `cheating' */ } - -/* - * __sinit() is called whenever stdio's internal variables must be set up. - */ -void -__sinit(void) -{ - _THREAD_PRIVATE_MUTEX(__sinit_mutex); - - _THREAD_PRIVATE_MUTEX_LOCK(__sinit_mutex); - if (__sdidinit) { - /* bail out if caller lost the race */ - _THREAD_PRIVATE_MUTEX_UNLOCK(__sinit_mutex); - return; - } - - /* Initialize stdin/stdout/stderr (for the recursive mutex). http://b/18208568. */ - for (size_t i = 0; i < 3; ++i) { - _FILEEXT_SETUP(__sF+i, __sFext+i); - } - /* Initialize the pre-allocated (but initially unused) streams. */ - for (size_t i = 0; i < FOPEN_MAX - 3; ++i) { - _FILEEXT_SETUP(usual+i, usualext+i); - } - - /* make sure we clean up on exit */ - __atexit_register_cleanup(_cleanup); /* conservative */ - __sdidinit = 1; - - _THREAD_PRIVATE_MUTEX_UNLOCK(__sinit_mutex); -} |