예제 #1
0
/*
 * __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);
}
예제 #2
0
/*
 * __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);
}