diff options
author | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-07-26 00:40:50 +0000 |
---|---|---|
committer | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-07-26 00:40:50 +0000 |
commit | ffde4de025b1ae9d4f7e8fd15fc3a06fe61da0b1 (patch) | |
tree | 9875d1b9bc47a19b0c0f76f44a3bbecae0da6046 /libjava/java/io/natFileDescriptorPosix.cc | |
parent | b24e4c6bb582a17e47b8a8f45fd4237629371190 (diff) | |
download | ppe42-gcc-ffde4de025b1ae9d4f7e8fd15fc3a06fe61da0b1.tar.gz ppe42-gcc-ffde4de025b1ae9d4f7e8fd15fc3a06fe61da0b1.zip |
* java/io/natFileDescriptorPosix.cc (write): Try again on EINTR.
(write): Likewise.
(read): Likewise.
(read): Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@69807 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/java/io/natFileDescriptorPosix.cc')
-rw-r--r-- | libjava/java/io/natFileDescriptorPosix.cc | 60 |
1 files changed, 37 insertions, 23 deletions
diff --git a/libjava/java/io/natFileDescriptorPosix.cc b/libjava/java/io/natFileDescriptorPosix.cc index 2ad2d9dce77..e43bb9d1135 100644 --- a/libjava/java/io/natFileDescriptorPosix.cc +++ b/libjava/java/io/natFileDescriptorPosix.cc @@ -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; } |