natFileDescriptorPosix.cc (write): Try again on EINTR.

* java/io/natFileDescriptorPosix.cc (write): Try again on EINTR.
	(write): Likewise.
	(read): Likewise.
	(read): Likewise.

From-SVN: r69807
This commit is contained in:
Tom Tromey 2003-07-26 00:40:50 +00:00 committed by Tom Tromey
parent 037af9d77b
commit 49f60a1a01
2 changed files with 44 additions and 23 deletions

View file

@ -150,7 +150,8 @@ java::io::FileDescriptor::write (jint b)
iioe->bytesTransferred = r == -1 ? 0 : r;
throw iioe;
}
throw new IOException (JvNewStringLatin1 (strerror (errno)));
if (errno != EINTR)
throw new IOException (JvNewStringLatin1 (strerror (errno)));
}
}
position++;
@ -178,7 +179,8 @@ java::io::FileDescriptor::write (jbyteArray b, jint offset, jint len)
iioe->bytesTransferred = written;
throw iioe;
}
throw new IOException (JvNewStringLatin1 (strerror (errno)));
if (errno != EINTR)
throw new IOException (JvNewStringLatin1 (strerror (errno)));
}
written += r;
@ -282,20 +284,26 @@ jint
java::io::FileDescriptor::read (void)
{
jbyte b;
int r = ::read (fd, &b, 1);
if (r == 0)
return -1;
if (r == -1)
int r;
do
{
if (java::lang::Thread::interrupted())
r = ::read (fd, &b, 1);
if (r == 0)
return -1;
if (r == -1)
{
InterruptedIOException *iioe
= new InterruptedIOException (JvNewStringLatin1 (strerror (errno)));
iioe->bytesTransferred = r == -1 ? 0 : r;
throw iioe;
if (java::lang::Thread::interrupted())
{
InterruptedIOException *iioe
= new InterruptedIOException (JvNewStringLatin1 (strerror (errno)));
iioe->bytesTransferred = r == -1 ? 0 : r;
throw iioe;
}
if (errno != EINTR)
throw new IOException (JvNewStringLatin1 (strerror (errno)));
}
throw new IOException (JvNewStringLatin1 (strerror (errno)));
}
while (r != 1);
position++;
return b & 0xFF;
}
@ -314,20 +322,26 @@ java::io::FileDescriptor::read (jbyteArray buffer, jint offset, jint count)
return 0;
jbyte *bytes = elements (buffer) + offset;
int r = ::read (fd, bytes, count);
if (r == 0)
return -1;
if (r == -1)
{
if (java::lang::Thread::interrupted())
int r;
do
{
r = ::read (fd, bytes, count);
if (r == 0)
return -1;
if (r == -1)
{
InterruptedIOException *iioe
= new InterruptedIOException (JvNewStringLatin1 (strerror (errno)));
iioe->bytesTransferred = r == -1 ? 0 : r;
throw iioe;
if (java::lang::Thread::interrupted())
{
InterruptedIOException *iioe
= new InterruptedIOException (JvNewStringLatin1 (strerror (errno)));
iioe->bytesTransferred = r == -1 ? 0 : r;
throw iioe;
}
if (errno != EINTR)
throw new IOException (JvNewStringLatin1 (strerror (errno)));
}
throw new IOException (JvNewStringLatin1 (strerror (errno)));
}
while (r <= 0);
position += r;
return r;
}