[patch] config/c_io_libio.cc - __basic_file::open(...)

brent verner brent@rcfile.org
Sun Jul 2 21:02:00 GMT 2000


The following prog bails because we are not closing the __fd for
the opened file, since _IO_file_attach() sets _IO_DELETE_DONT_CLOSE
in _flags. the patch further below unsets _IO_DELETE_DONT_CLOSE when
__basic_file::open() is used.

NOTE: I haven't been able to test this -- libstdc++-v3 is causing
an ICE in gcc-20000619 -- but I believe it will do the right thing.

  Brent

#include <fstream>
#include <cassert>

int
main()
{
  const int more_than_max_open_files = 8200;
  const char* some_file_on_your_system = "/etc/resolv.conf";
  
  for(int i = 0;++i < more_than_max_open_files){
    std::ifstream ifs(some_file_on_your_system);
    assert(ifs);
  }
  
  return 0;
}


Index: c_io_libio.cc
===================================================================
RCS file: /cvs/gcc/egcs/libstdc++-v3/config/c_io_libio.cc,v
retrieving revision 1.4
diff -c -p -3 -r1.4 c_io_libio.cc
*** c_io_libio.cc	2000/07/02 02:15:26	1.4
--- c_io_libio.cc	2000/07/03 03:43:46
*************** namespace std {
*** 152,158 ****
  #if _G_HAVE_IO_FILE_OPEN
  	__c_file_type* __f;
  	__f = _IO_file_open(this, __name, __p_mode, __prot, __rw_mode, 0);
! 	__retval = __f ? this: NULL;
  #else
  	int __fd = ::open(__name, __p_mode, __prot);
  	if (__fd >= 0)
--- 152,159 ----
  #if _G_HAVE_IO_FILE_OPEN
  	__c_file_type* __f;
  	__f = _IO_file_open(this, __name, __p_mode, __prot, __rw_mode, 0);
! 	this->_flags &= ~_IO_DELETE_DONT_CLOSE; // make sure this isn't set -=db=-
!   __retval = __f ? this: NULL;
  #else
  	int __fd = ::open(__name, __p_mode, __prot);
  	if (__fd >= 0)



More information about the Libstdc++ mailing list