oops: still remove address from set tracked if it's not tcp

This commit is contained in:
Eric House 2013-08-05 07:50:11 -07:00
parent 4ad6696ecc
commit 470dbb5304
2 changed files with 22 additions and 21 deletions

View file

@ -419,14 +419,14 @@ CookieRef::removeSocket( const AddrInfo* addr )
{
RWWriteLock rwl( &m_socketsRWLock );
vector<HostRec>::iterator iter;
for ( iter = m_sockets.begin(); !found && iter != m_sockets.end(); ++iter ) {
for ( iter = m_sockets.begin(); !found && iter != m_sockets.end();
++iter ) {
if ( iter->m_addr.equals( *addr ) ) {
if ( iter->m_ackPending ) {
logf( XW_LOGINFO,
"%s: Never got ack; removing hid %d from DB",
__func__, iter->m_hostID );
DBMgr::Get()->RmDeviceByHid( ConnName(),
iter->m_hostID );
DBMgr::Get()->RmDeviceByHid( ConnName(), iter->m_hostID );
m_nPlayersHere -= iter->m_nPlayersH;
cancelAckTimer( iter->m_hostID );
}
@ -831,7 +831,7 @@ CookieRef::send_with_length( const AddrInfo* addr, HostID dest,
failed = true;
}
if ( failed && cascade && addr->isTCP() ) {
if ( failed && cascade ) {
pushRemoveSocketEvent( addr );
XWThreadPool::GetTPool()->CloseSocket( addr );
}

View file

@ -173,26 +173,27 @@ XWThreadPool::RemoveSocket( const AddrInfo* addr )
void
XWThreadPool::CloseSocket( const AddrInfo* addr )
{
assert( addr->isTCP() );
if ( !RemoveSocket( addr ) ) {
MutexLock ml( &m_queueMutex );
deque<QueuePr>::iterator iter = m_queue.begin();
while ( iter != m_queue.end() ) {
if ( iter->m_info.m_addr.equals( *addr ) ) {
m_queue.erase( iter );
break;
if ( addr->isTCP() ) {
if ( !RemoveSocket( addr ) ) {
MutexLock ml( &m_queueMutex );
deque<QueuePr>::iterator iter = m_queue.begin();
while ( iter != m_queue.end() ) {
if ( iter->m_info.m_addr.equals( *addr ) ) {
m_queue.erase( iter );
break;
}
++iter;
}
++iter;
}
}
logf( XW_LOGINFO, "CLOSING socket %d", addr->socket() );
close( addr->socket() );
logf( XW_LOGINFO, "CLOSING socket %d", addr->socket() );
close( addr->socket() );
/* We always need to interrupt the poll because the socket we're closing
will be in the list being listened to. That or we need to drop sockets
that have been removed on some other thread while the poll call's
blocking.*/
interrupt_poll();
/* We always need to interrupt the poll because the socket we're closing
will be in the list being listened to. That or we need to drop sockets
that have been removed on some other thread while the poll call's
blocking.*/
interrupt_poll();
}
}
void