Make file handles more robust

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@10524 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Richard Frith-Macdonald 2001-07-19 16:13:02 +00:00
parent 634bf76d28
commit 9d8c0d8391
4 changed files with 70 additions and 22 deletions

View file

@ -1,3 +1,11 @@
2001-07-19 Richard Frith-Macdonald <rfm@gnu.org>
* 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 <fedor@gnu.org>
* Documentation/readme.texi: Explain the license for GNUstep more

View file

@ -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);
}

View file

@ -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)

View file

@ -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
{