Tweak socket stream in mingw32

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@23236 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
rfm 2006-08-09 17:14:30 +00:00
parent 739a481013
commit 856cf11a22
3 changed files with 61 additions and 26 deletions

View file

@ -144,6 +144,7 @@ static RunLoopEventType typeForStream(NSStream *aStream)
[_runloop removeStream: self mode: [_modes objectAtIndex: i]]; [_runloop removeStream: self mode: [_modes objectAtIndex: i]];
} }
} }
_unhandledData = NO;
[self _setStatus: NSStreamStatusClosed]; [self _setStatus: NSStreamStatusClosed];
} }

View file

@ -18,7 +18,8 @@
You should have received a copy of the GNU Library General Public You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free 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.
<title>NSPortMessage class reference</title> <title>NSPortMessage class reference</title>
$Date$ $Revision$ $Date$ $Revision$

View file

@ -253,7 +253,7 @@ static void setNonblocking(SOCKET fd)
- (void) close - (void) close
{ {
if (_loopID != INVALID_HANDLE_VALUE) if (_loopID != (void*)INVALID_HANDLE_VALUE)
{ {
if (CloseHandle((HANDLE)_loopID) == 0) if (CloseHandle((HANDLE)_loopID) == 0)
{ {
@ -709,16 +709,17 @@ static void setNonblocking(SOCKET fd)
- (void) close - (void) close
{ {
// read shutdown is ignored, because the other side may shutdown first. // read shutdown is ignored, because the other side may shutdown first.
if (_sibling && [_sibling streamStatus]!=NSStreamStatusClosed) if (_sibling && [_sibling streamStatus] != NSStreamStatusClosed)
shutdown(_sock, SD_RECEIVE); {
shutdown(_sock, SD_RECEIVE);
}
else else
{ {
WSACloseEvent(_loopID); WSACloseEvent(_loopID);
closesocket(_sock); closesocket(_sock);
} }
// safety against double close
_loopID = WSA_INVALID_EVENT;
[super close]; [super close];
_loopID = WSA_INVALID_EVENT;
} }
- (int) read: (uint8_t *)buffer maxLength: (unsigned int)len - (int) read: (uint8_t *)buffer maxLength: (unsigned int)len
@ -738,6 +739,7 @@ static void setNonblocking(SOCKET fd)
{ {
[self _recordError]; [self _recordError];
} }
readLen = -1;
} }
else if (readLen == 0) else if (readLen == 0)
{ {
@ -784,7 +786,7 @@ static void setNonblocking(SOCKET fd)
{ {
error = WSAGetLastError(); error = WSAGetLastError();
} }
else NSLog(@"EVENTS:%x", events.lNetworkEvents); else NSLog(@"EVENTS 0x%x", events.lNetworkEvents);
if ([self streamStatus] == NSStreamStatusOpening) if ([self streamStatus] == NSStreamStatusOpening)
{ {
@ -830,18 +832,26 @@ else NSLog(@"EVENTS:%x", events.lNetworkEvents);
if (events.lNetworkEvents & FD_WRITE) if (events.lNetworkEvents & FD_WRITE)
{ {
[_sibling _setStatus: NSStreamStatusOpen]; [_sibling _setStatus: NSStreamStatusOpen];
[_sibling _sendEvent: NSStreamEventHasSpaceAvailable]; while ([_sibling hasSpaceAvailable]
&& [_sibling _unhandledData] == NO)
{
[_sibling _sendEvent: NSStreamEventHasSpaceAvailable];
}
} }
if (events.lNetworkEvents & FD_READ) if (events.lNetworkEvents & FD_READ)
{ {
[self _setStatus: NSStreamStatusOpen]; [self _setStatus: NSStreamStatusOpen];
[self _sendEvent: NSStreamEventHasBytesAvailable]; while ([self hasBytesAvailable]
&& _unhandledData == NO)
{
[self _sendEvent: NSStreamEventHasBytesAvailable];
}
} }
if (events.lNetworkEvents & FD_CLOSE) if (events.lNetworkEvents & FD_CLOSE)
{ {
[_sibling _setStatus: NSStreamStatusAtEnd]; [_sibling _setStatus: NSStreamStatusAtEnd];
[_sibling _sendEvent: NSStreamEventEndEncountered]; [_sibling _sendEvent: NSStreamEventEndEncountered];
while ([self streamStatus] == NSStreamStatusOpen while ([self hasBytesAvailable]
&& _unhandledData == NO) && _unhandledData == NO)
{ {
[self _sendEvent: NSStreamEventHasBytesAvailable]; [self _sendEvent: NSStreamEventHasBytesAvailable];
@ -888,7 +898,7 @@ else NSLog(@"EVENTS:%x", events.lNetworkEvents);
- (void) close - (void) close
{ {
if (_loopID != INVALID_HANDLE_VALUE) if (_loopID != (void*)INVALID_HANDLE_VALUE)
{ {
if (CloseHandle((HANDLE)_loopID) == 0) if (CloseHandle((HANDLE)_loopID) == 0)
{ {
@ -1252,12 +1262,19 @@ else NSLog(@"EVENTS:%x", events.lNetworkEvents);
{ {
errno = WSAGetLastError(); errno = WSAGetLastError();
if (errno == WSAEINPROGRESS || errno == WSAEWOULDBLOCK) if (errno == WSAEINPROGRESS || errno == WSAEWOULDBLOCK)
[self _setStatus: NSStreamStatusWriting]; {
[self _setStatus: NSStreamStatusWriting];
}
else if (errno != WSAEINTR) else if (errno != WSAEINTR)
[self _recordError]; {
[self _recordError];
}
writeLen = -1;
} }
else else
[self _setStatus: NSStreamStatusOpen]; {
[self _setStatus: NSStreamStatusOpen];
}
return writeLen; return writeLen;
} }
@ -1317,18 +1334,22 @@ else NSLog(@"EVENTS:%x", events.lNetworkEvents);
{ {
// shutdown may fail (broken pipe). Record it. // shutdown may fail (broken pipe). Record it.
int closeReturn; int closeReturn;
if (_sibling && [_sibling streamStatus]!=NSStreamStatusClosed)
closeReturn = shutdown(_sock, SD_SEND); if (_sibling && [_sibling streamStatus] != NSStreamStatusClosed)
{
closeReturn = shutdown(_sock, SD_SEND);
}
else else
{ {
WSACloseEvent(_loopID); WSACloseEvent(_loopID);
closeReturn = closesocket(_sock); closeReturn = closesocket(_sock);
} }
if (closeReturn < 0) if (closeReturn < 0)
[self _recordError]; {
// safety against double close [self _recordError];
_loopID = WSA_INVALID_EVENT; }
[super close]; [super close];
_loopID = WSA_INVALID_EVENT;
} }
- (void) _dispatch - (void) _dispatch
@ -1353,7 +1374,7 @@ else NSLog(@"EVENTS:%x", events.lNetworkEvents);
{ {
error = WSAGetLastError(); error = WSAGetLastError();
} }
else NSLog(@"EVENTS:%x", events.lNetworkEvents); else NSLog(@"EVENTS 0x%x", events.lNetworkEvents);
if ([self streamStatus] == NSStreamStatusOpening) if ([self streamStatus] == NSStreamStatusOpening)
{ {
@ -1401,18 +1422,26 @@ else NSLog(@"EVENTS:%x", events.lNetworkEvents);
if (events.lNetworkEvents & FD_WRITE) if (events.lNetworkEvents & FD_WRITE)
{ {
[self _setStatus: NSStreamStatusOpen]; [self _setStatus: NSStreamStatusOpen];
[self _sendEvent: NSStreamEventHasSpaceAvailable]; while ([self hasSpaceAvailable]
&& _unhandledData == NO)
{
[self _sendEvent: NSStreamEventHasSpaceAvailable];
}
} }
if (events.lNetworkEvents & FD_READ) if (events.lNetworkEvents & FD_READ)
{ {
[_sibling _setStatus: NSStreamStatusOpen]; [_sibling _setStatus: NSStreamStatusOpen];
[_sibling _sendEvent: NSStreamEventHasBytesAvailable]; while ([_sibling hasBytesAvailable]
&& [_sibling _unhandledData] == NO)
{
[_sibling _sendEvent: NSStreamEventHasBytesAvailable];
}
} }
if (events.lNetworkEvents & FD_CLOSE) if (events.lNetworkEvents & FD_CLOSE)
{ {
[self _setStatus: NSStreamStatusAtEnd]; [self _setStatus: NSStreamStatusAtEnd];
[self _sendEvent: NSStreamEventEndEncountered]; [self _sendEvent: NSStreamEventEndEncountered];
while ([_sibling streamStatus] == NSStreamStatusOpen while ([_sibling hasBytesAvailable]
&& [_sibling _unhandledData] == NO) && [_sibling _unhandledData] == NO)
{ {
[_sibling _sendEvent: NSStreamEventHasBytesAvailable]; [_sibling _sendEvent: NSStreamEventHasBytesAvailable];
@ -1744,13 +1773,15 @@ else NSLog(@"EVENTS:%x", events.lNetworkEvents);
s = [[GSInetServerStream alloc] initToAddr: addr port: port]; s = [[GSInetServerStream alloc] initToAddr: addr port: port];
return AUTORELEASE(s); return AUTORELEASE(s);
return nil;
} }
+ (id) serverStreamToAddr: (NSString*)addr + (id) serverStreamToAddr: (NSString*)addr
{ {
GSServerStream *s;
[self notImplemented: _cmd]; [self notImplemented: _cmd];
return nil; // s = [[GSLocalServerStream alloc] initToAddr: addr];
return AUTORELEASE(s);
} }
- (id) initToAddr: (NSString*)addr port: (int)port - (id) initToAddr: (NSString*)addr port: (int)port
@ -1762,8 +1793,9 @@ else NSLog(@"EVENTS:%x", events.lNetworkEvents);
- (id) initToAddr: (NSString*)addr - (id) initToAddr: (NSString*)addr
{ {
RELEASE(self);
[self notImplemented: _cmd]; [self notImplemented: _cmd];
RELEASE(self);
// self = [[GSLocalServerStream alloc] initToAddr: addr];
return nil; return nil;
} }
@ -1838,6 +1870,7 @@ else NSLog(@"EVENTS:%x", events.lNetworkEvents);
// close a server socket is safe // close a server socket is safe
closesocket(_sock); closesocket(_sock);
[super close]; [super close];
_loopID = WSA_INVALID_EVENT;
} }
- (void) acceptWithInputStream: (NSInputStream **)inputStream - (void) acceptWithInputStream: (NSInputStream **)inputStream