This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Information on a commit related to libstdc++/9533


Nathan Myers wrote:

I agree that this is a very serious problem. Setting non-blocking
mode is a radical change to expected semantics, so that if that mode is not available, it cannot be right just to leave it off.


I think the real error is in setting non-blocking mode: that cannot be the right solution to whatever problem it meant to solve. I don't know what problem it was meant to solve. I do know that we have had iostream implementations for more than a decade that perform well on both files and ttys and do not depend on setting a non-blocking mode.

Thanks Nathan for your feedback: in fact, just reverting the hunk of 6746
which sets the non-blocking mode (see 9533 audit trail) appears to fix
the problem without regressing on 6746.

But... regtesting we got the failure of this test ("fail bit was not set!"):

// libstdc++/2913, libstdc++/4879
// John Fardo  <jfardo at laurelnetworks dot com>, Brad Garcia <garsh at attbi dot com>
void
test_04()
{
 signal(SIGPIPE, SIG_IGN);

 if (0 != mkfifo("xxx", S_IRWXU))
   {
     std::cerr << "failed to creat fifo" << std::endl;
     exit(-1);
   }

 int fval = fork();
 if (fval == -1)
   {
     std::cerr << "failed to fork" << std::endl;
     unlink("xxx");
     exit(-1);
   }
 else if (fval == 0)
   {
     std::ifstream ifs("xxx");
     sleep(1);
     ifs.close();
     exit(0);
   }

 std::ofstream ofs("xxx");
 sleep(2);
 ofs.put('t');

 /*
  * ISO/IED 14882:1998(E) 27.8.1.10.4
  *
  * void close();
  *
  * Effects:  Calls rdbuf()->close() and, if that function fails
  * (returns a null pointer), calls setstate(failbit)...
  */
 ofs.close();
 if (!(ofs.rdstate() & std::ios::failbit))
   {
     std::cerr << "fail bit was not set!" << std::endl;
     unlink("xxx");
     exit(-1);
   }

 unlink("xxx");
}

Ideas?

Thanks,
Paolo.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]