windows-nt/Source/XPSP1/NT/base/crts/crtw32/stdio/setmaxf.c
2020-09-26 16:20:57 +08:00

152 lines
4 KiB
C

/***
*setmaxf.c - Set the maximum number of streams
*
* Copyright (c) 1995-2001, Microsoft Corporation. All rights reserved.
*
*Purpose:
* Defines _setmaxstdio(), a function which changes the maximum number
* of streams (stdio-level files) which can be open simultaneously.
*
*Revision History:
* 03-08-95 GJF Module defined (reluctantly)
* 12-28-95 GJF Major rewrite of _setmaxstio (several bugs). Added
* the _getmaxstdio() function.
* 03-02-98 GJF Exception-safe locking.
*
*******************************************************************************/
#include <cruntime.h>
#include <stdio.h>
#include <malloc.h>
#include <internal.h>
#include <file2.h>
#include <mtdll.h>
#include <dbgint.h>
/***
*int _setmaxstdio(maxnum) - sets the maximum number of streams to maxnum
*
*Purpose:
* Sets the maximum number of streams which may be simultaneously open
* to maxnum. This is done by resizing the __piob[] array and updating
* _nstream. Note that maxnum may be either larger or smaller than the
* current _nstream value.
*
*Entry:
* maxnum = new maximum number of streams
*
*Exit:
* Returns maxnum, if successful, and -1 otherwise.
*
*Exceptions:
*
*******************************************************************************/
int __cdecl _setmaxstdio (
int maxnum
)
{
void **newpiob;
int i;
int retval;
/*
* Make sure the request is reasonable.
*/
if ( (maxnum < _IOB_ENTRIES) || (maxnum > _NHANDLE_) )
return -1;
#ifdef _MT
_mlock(_IOB_SCAN_LOCK);
__try {
#endif
/*
* Try to reallocate the __piob array.
*/
if ( maxnum > _nstream ) {
if ( (newpiob = _realloc_crt( __piob, maxnum * sizeof(void *) ))
!= NULL )
{
/*
* Initialize new __piob entries to NULL
*/
for ( i = _nstream ; i < maxnum ; i++ )
newpiob[i] = NULL;
retval = _nstream = maxnum;
__piob = newpiob;
}
else
retval = -1;
}
else if ( maxnum == _nstream )
retval = _nstream;
else { /* maxnum < _nstream */
retval = maxnum;
/*
* Clean up the portion of the __piob[] to be freed.
*/
for ( i = _nstream - 1 ; i >= maxnum ; i-- )
/*
* If __piob[i] is non-NULL, free up the _FILEX struct it
* points to.
*/
if ( __piob[i] != NULL )
if ( !inuse( (FILE *)__piob[i] ) ) {
_free_crt( __piob[i] );
}
else {
/*
* _FILEX is still inuse! Don't free any anything and
* return failure to the caller.
*/
retval = -1;
break;
}
if ( retval != -1 )
if ( (newpiob = _realloc_crt( __piob, maxnum * sizeof(void *) ))
!= NULL )
{
_nstream = maxnum; /* retval already set to maxnum */
__piob = newpiob;
}
else
retval = -1;
}
#ifdef _MT
}
__finally {
_munlock(_IOB_SCAN_LOCK);
}
#endif
return retval;
}
/***
*int _getmaxstdio() - gets the maximum number of stdio files
*
*Purpose:
* Returns the maximum number of simultaneously open stdio-level files.
* This is the current value of _nstream.
*
*Entry:
*
*Exit:
* Returns current value of _nstream.
*
*Exceptions:
*
*******************************************************************************/
int __cdecl _getmaxstdio (
void
)
{
return _nstream;
}