From 85fc07ec453cfc9f6dcee4f25210003bdd8b7b4f Mon Sep 17 00:00:00 2001 From: rfm Date: Wed, 7 Mar 2012 13:46:50 +0000 Subject: [PATCH] attempt to fix event generation/handing logic for data streams git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@34903 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 5 ++++ Source/GSStream.m | 64 +++++++++++++++++++++++------------------------ 2 files changed, 37 insertions(+), 32 deletions(-) diff --git a/ChangeLog b/ChangeLog index d2d968236..5867da6d9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2012-03-07 Richard Frith-Macdonald + + * Source/GSStream.m: Attempt to fix logic for event handling of data + streams. + 2012-03-01 Jens Alfke * Headers/GNUstepBase/NSURL+GNUstepBase.h: diff --git a/Source/GSStream.m b/Source/GSStream.m index 20f72887b..7fac3f70b 100644 --- a/Source/GSStream.m +++ b/Source/GSStream.m @@ -716,8 +716,7 @@ static RunLoopEventType typeForStream(NSStream *aStream) - (NSInteger) read: (uint8_t *)buffer maxLength: (NSUInteger)len { - unsigned long dataSize; - unsigned long copySize; + NSUInteger dataSize; if (buffer == 0) { @@ -730,33 +729,29 @@ static RunLoopEventType typeForStream(NSStream *aStream) format: @"zero byte read write requested"]; } - _events &= ~NSStreamEventHasSpaceAvailable; - - if ([self streamStatus] == NSStreamStatusClosed) + if ([self streamStatus] == NSStreamStatusClosed + || [self streamStatus] == NSStreamStatusAtEnd) { return 0; } + /* Mark the data availability event as handled, so we can generate more. + */ + _events &= ~NSStreamEventHasBytesAvailable; + dataSize = [_data length]; NSAssert(dataSize >= _pointer, @"Buffer overflow!"); - if (len + _pointer > dataSize) - { - copySize = dataSize - _pointer; - } - else - { - copySize = len; - } - if (copySize) - { - memcpy(buffer, [_data bytes] + _pointer, copySize); - _pointer = _pointer + copySize; - } - else + if (len + _pointer >= dataSize) { + len = dataSize - _pointer; [self _setStatus: NSStreamStatusAtEnd]; } - return copySize; + if (len > 0) + { + memcpy(buffer, [_data bytes] + _pointer, len); + _pointer = _pointer + len; + } + return len; } - (BOOL) getBuffer: (uint8_t **)buffer length: (NSUInteger *)len @@ -823,24 +818,27 @@ static RunLoopEventType typeForStream(NSStream *aStream) format: @"zero byte length write requested"]; } - _events &= ~NSStreamEventHasBytesAvailable; - - if ([self streamStatus] == NSStreamStatusClosed) + if ([self streamStatus] == NSStreamStatusClosed + || [self streamStatus] == NSStreamStatusAtEnd) { return 0; } + /* We have consumed the 'writable' event ... mark that so another can + * be generated. + */ + _events &= ~NSStreamEventHasSpaceAvailable; if ((_pointer + len) > _capacity) { len = _capacity - _pointer; - if (len == 0) - { - [self _setStatus: NSStreamStatusAtEnd]; - return 0; - } + [self _setStatus: NSStreamStatusAtEnd]; + } + + if (len > 0) + { + memcpy((_buffer + _pointer), buffer, len); + _pointer += len; } - memcpy((_buffer + _pointer), buffer, len); - _pointer += len; return len; } @@ -895,13 +893,15 @@ static RunLoopEventType typeForStream(NSStream *aStream) format: @"zero byte length write requested"]; } - _events &= ~NSStreamEventHasBytesAvailable; - if ([self streamStatus] == NSStreamStatusClosed) { return 0; } + /* We have consumed the 'writable' event ... mark that so another can + * be generated. + */ + _events &= ~NSStreamEventHasSpaceAvailable; [_data appendBytes: buffer length: len]; _pointer += len; return len;