diff --git a/ChangeLog b/ChangeLog index 7567621ea..81cd4a170 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2001-07-19 Richard Frith-Macdonald + + * Source/UnixFileHandle.m: Don't abort aread/write attempts that + fail on EAGAIN or EINTR ... retry them instead. Avoid unexpected + exceptions when trying to write a large volume of data quicker + then the output device can handle. + * Source/WindowsFileHandle.m: ditto + 2001-07-19 Adam Fedor * Documentation/readme.texi: Explain the license for GNUstep more diff --git a/Source/GSTcpPort.m b/Source/GSTcpPort.m index acc914201..1e24886ee 100644 --- a/Source/GSTcpPort.m +++ b/Source/GSTcpPort.m @@ -1041,7 +1041,8 @@ static Class runLoopClass; else { state = GS_H_UNCON; - NSLog(@"connect write attempt failed - %s", GSLastErrorStr(errno)); + NSLog(@"connect write attempt failed - %s", + GSLastErrorStr(errno)); } RELEASE(d); } diff --git a/Source/UnixFileHandle.m b/Source/UnixFileHandle.m index 4b024284c..1c4ea0c8f 100644 --- a/Source/UnixFileHandle.m +++ b/Source/UnixFileHandle.m @@ -792,16 +792,29 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin) [self checkWrite]; if (isNonBlocking == YES) - [self setNonBlocking: NO]; + { + [self setNonBlocking: NO]; + } while (pos < len) { int toWrite = len - pos; if (toWrite > NETBUF_SIZE) - toWrite = NETBUF_SIZE; + { + toWrite = NETBUF_SIZE; + } rval = write(descriptor, (char*)ptr+pos, toWrite); if (rval < 0) - break; + { + if (errno == EAGAIN || errno == EINTR) + { + rval = 0; + } + else + { + break; + } + } pos += rval; } if (rval < 0) @@ -1271,7 +1284,7 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin) } else if (received < 0) { - if (errno != EAGAIN) + if (errno != EAGAIN && errno != EINTR) { NSString *s; @@ -1314,7 +1327,7 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin) written = write(descriptor, (char*)ptr+writePos, length-writePos); if (written <= 0) { - if (errno != EAGAIN) + if (written < 0 && errno != EAGAIN && errno != EINTR) { NSString *s; @@ -1662,7 +1675,7 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin) } else if (received < 0) { - if (errno != EAGAIN) + if (errno != EAGAIN && errno != EINTR) { NSString *s; @@ -1714,7 +1727,7 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin) } if (written <= 0) { - if (errno != EAGAIN) + if (written < 0 && errno != EAGAIN && errno != EINTR) { NSString *s; @@ -1907,13 +1920,17 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin) [self checkWrite]; if (isNonBlocking == YES) - [self setNonBlocking: NO]; + { + [self setNonBlocking: NO]; + } while (pos < len) { int toWrite = len - pos; if (toWrite > NETBUF_SIZE) - toWrite = NETBUF_SIZE; + { + toWrite = NETBUF_SIZE; + } if (connected) { rval = SSL_write(ssl, (char*)ptr+pos, toWrite); @@ -1923,7 +1940,16 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin) rval = write(descriptor, (char*)ptr+pos, toWrite); } if (rval < 0) - break; + { + if (errno == EAGAIN == errno == EINTR) + { + rval = 0; + } + else + { + break; + } + } pos += rval; } if (rval < 0) diff --git a/Source/WindowsFileHandle.m b/Source/WindowsFileHandle.m index ad684b6ee..0bb5723e5 100644 --- a/Source/WindowsFileHandle.m +++ b/Source/WindowsFileHandle.m @@ -731,16 +731,29 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin) [self checkWrite]; if (isNonBlocking == YES) - [self setNonBlocking: NO]; + { + [self setNonBlocking: NO]; + } while (pos < len) { int toWrite = len - pos; if (toWrite > NETBUF_SIZE) - toWrite = NETBUF_SIZE; + { + toWrite = NETBUF_SIZE; + } rval = write(descriptor, (char*)ptr+pos, toWrite); if (rval < 0) - break; + { + if (errno == EAGAIN || errno == EINTR) + { + rval = 0; + } + else + { + break; + } + } pos += rval; } if (rval < 0) @@ -1206,7 +1219,7 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin) } else if (received < 0) { - if (errno != EAGAIN) + if (errno != EAGAIN && errno != EINTR) { NSString *s; @@ -1249,12 +1262,12 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin) written = write(descriptor, (char*)ptr+writePos, length-writePos); if (written <= 0) { - if (errno != EAGAIN) + if (written < 0 && errno != EAGAIN && errno != EINTR) { NSString *s; s = [NSString stringWithFormat: - @"Write attempt failed - %s", GSLastErrorStr(errno)]; + @"Write attempt failed - %s", GSLastErrorStr(errno)]; [info setObject: s forKey: GSFileHandleNotificationError]; [self postWriteNotification]; } @@ -1275,13 +1288,13 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin) int len = sizeof(result); if (getsockopt(descriptor, SOL_SOCKET, SO_ERROR, - (char*)&result, &len) == 0 && result != 0) + (char*)&result, &len) == 0 && result != 0) { - NSString *s; + NSString *s; - s = [NSString stringWithFormat: @"Connect attempt failed - %s", - GSLastErrorStr(result)]; - [info setObject: s forKey: GSFileHandleNotificationError]; + s = [NSString stringWithFormat: @"Connect attempt failed - %s", + GSLastErrorStr(result)]; + [info setObject: s forKey: GSFileHandleNotificationError]; } else {