From 856cf11a22bb3f3cf30a3d2d0e6499dd6242067c Mon Sep 17 00:00:00 2001 From: rfm Date: Wed, 9 Aug 2006 17:14:30 +0000 Subject: [PATCH] Tweak socket stream in mingw32 git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@23236 72102866-910b-0410-8b05-ffd578937521 --- Source/GSStream.m | 1 + Source/NSPortMessage.m | 3 +- Source/win32/NSStreamWin32.m | 83 +++++++++++++++++++++++++----------- 3 files changed, 61 insertions(+), 26 deletions(-) diff --git a/Source/GSStream.m b/Source/GSStream.m index 9e9345613..22f73953d 100644 --- a/Source/GSStream.m +++ b/Source/GSStream.m @@ -144,6 +144,7 @@ static RunLoopEventType typeForStream(NSStream *aStream) [_runloop removeStream: self mode: [_modes objectAtIndex: i]]; } } + _unhandledData = NO; [self _setStatus: NSStreamStatusClosed]; } diff --git a/Source/NSPortMessage.m b/Source/NSPortMessage.m index dde97f350..e82a9114d 100644 --- a/Source/NSPortMessage.m +++ b/Source/NSPortMessage.m @@ -18,7 +18,8 @@ You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free - Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. + Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02111 USA. NSPortMessage class reference $Date$ $Revision$ diff --git a/Source/win32/NSStreamWin32.m b/Source/win32/NSStreamWin32.m index b28275d93..9859a0da7 100644 --- a/Source/win32/NSStreamWin32.m +++ b/Source/win32/NSStreamWin32.m @@ -253,7 +253,7 @@ static void setNonblocking(SOCKET fd) - (void) close { - if (_loopID != INVALID_HANDLE_VALUE) + if (_loopID != (void*)INVALID_HANDLE_VALUE) { if (CloseHandle((HANDLE)_loopID) == 0) { @@ -709,16 +709,17 @@ static void setNonblocking(SOCKET fd) - (void) close { // read shutdown is ignored, because the other side may shutdown first. - if (_sibling && [_sibling streamStatus]!=NSStreamStatusClosed) - shutdown(_sock, SD_RECEIVE); + if (_sibling && [_sibling streamStatus] != NSStreamStatusClosed) + { + shutdown(_sock, SD_RECEIVE); + } else { WSACloseEvent(_loopID); closesocket(_sock); } - // safety against double close - _loopID = WSA_INVALID_EVENT; [super close]; + _loopID = WSA_INVALID_EVENT; } - (int) read: (uint8_t *)buffer maxLength: (unsigned int)len @@ -738,6 +739,7 @@ static void setNonblocking(SOCKET fd) { [self _recordError]; } + readLen = -1; } else if (readLen == 0) { @@ -784,7 +786,7 @@ static void setNonblocking(SOCKET fd) { error = WSAGetLastError(); } -else NSLog(@"EVENTS:%x", events.lNetworkEvents); +else NSLog(@"EVENTS 0x%x", events.lNetworkEvents); if ([self streamStatus] == NSStreamStatusOpening) { @@ -830,18 +832,26 @@ else NSLog(@"EVENTS:%x", events.lNetworkEvents); if (events.lNetworkEvents & FD_WRITE) { [_sibling _setStatus: NSStreamStatusOpen]; - [_sibling _sendEvent: NSStreamEventHasSpaceAvailable]; + while ([_sibling hasSpaceAvailable] + && [_sibling _unhandledData] == NO) + { + [_sibling _sendEvent: NSStreamEventHasSpaceAvailable]; + } } if (events.lNetworkEvents & FD_READ) { [self _setStatus: NSStreamStatusOpen]; - [self _sendEvent: NSStreamEventHasBytesAvailable]; + while ([self hasBytesAvailable] + && _unhandledData == NO) + { + [self _sendEvent: NSStreamEventHasBytesAvailable]; + } } if (events.lNetworkEvents & FD_CLOSE) { [_sibling _setStatus: NSStreamStatusAtEnd]; [_sibling _sendEvent: NSStreamEventEndEncountered]; - while ([self streamStatus] == NSStreamStatusOpen + while ([self hasBytesAvailable] && _unhandledData == NO) { [self _sendEvent: NSStreamEventHasBytesAvailable]; @@ -888,7 +898,7 @@ else NSLog(@"EVENTS:%x", events.lNetworkEvents); - (void) close { - if (_loopID != INVALID_HANDLE_VALUE) + if (_loopID != (void*)INVALID_HANDLE_VALUE) { if (CloseHandle((HANDLE)_loopID) == 0) { @@ -1252,12 +1262,19 @@ else NSLog(@"EVENTS:%x", events.lNetworkEvents); { errno = WSAGetLastError(); if (errno == WSAEINPROGRESS || errno == WSAEWOULDBLOCK) - [self _setStatus: NSStreamStatusWriting]; + { + [self _setStatus: NSStreamStatusWriting]; + } else if (errno != WSAEINTR) - [self _recordError]; + { + [self _recordError]; + } + writeLen = -1; } else - [self _setStatus: NSStreamStatusOpen]; + { + [self _setStatus: NSStreamStatusOpen]; + } return writeLen; } @@ -1317,18 +1334,22 @@ else NSLog(@"EVENTS:%x", events.lNetworkEvents); { // shutdown may fail (broken pipe). Record it. int closeReturn; - if (_sibling && [_sibling streamStatus]!=NSStreamStatusClosed) - closeReturn = shutdown(_sock, SD_SEND); + + if (_sibling && [_sibling streamStatus] != NSStreamStatusClosed) + { + closeReturn = shutdown(_sock, SD_SEND); + } else { WSACloseEvent(_loopID); closeReturn = closesocket(_sock); } if (closeReturn < 0) - [self _recordError]; - // safety against double close - _loopID = WSA_INVALID_EVENT; + { + [self _recordError]; + } [super close]; + _loopID = WSA_INVALID_EVENT; } - (void) _dispatch @@ -1353,7 +1374,7 @@ else NSLog(@"EVENTS:%x", events.lNetworkEvents); { error = WSAGetLastError(); } -else NSLog(@"EVENTS:%x", events.lNetworkEvents); +else NSLog(@"EVENTS 0x%x", events.lNetworkEvents); if ([self streamStatus] == NSStreamStatusOpening) { @@ -1401,18 +1422,26 @@ else NSLog(@"EVENTS:%x", events.lNetworkEvents); if (events.lNetworkEvents & FD_WRITE) { [self _setStatus: NSStreamStatusOpen]; - [self _sendEvent: NSStreamEventHasSpaceAvailable]; + while ([self hasSpaceAvailable] + && _unhandledData == NO) + { + [self _sendEvent: NSStreamEventHasSpaceAvailable]; + } } if (events.lNetworkEvents & FD_READ) { [_sibling _setStatus: NSStreamStatusOpen]; - [_sibling _sendEvent: NSStreamEventHasBytesAvailable]; + while ([_sibling hasBytesAvailable] + && [_sibling _unhandledData] == NO) + { + [_sibling _sendEvent: NSStreamEventHasBytesAvailable]; + } } if (events.lNetworkEvents & FD_CLOSE) { [self _setStatus: NSStreamStatusAtEnd]; [self _sendEvent: NSStreamEventEndEncountered]; - while ([_sibling streamStatus] == NSStreamStatusOpen + while ([_sibling hasBytesAvailable] && [_sibling _unhandledData] == NO) { [_sibling _sendEvent: NSStreamEventHasBytesAvailable]; @@ -1744,13 +1773,15 @@ else NSLog(@"EVENTS:%x", events.lNetworkEvents); s = [[GSInetServerStream alloc] initToAddr: addr port: port]; return AUTORELEASE(s); - return nil; } + (id) serverStreamToAddr: (NSString*)addr { + GSServerStream *s; + [self notImplemented: _cmd]; - return nil; +// s = [[GSLocalServerStream alloc] initToAddr: addr]; + return AUTORELEASE(s); } - (id) initToAddr: (NSString*)addr port: (int)port @@ -1762,8 +1793,9 @@ else NSLog(@"EVENTS:%x", events.lNetworkEvents); - (id) initToAddr: (NSString*)addr { - RELEASE(self); [self notImplemented: _cmd]; + RELEASE(self); +// self = [[GSLocalServerStream alloc] initToAddr: addr]; return nil; } @@ -1838,6 +1870,7 @@ else NSLog(@"EVENTS:%x", events.lNetworkEvents); // close a server socket is safe closesocket(_sock); [super close]; + _loopID = WSA_INVALID_EVENT; } - (void) acceptWithInputStream: (NSInputStream **)inputStream