mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-31 16:50:58 +00:00
Multithread fix
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@8110 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
16ec5bfde9
commit
3c717f964c
3 changed files with 18 additions and 5 deletions
|
@ -8,6 +8,9 @@
|
||||||
decoded as the host to which the GSTcpHandle is talking.
|
decoded as the host to which the GSTcpHandle is talking.
|
||||||
Modified in various places to keep a record of the IP address of the
|
Modified in various places to keep a record of the IP address of the
|
||||||
remote end of the connection, so we can pass this to decodePort()
|
remote end of the connection, so we can pass this to decodePort()
|
||||||
|
([-getFds:count:]) fixed error in determining set of file descriptors
|
||||||
|
to listen to - resulted in two threads listening to the same descriptor
|
||||||
|
at the same time!
|
||||||
|
|
||||||
2000-11-13 Richard Frith-Macdonald <rfm@gnu.org>
|
2000-11-13 Richard Frith-Macdonald <rfm@gnu.org>
|
||||||
|
|
||||||
|
|
|
@ -1530,6 +1530,7 @@ static Class tcpPortClass;
|
||||||
NSMapEnumerator me;
|
NSMapEnumerator me;
|
||||||
int sock;
|
int sock;
|
||||||
GSTcpHandle *handle;
|
GSTcpHandle *handle;
|
||||||
|
id recvSelf;
|
||||||
|
|
||||||
DO_LOCK(myLock);
|
DO_LOCK(myLock);
|
||||||
|
|
||||||
|
@ -1542,15 +1543,23 @@ static Class tcpPortClass;
|
||||||
* Put in our listening socket.
|
* Put in our listening socket.
|
||||||
*/
|
*/
|
||||||
*count = 0;
|
*count = 0;
|
||||||
fds[(*count)++] = listener;
|
if (listener >= 0)
|
||||||
|
{
|
||||||
|
fds[(*count)++] = listener;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Enumerate all our socket handles, and put them in.
|
* Enumerate all our socket handles, and put them in as long as they
|
||||||
|
* are to be used for receiving.
|
||||||
*/
|
*/
|
||||||
|
recvSelf = GS_GC_HIDE(self);
|
||||||
me = NSEnumerateMapTable(handles);
|
me = NSEnumerateMapTable(handles);
|
||||||
while (NSNextMapEnumeratorPair(&me, (void*)&sock, (void*)&handle))
|
while (NSNextMapEnumeratorPair(&me, (void*)&sock, (void*)&handle))
|
||||||
{
|
{
|
||||||
fds[(*count)++] = sock;
|
if (handle->recvPort == recvSelf)
|
||||||
|
{
|
||||||
|
fds[(*count)++] = sock;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
DO_UNLOCK(myLock);
|
DO_UNLOCK(myLock);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1648,7 +1648,7 @@ static BOOL multi_threaded = NO;
|
||||||
}
|
}
|
||||||
if (debug_connection > 4)
|
if (debug_connection > 4)
|
||||||
{
|
{
|
||||||
NSLog(@" connection is %x", conn);
|
NSLog(@" connection is %x:%x", conn, [NSThread currentThread]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (conn->_authenticateIn == YES
|
if (conn->_authenticateIn == YES
|
||||||
|
@ -2103,7 +2103,8 @@ static BOOL multi_threaded = NO;
|
||||||
NSDate *timeout_date = nil;
|
NSDate *timeout_date = nil;
|
||||||
|
|
||||||
if (debug_connection > 5)
|
if (debug_connection > 5)
|
||||||
NSLog(@"Waiting for reply sequence %d on %x", sn, self);
|
NSLog(@"Waiting for reply sequence %d on %x:%x",
|
||||||
|
sn, self, [NSThread currentThread]);
|
||||||
M_LOCK(_queueGate);
|
M_LOCK(_queueGate);
|
||||||
while ((node = GSIMapNodeForKey(_replyMap, (GSIMapKey)sn)) != 0
|
while ((node = GSIMapNodeForKey(_replyMap, (GSIMapKey)sn)) != 0
|
||||||
&& node->value.obj == dummyObject)
|
&& node->value.obj == dummyObject)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue