/* * __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); }
/* * __sinit() is called whenever stdio's internal variables must be set up. */ void __sinit(void) { _THREAD_PRIVATE_MUTEX(__sinit_mutex); int i; _THREAD_PRIVATE_MUTEX_LOCK(__sinit_mutex); if (__sdidinit) goto out; /* bail out if caller lost the race */ for (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; out: _THREAD_PRIVATE_MUTEX_UNLOCK(__sinit_mutex); }